CloudfrontのOAC を利用した Lambdaの 関数URL実行を試してみた
2024年4月11日、CloudFrontの OAC (Origin Access Contorol)が、 Lambdaの関数URLの実行をサポートするアップデートがありました。
Amazon CloudFront now supports Origin Access Control (OAC) for Lambda function URL origins
今回、 OAC 設定した CloudFrontと、 OAC 設定を実施した CloudFront経由の実行のみを許可した Lambdaの関数URLを用意。
関数URLの直接実行は拒否しつつ、CloudFront経由のアクセスのみが可能な Lambda関数の利用について確認する機会がありましたので、紹介させて頂きます。
Lambda関数作成
検証用のLambda関数、新規に作成しました。
コード
コードはPython。
Lambda関数に渡されるEvent情報をJSON形式で出力するものとしました。
import json def lambda_handler(event, context): return { 'statusCode': 200, 'body': json.dumps(event, indent=4) }
関数URL
作成したLambda関数の 「設定画面」→「関数URL」より、認証タイプ「AWS_IAM」 を指定して、関数URLを有効化しました。
有効化した関数URLのパス、次のCloudFront設定で利用するため控えました。
CloudFront
ディストリビューション作成
動作確認用のCloudFront ディストリビューションを新規作成しました。
- オリジンはカスタムドメイン、先に作成した関数URLを指定しました。
xxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws
オリジン設定変更
作成したディストリビューションの「オリジン」設定画面を利用して、OAC設定を行いました。
新規OACを作成しました。
作成した OACを、 Origin access control として選択。
案内されるCLIコマンド次の作業で利用するため控えた後、「設定を保存」しました。
Lambda設定(2)
CLI実行
コピーした CLIコマンド、function-name に 関数URLを実行する Lambdaの関数名として、CloudShellで実行しました。
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipal" \ --action "lambda:InvokeFunctionUrl" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::<アカウント>:distribution/<ID>" \ --function-name <Lambda関数名>
- source-arn は、 CloudFrontのARN
- function-name は、 関数URLを設定した Lambda名称に置き換えます
アクセス権限確認
CLIコマンドを利用して「add-permission」した結果、Lambda関数の 「アクセス権限」→「リソースベースのポリシーステートメント」で確認可能です。
- ポリシーの表示
{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "lambda:InvokeFunctionUrl", "Resource": "arn:aws:lambda:ap-northeast-1:<アカウントID>:function:<関数名>", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:cloudfront::<アカウントID>:distribution/<distribution ID>" } } } ] }
動作確認
OAC を設定した CloudFrontの URL (`https://****.cloudfront.net/`) で、Lambda関数を実行できました。
Lambda 関数URL (`https://****.lambda-url.ap-northeast-1.on.aws/` ) 直アクセスでは、正しくアクセス拒否される事を確認できました。
{"Message":"Forbidden"}
まとめ
これまでも Lambdaの関数URLで、IAM認証で利用する事は可能でしたが、 その利用には SigV4(AWS Signature Version 4) 署名が必須。署名の発行や、サポートする実行環境を必要とする課題がありました。
関数URLの認証として「None」で設定した場合には、Lambda関数URLを知り得た第三者により、Lambdaが実行されてしまう可能性があるため、Lambda関数自身で認証の仕組みを実装する必要がありました。
今回のアップデートで、 Lambdaにより、CloudFrontのプライベートコンテンツの提供機能、 CloudFrontで発行した署名付きURL や、 AWS WAFによる 関数URLの保護も可能になりました。
Lambda で提供するAPI、 IAM以外の認証や、 AWS WAFによる保護のため、API Gatewayを採用されていた ワークロードでは、 シンプルな利用が実現できる可能性がある 今回のアップデートをお試し下さい。