AWS経験5年以上の僕が、Lambda 関数URLの概要と、すぐに実行できる手順をご説明します。
本記事の内容
- Lambda 関数URL (Lambda Function URLs) の概要
- マネジメントコンソールでLambda 関数URLを設定する
- 設定した関数URLにWebブラウザとCloudShellからアクセスする
- 作成したLambda関数を削除する
もくじ
Lambda 関数URL (Lambda Function URLs) とは
Lambda 関数URLのサービス概要と、API Gateway+Lambdaの構成との比較を説明します。
Lambda 関数URLのサービス概要
Lambda 関数URLのサービス概要は以下のとおりです。
- Lambda関数にURL(HTTPSエンドポイント)を設定する
- そのURLにHTTPSでアクセスすることで、かんたんにLambdaを実行できる
- URLをパブリックに公開する設定以外に、IAM認証やCORS設定も可能
- Lambda 関数URL自体は無料(従来のLambda実行料金のみ)
API Gateway + Lambdaの構成よりシンプル
これまで、HTTPS経由でLambdaを実行するためには、前段にAPI Gatewayなどが必要でした。
Lambda 関数URLを使用することで、API GatewayなしでHTTPSから直接Lambdaを実行できます。
Lambdaをパブリックに公開したり、シンプルな認証でも問題ない場合は、Lambda 関数URLは便利ですね。
Lambda 関数URL 設定の準備
マネジメントコンソールを操作するIAMユーザーのIAMポリシーは、テスト目的のためAdministratorAccess
が付与されているものとします。
今回はテスト用のLambda関数を作成し、関数URLを設定するだけなので、他のリソース準備は必要ありません。
Lambda 関数URLの設定手順
以下の手順でLambda 関数URLを設定していきます。
- Lambda関数作成と関数URL設定
- 関数URLを確認
- Webブラウザからアクセス
- CloudShellからcurlコマンドでアクセス
- Lambda関数を削除する
Lambda関数作成と関数URL設定
マネジメントコンソールにログインし、Lambdaの画面から [関数] -> [関数の作成]をクリックします。
関数は以下のとおり設定します。(記載していないものはデフォルトのまま)
- 関数名: 任意(手順では [test-url] とする)
- ランタイム: Python3.9
次に、画面下の[詳細設定] をクリックし、[関数 URL を有効化] にチェックを入れます。
[認証タイプ] は以下がありますが、今回は簡単にLambdaを実行したいので [NONE] を選択し、[関数の作成] をクリックします。
- AWS_IAM: 関数URLにIAM認証を設定する
- NONE: 関数URLにIAM認証を設定しない(Lambda関数に認証ロジックを実装しない限り、パブリックに公開される)
[オリジン間リソース共有 (CORS) を設定] について
- チェックを入れて有効にすると、S3などに格納したJavaScriptファイルから関数URLにアクセスできる
- デフォルトは無効なので、JavaScriptから関数URLにアクセスするとCORSエラーとなりLambdaを実行できない
参考:既存のLambdaに関数URLを設定する方法
対象のLambda -> [設定] -> [関数 URL] -> [関数 URL を作成] から [認証タイプ] を選択し、[保存] をクリックする。
関数URLを確認
関数URLは、マネジメントコンソールの以下2箇所から確認できます。
①[関数の概要] -> [関数 URL]
②[設定] -> [関数 URL] -> [関数 URL]
参考:関数URLはリソースベースのポリシーが設定される
- 関数URLを設定すると、Lambdaにリソースベースポリシーが自動設定される
- これにより、関数URLからLambdaを実行できるようになる
- ポリシーは、対象のLambda -> [設定] -> [アクセス権限] -> [リソースベースのポリシー] から確認できる
- 以下は本手順で設定されたリソースベースのポリシー
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "FunctionURLAllowPublicAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:test-url",
"Condition": {
"StringEquals": {
"lambda:FunctionUrlAuthType": "NONE"
}
}
}
]
}
Webブラウザからアクセス
Webブラウザから関数URLにアクセスしてみます。
https://xxxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/
["Hello from Lambda!"] が返ってくれば、Webブラウザから関数URLを経由してLambdaを実行できたことになります。
CloudShellからcurlコマンドでアクセス
次に、CloudShellからLambdaを実行してみます。
マネジメントコンソールからCloudShellを起動します。
CloudShellが起動したらcurlコマンド
で関数URLを指定、Lambdaを実行してみます。
["Hello from Lambda!"] が返ってきたので、CloudShellからも関数URLを経由してLambdaを実行できました。
$ curl https://xxxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/
"Hello from Lambda!"
Lambda関数を削除する
今回は認証タイプ[NONE] で関数URLを設定したので、パブリックに公開されたままです。
このままだと、仮にURLが分かると誰でもLambdaが実行できてしまいます。
不正にLambdaを実行されると困るので、作成したLambdaは削除しておきましょう。
Lambda関数の画面右上にある [アクション] -> [関数の削除] をクリック。
[削除] をクリックすると、Lambdaが削除されます。
参考:Lambda作成時 / 実行時に自動作成されるリソースはLambdaを削除しても残る
Lambdaをマネジメントコンソールから新規作成すると、自動的にIAMポリシーとIAMロールが作成され、Lambdaに設定されます。
また、Lambdaを実行するとCloudWatch Logsロググループも自動的に作成されてログが保存されます。
マネジメントコンソールからLambdaを削除しても上記のリソースは残るので、一緒に削除することをおすすめします。
各リソース名は以下のとおりです。
- IAMロール: <Lambda関数名>-xxxxxx(Lambda削除前であれば、対象のLambda -> [設定] -> [アクセス権限] -> [実行ロール] から確認できる)
- IAMポリシー: 上記のロールにアタッチされているポリシー
- CloudWatch Logsロググループ: /aws/lambda/<Lambda関数名>
まとめ
Lambdaの関数URLを設定し、かんたんにアクセスする方法を紹介しました。
API Gatewayを使用せず、HTTPS経由で手軽にLambdaを実行できるようになったのは素晴らしい機能アップデート!
Lambdaをパブリックに公開したり、シンプルな認証でも問題ない場合は、Lambda 関数URLは積極的に活用できそうですね。