CloudfrontのOAC を利用した Lambdaの 関数URL実行を試してみた

Cloudfront OAC が Lambda関数URLをサポート。 オリジンのLambda関数URLが第三者により直接実行される事を簡単に回避できるようになりました。
2024.04.12

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

有効化した関数URLのパス、次のCloudFront設定で利用するため控えました。

関数URL画面

CloudFront

ディストリビューション作成

動作確認用のCloudFront ディストリビューションを新規作成しました。

CloudFront作成

  • オリジンはカスタムドメイン、先に作成した関数URLを指定しました。
xxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws

オリジン設定変更

作成したディストリビューションの「オリジン」設定画面を利用して、OAC設定を行いました。

オリジンを編集1

新規OACを作成しました。

OAC作成

作成した OACを、 Origin access control として選択。

オリジン変更を保存

案内されるCLIコマンド次の作業で利用するため控えた後、「設定を保存」しました。

Lambda設定(2)

CLI実行

コピーした CLIコマンド、function-name に 関数URLを実行する Lambdaの関数名として、CloudShellで実行しました。

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関数を実行できました。

CloudFront経由

Lambda 関数URL (`https://****.lambda-url.ap-northeast-1.on.aws/` ) 直アクセスでは、正しくアクセス拒否される事を確認できました。

{"Message":"Forbidden"}

関数URL直

まとめ

これまでも 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を採用されていた ワークロードでは、 シンプルな利用が実現できる可能性がある 今回のアップデートをお試し下さい。