-
Lambda の関数URLを使ってみた
- 2022年5月31日
- AWS
みなさん、AWS してますか。
今回は、AWS Lambda にリリースされた関数URL を使ってみたということで、早速見ていきましょう!
関数URLとは
AWS Lambda デベロッパーガイドによると、Lambda 関数に対してユニークなURLを自動的に作成して簡単に公開できるようにする機能のようです。
Lambda function URLs
AWS Lambda デベロッパーガイド – Lambda 関数URL
A function URL is a dedicated HTTP(S) endpoint for your Lambda function. You can create and configure a function URL through the Lambda console or the Lambda API. When you create a function URL, Lambda automatically generates a unique URL endpoint for you.
リリース
2022/04/06のリリースから利用できるようになっているとのことです。
追加のコストが掛からないのは嬉しいポイントですね!
(参照:AWS Lambda 関数 URL: Lambda 関数用の組み込み HTTPS エンドポイント)
今回作成する環境
今回は AWS マネジメントコンソールを使って下図のような構成で作成してみます。
Lambda が VPC に接続するようになっているのは、私がこの構成を使うことが多いからです。VPC に接続しなくとも関数URLは使用できます。
![](https://solutionware.jp/wp-content/uploads/2022/05/FxURLsExample.drawio.png)
Lambda の作成
Lambda コンソールで Lambda 関数を作成します。
今回は簡単のために関数ブループリント(設計図)から作成してみます。下図のように設定していきます。
![](https://solutionware.jp/wp-content/uploads/2022/05/f736e8709cadb282cf76fef862780fc9.png)
![](https://solutionware.jp/wp-content/uploads/2022/05/0af080d525ff8f7b0bedce6ef5b8e144.png)
![](https://solutionware.jp/wp-content/uploads/2022/05/d71a5193020765fcb8621322997ac81e.png)
![](https://solutionware.jp/wp-content/uploads/2022/05/3e5a8f535129ccff73a4a029e6f76dbc.png)
![](https://solutionware.jp/wp-content/uploads/2022/05/51f94283a8d2249004ae0aee1fdffd2e.png)
動作確認
関数ブループリントを使用して作成した Lambda 関数に対して関数URLを使用してアクセスすると、次のようなWelcome ページが表示されます。
![](https://solutionware.jp/wp-content/uploads/2022/05/ba2ce3fdd9a12272b97c032161d636f9-1024x501.png)
![](https://solutionware.jp/wp-content/uploads/2022/05/a4cbbbbd0ce678d6615eb64c05f50ab5.png)
今回のコードは Webページを返しているだけのシンプルなものですが、関数URL を設定するだけで Lambda を公開することができました。
他にもっと実務寄りのユースケースを考えてみると、たとえば Lambda を WebAPI として公開したいようなシーンがあると思います。この場合、これまでは API Gateway を使用する必要がありましたが、Lambda を関数URLで公開してしまえば、(要件によっては)API Gateway が不要になることも考えられそうです。
Lambda 関数への event の入力仕様について
ここまでで、関数URLを使用することで非常に手軽に Lambda を公開できることがわかりましたが、ユーザがアクセスしてきた各種情報(クエリパラメータなど)はどのように引き渡されるのでしょうか?
今回のコードにログ出力コードを書き加えてログを確認してみましょう。
exports.handler = async (event) => {
// ログ出力を追記
console.log(`event: ${JSON.stringify(event)}`);
const response = {
statusCode: 200,
headers: {
'Content-Type': 'text/html',
},
body: html,
};
return response;
};
この変更したコードをデプロイして再度、関数URLで設定したURLにアクセスしてみると、次のような出力が得られます。
![](https://solutionware.jp/wp-content/uploads/2022/05/lambda_event_dump.png)
デベロッパーガイドによると、リクエストとレスポンスのペイロードはAmazon API Gateway payload format version 2.0 に準拠するようです。ログで出力した内容でも確認できます。
Request and response payloads
Amazon Lambda Developer Guide – Invoking Lambda function URLs
When a client calls your function URL, Lambda maps the request to an event object before passing it to your function. Your function’s response is then mapped to an HTTP response that Lambda sends back to the client through the function URL.
The request and response event formats follow the same schema as the Amazon API Gateway payload format version 2.0.
関数URL vs API Gateway
今回使ってみた関数URLによる Lambda 関数の公開は API Gateway を使用することでも実現可能です。
そこで、両者について公式ドキュメントから拾える情報を元に簡単に比較をしてみました。
項目 | Lambda 関数URL | API Gateway |
構築の手軽さ | 関数URLの設定だけでOK | 実装に合わせて複数の設定や手順の実行が必要 |
認証 | ・IAM ・Lambda で実装 | ・IAM ・Cognito ・APIキー ・リソースポリシー ・VPCエンドポイントポリシー ・タグ ・JWTオーソライザー ・Lambda で実装 |
タイムアウト | 最大15分 | 最大29秒 |
スロットリング | ・同時実行数 | ・使用量プラン ・ステージ ・アカウントレベル |
関数URLはAPI Gatewayと比べて手軽ですが、複雑なことはやりづらいと言えそうです。
考察
- 関数URLは本当に手軽に Lambda 関数を公開できることがわかりました。
API Gateway を立てるまでもないようなケースや、開発中の実験などの用途ではとても有用だと思います。 - 関数URLのタイムアウトは Lambda 関数の設定に準じるため、最大15分となります。
API Gateway ではタイムアウトしてしまうようなケースを乗り越えるための新たな手段として、関数URLを活用できる可能性を感じます。 - 関数URL の認証機能のサポートが弱いため、本番運用に乗せる場合は要件に合わせて検討が必要になりそうです。ただし、関数URLの機能で込み入った認証機能を実装するのであれば、API Gateway を立てるという選択も出てくるかと思います。
まとめ
これまで私自身も「作成した Lambda をさくっと公開/非公開にしたい」というシーンに何度か遭遇していますが、その度に「API Gateway 立てると手間がかかるんだよな…」となって諦めたりしていました。
関数URLの登場によって、こういったシーンでも諦めることなく前進することができそうです。
ありがとう、AWS…!
おわりに
株式会社ソリューションウェアでは、AWSを活用したシステム開発を始め、幅広くお客様のビジネスをお手伝いさせていただいております。
お困りのことがございましたら、お気軽にこちらまでお問合せください。
この記事を書いた人 : 堀之内聖二
AWS bluebird css CSV docker docker compose electron ES6 es2015 Git Heroku ITコンサルティング JavaScript justinmind less mongoDB Node.js php PostgreSQL Private Space Promise react-router react.js reactjs Salesforce scss Selenium Builder selenium IDE Selenium WebDriver Slack stylus TypeScript VirtualBox VisualStudioCode vue vuejs webpack システム開発プロジェクト ワイヤーフレーム 上流工程 卒FIT 帳票 要件定義 設計 電力小売業界