カテゴリー別アーカイブ: 堀之内聖二

Lambda の関数URLを使ってみた

みなさん、AWS してますか。
今回は、AWS Lambda にリリースされた関数URL を使ってみたということで、早速見ていきましょう!

関数URLとは

AWS Lambda デベロッパーガイドによると、Lambda 関数に対してユニークなURLを自動的に作成して簡単に公開できるようにする機能のようです。

Lambda function URLs
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.

AWS Lambda デベロッパーガイド – Lambda 関数URL

リリース

2022/04/06のリリースから利用できるようになっているとのことです。
追加のコストが掛からないのは嬉しいポイントですね!
(参照:AWS Lambda 関数 URL: Lambda 関数用の組み込み HTTPS エンドポイント

今回作成する環境

今回は AWS マネジメントコンソールを使って下図のような構成で作成してみます。
Lambda が VPC に接続するようになっているのは、私がこの構成を使うことが多いからです。VPC に接続しなくとも関数URLは使用できます。

VPCに接続したLambdaをパブリックサブネットに配置する

Lambda の作成

Lambda コンソールで Lambda 関数を作成します。
今回は簡単のために関数ブループリント(設計図)から作成してみます。下図のように設定していきます。

※新しいロールを作成する場合、サインインしているユーザーにロールを作成する権限が必要です
※今回は VPC に接続するので設定します。

動作確認

関数ブループリントを使用して作成した Lambda 関数に対して関数URLを使用してアクセスすると、次のようなWelcome ページが表示されます。

作成されたユニークなURLは関数の概要ページに表示される他、[設定] > [関数URL] ページでも確認できます。
Welcome ページが表示されました!
今回のコードは 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にアクセスしてみると、次のような出力が得られます。

eventの中身をログに出力したもの

デベロッパーガイドによると、リクエストとレスポンスのペイロードはAmazon API Gateway payload format version 2.0 に準拠するようです。ログで出力した内容でも確認できます。

Request and response payloads
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.

Amazon Lambda Developer Guide – Invoking Lambda function URLs

関数URL vs API Gateway

今回使ってみた関数URLによる Lambda 関数の公開は API Gateway を使用することでも実現可能です。
そこで、両者について公式ドキュメントから拾える情報を元に簡単に比較をしてみました。

項目Lambda 関数URLAPI 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を活用したシステム開発を始め、幅広くお客様のビジネスをお手伝いさせていただいております。
お困りのことがございましたら、お気軽にこちらまでお問合せください。