Lambda@Edge 用の IAM アクセス許可とロールのセットアップ - Amazon CloudFront

Lambda@Edge 用の IAM アクセス許可とロールのセットアップ

Lambda@Edge を設定するには、AWS Lambda に対する以下の IAM アクセス許可およびロールが必要です。

  • IAM アクセス許可 – これらのアクセス許可により、Lambda 関数を作成して CloudFront ディストリビューションに関連付けることができます。

  • Lambda 関数実行ロール (IAM ロール) – Lambda サービスプリンシパルは、このロールを引き受けて関数を実行します。

  • Lambda@Edge のサービスリンクロール – サービスリンクロールにより、特定の AWS のサービス が Lambda 関数を AWS リージョン にレプリケートし、CloudWatch が CloudFront ログファイルを使用できるようになります。

Lambda@Edge 関数を CloudFront ディストリビューションに関連付けるために必要な IAM アクセス許可

Lambda に必要な IAM アクセス許可に加え、ユーザーは、Lambda 関数を CloudFront ディストリビューションに関連付けるための以下の IAM アクセス許可が必要です。

  • lambda:GetFunction – Lambda 関数の設定情報を取得するためのアクセス許可、およびその関数を含む .zip ファイルをダウンロードするための署名付き URL を取得するアクセス許可を付与します。

  • lambda:EnableReplication* – Lambda レプリケーションサービスが関数コードと設定を取得するためのアクセス許可をリソースポリシーに付与します。

  • lambda:DisableReplication* – Lambda レプリケーションサービスが関数を削除するためのアクセス許可をリソースポリシーに付与します。

    重要

    lambda:EnableReplication* および lambda:DisableReplication* アクションの最後にアスタリスク (*) を追加する必要があります。

  • リソースに対して、次の例のように、CloudFront イベントが発生した場合に実行する関数バージョンの ARN を指定します。

    arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2

  • iam:CreateServiceLinkedRole – Lambda@Edge が CloudFront で Lambda 関数をレプリケートするために使用するサービスリンクロールを作成するアクセス許可を付与します。Lambda@Edge を初めて設定すると、サービスリンクロールが自動的に作成されます。Lambda@Edge を使用する他のディストリビューションにこのアクセス許可を追加する必要はありません。

  • cloudfront:UpdateDistribution または cloudfront:CreateDistribution – ディストリビューションを更新または作成するアクセス許可を付与します。

詳細については、次のトピックを参照してください。

サービスプリンシパルの関数実行ロール

ユーザーの関数を実行するときに lambda.amazonaws.comedgelambda.amazonaws.com サービスプリンシパル が引き受けることができる IAM ロールを作成する必要があります。

ヒント

Lambda コンソールで関数を作成する場合、AWS ポリシーテンプレートを使用して新しい実行ロールを作成することを選択できます。このステップでは、関数を実行するために必要な Lambda@Edge アクセス許可が自動的に追加されます。チュートリアル: シンプルな Lambda@Edge 関数の作成のステップ 5 を参照してください。

IAM ロールを手動で作成する詳細については、「IAM ユーザーガイド」の「ロールの作成とポリシーのアタッチ (コンソール)」を参照してください。

例: ロール信頼ポリシー

IAM コンソールの [信頼関係] タブで、このロールを追加できます。このポリシーは [アクセス許可] タブには追加しないでください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "edgelambda.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

実行ロールに付与する必要がある許可の詳細については、「AWS Lambda デベロッパーガイド」の「Lambda リソースのアクセス許可」を参照してください。

メモ
  • デフォルトでは、CloudFront イベントが Lambda 関数をトリガーするたびに、データが CloudWatch Logs に書き込まれます。これらのログを使用する場合は、CloudWatch Logs にデータを書き込むためのアクセス権限が実行ロールに必要です。事前定義された AWSLambdaBasicExecutionRole を使用して、実行ロールにアクセス許可を付与できます。

    CloudWatch Logs の詳細については、「エッジ関数のログ」を参照してください。

  • S3 バケットからのオブジェクトの読み取りなど、Lambda 関数コードが他の AWS リソースにアクセスする場合、そのアクションを実行するためのアクセス許可が実行ロールに必要です。

Lambda@Edge 用のサービスにリンクされたロール

Lambda@Edge は IAM サービスリンクロールを使用します。サービスにリンクされたロールは、サービスに直接リンクされた一意のタイプの IAM ロールです。サービスにリンクされたロールは、サービスによって事前定義されており、お客様の代わりにサービスから他の AWS サービスを呼び出す必要のあるアクセス許可がすべて含まれています。

Lambda@Edge は、以下の IAM サービスリンクロールを使用します。

  • AWSServiceRoleForLambdaReplicator - Lambda@Edge はこのロールを使用して、Lambda@Edge が関数を AWS リージョン にレプリケートできるようにします。

    CloudFront で Lambda@Edge トリガーを初めて追加すると、AWSServiceRoleForLambdaReplicator という名前のロールが自動的に作成され、Lambda@Edge が関数を AWS リージョン にレプリケートできるようになります。このロールは、Lambda@Edge 関数を使用するために必要です。AWSServiceRoleForLambdaReplicator ロールの ARN は次の例のようになります。

    arn:aws:iam::123456789012:role/aws-service-role/replicator.lambda.amazonaws.com/AWSServiceRoleForLambdaReplicator

  • AWSServiceRoleForCloudFrontLogger – CloudFront はこのロールを使用してログファイルを CloudWatch にプッシュします。ログファイルを使用して Lambda@Edge 検証エラーをデバッグできます。

    Lambda@Edge 関数の関連付けを追加すると、AWSServiceRoleForCloudFrontLogger ロールが自動的に作成され、CloudFront が Lambda@Edge エラーログファイルを CloudWatch にプッシュできるようになります。AWSServiceRoleForCloudFrontLogger の ARN は次のようになります。

    arn:aws:iam::account_number:role/aws-service-role/logger.cloudfront.amazonaws.com/AWSServiceRoleForCloudFrontLogger

サービスリンクロールを使用することで、必要なアクセス許可を手動で追加する必要がなくなるため、Lambda@Edge のセットアップと使用が簡単になります。Lambda@Edge はそのサービスリンクロールのアクセス許可を定義し、Lambda@Edge のみがそのロールを引き受けることができます。定義されたアクセス権限には、信頼ポリシーとアクセス権限ポリシーが含まれます。その他の IAM エンティティにアクセス許可ポリシーをアタッチすることはできません。

サービスにリンクされたロールを削除するには、その前に、それらのロールに関連付けられている CloudFront または Lambda@Edge のリソースを削除する必要があります。このようにして、アクティブなリソースにアクセスするためにまだ必要な、サービスリンクロールを削除しないようにすることで、Lambda@Edge リソースが保護されます。

サービスにリンクされたロールの詳細については、「CloudFront のサービスにリンクされたロール」を参照してください。

Lambda@Edge 用のサービスにリンクされたロールのアクセス許可

Lambda@Edge は、AWSServiceRoleForLambdaReplicator および AWSServiceRoleForCloudFrontLogger という名前の 2 つのサービスにリンクされたロールを使用します。以下のセクションでは、それらの各ロールのアクセス許可を管理する方法について説明します。

Lambda Replicator 用のサービスにリンクされたロールのアクセス許可

このサービスにリンクされたロールにより、Lambda が Lambda@Edge 関数を AWS リージョン にレプリケートできるようになります。

AWSServiceRoleForLambdaReplicator サービスにリンクされたロールは、ロールを継承するために replicator.lambda.amazonaws.com のサービスを信頼します。

このロールのアクセス権限ポリシーは、Lambda@Edge が以下のアクションを指定されたリソースに対して実行することを許可します。

  • lambda:CreateFunctionarn:aws:lambda:*:*:function:* での

  • lambda:DeleteFunctionarn:aws:lambda:*:*:function:* での

  • lambda:DisableReplicationarn:aws:lambda:*:*:function:* での

  • iam:PassRoleall AWS resources での

  • cloudfront:ListDistributionsByLambdaFunctionall AWS resources での

CloudFront ロガー用のサービスにリンクされたロールのアクセス許可

このサービスリンクロールでは、Lambda@Edge の検証エラーをデバッグするのに役立つように CloudFront が CloudWatch にログファイルをプッシュすることが許可されます。

AWSServiceRoleForCloudFrontLogger サービスにリンクされたロールは、ロールを継承するために logger.cloudfront.amazonaws.com のサービスを信頼します。

このロールのアクセス権限ポリシーは、Lambda@Edge が以下のアクションを指定された arn:aws:logs:*:*:log-group:/aws/cloudfront/* リソースに対して実行することを許可します。

  • logs:CreateLogGroup

  • logs:CreateLogStream

  • logs:PutLogEvents

IAM エンティティ (ユーザー、グループ、ロールなど) で Lambda@Edge のサービスにリンクされたロールを削除できるように、アクセス許可を設定する必要があります。詳細については、 IAM ユーザーガイド の「サービスリンクロールのアクセス許可」を参照してください。

Lambda@Edge 用のサービスにリンクされたロールの作成

通常、Lambda@Edge のサービスにリンクされたロールを手動で作成することはありません。以下のシナリオで、サービスによってロールが自動的に作成されます。

  • トリガーを初めて作成するとき、サービスは AWSServiceRoleForLambdaReplicator ロールを作成します (まだ存在しない場合)。このロールにより、Lambda が Lambda@Edge 関数を AWS リージョン にレプリケートできるようになります。

    このサービスにリンクされたロールを削除した場合、Lambda@Edge の新しいトリガーをディストリビューションに追加すると、そのロールは再び作成されます。

  • Lambda@Edge が関連付けられた CloudFront ディストリビューションを更新または作成すると、サービスによって AWSServiceRoleForCloudFrontLogger ロールが作成されます (まだ存在しない場合)。このロールにより、CloudFront が CloudWatch にログファイルをプッシュできるようになります。

    このサービスリンクロールを削除した場合は、Lambda@Edge の関連付けがある CloudFront ディストリビューションを更新または作成すると、そのロールが再び作成されます。

これらのサービスリンクロールを手動で作成する必要がある場合は、次の AWS Command Line Interface (AWS CLI) コマンドを実行します。

AWSServiceRoleForLambdaReplicator ロールを作成するには
  • 以下のコマンドを実行します。

    aws iam create-service-linked-role --aws-service-name replicator.lambda.amazonaws.com
AWSServiceRoleForCloudFrontLogger ロールを作成するには
  • 以下のコマンドを実行します。

    aws iam create-service-linked-role --aws-service-name logger.cloudfront.amazonaws.com

Lambda@Edge のサービスにリンクされたロールの編集

Lambda@Edge のサービスリンクロール AWSServiceRoleForLambdaReplicator または AWSServiceRoleForCloudFrontLogger を編集することはできません。サービスによってサービスリンクロールが作成された後は、多くのエンティティでそのロールが参照されるため、そのロール名は変更できません。ただし、IAM を使用してロールの説明を編集することはできます。詳細については、「IAM ユーザーガイド」の「サービスリンクロールの編集」を参照してください。

CloudFront のサービスにリンクされたロールでサポートされる AWS リージョン

CloudFront は、次の AWS リージョン で Lambda@Edge 用のサービスにリンクされたロールの使用をサポートしています。

  • 米国東部 (バージニア北部) – us-east-1

  • 米国東部 (オハイオ) – us-east-2

  • 米国西部 (北カリフォルニア) – us-west-1

  • 米国西部 (オレゴン) – us-west-2

  • アジアパシフィック (ムンバイ) – ap-south-1

  • アジアパシフィック (ソウル) – ap-northeast-2

  • アジアパシフィック (シンガポール) – ap-southeast-1

  • アジアパシフィック (シドニー) – ap-southeast-2

  • アジアパシフィック (東京) – ap-northeast-1

  • 欧州 (フランクフルト) – eu-central-1

  • 欧州 (アイルランド) – eu-west-1

  • 欧州 (ロンドン) – eu-west-2

  • 南米 (サンパウロ) – sa-east-1