Lambda@Edge 用の IAM アクセス権限とロールの設定 - Amazon CloudFront

Lambda@Edge 用の IAM アクセス権限とロールの設定

Lambda@Edge を設定するには、特定の IAM アクセス許可および IAM 実行ロールを設定する必要があります。Lambda@Edge では、CloudFront リージョンに Lambda 関数がレプリケートされ、CloudWatch で CloudFront ログファイルを使用できるようにするために、サービスにリンクされたロールも作成されます。

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

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

  • lambda:GetFunction

    ユーザーが Lambda 関数の設定情報を取得し、関数を含む.zip ファイルをダウンロードするための署名付き URL を取得できるようにします。

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

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

  • lambda:EnableReplication*

    関数コードと設定を取得するための Lambda レプリケーションサービスのアクセス許可を与えるリソースポリシーにアクセス許可を追加します。

    重要

    アクセス許可の末尾にあるアスタリスク (*) が必要です。lambda:EnableReplication*

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

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

  • iam:CreateServiceLinkedRole

    CloudFront で Lambda 関数をレプリケートするために、Lambda@Edge によって使用される、サービスにリンクされたロールをユーザーが作成できるようにします。このロールを Lambda@Edge で使用する最初のディストリビューションで作成した後では、Lambda@Edge で使用する他のディストリビューションにアクセス許可を追加する必要はありません。

  • cloudfront:UpdateDistribution または cloudfront:CreateDistribution

    cloudfront:UpdateDistribution を使用してディストリビューションを更新するか、cloudfront:CreateDistribution を選択してディストリビューションを作成します。

詳細については、次のドキュメントを参照してください。

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

サービスプリンシパル lambda.amazonaws.comedgelambda.amazonaws.com が引き受けることができる IAM ロールを作成する必要があります。このロールは、関数を実行するときに、サービスプリンシパルが引き受けることができます。詳細については、IAM ユーザーガイドロールの作成とポリシーのアタッチ (コンソール)を参照してください。

このロールを IAM の [信頼関係] タブで追加します ([アクセス許可] タブでは追加しないでください)。

ロールの信頼ポリシーの例を示します。

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

実行ロールに付与する必要がある許可の詳細については、AWS Lambda デベロッパーガイドの「許可の管理: IAM ロール (実行ロール) の使用」を参照してください。次の点に注意してください。

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

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

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

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

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

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

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

  • AWSServiceRoleForCloudFrontLogger - CloudFront は、このロールを使用して CloudWatch アカウントにログファイルをプッシュし、Lambda@Edge 検証エラーをデバッグできるよう支援しています。

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

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

Lambda@Edge 関数の関連付けを追加すると、AWSServiceRoleForCloudFrontLogger という名前の 2 つ目のロールが自動的に作成され、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 リソースが保護されます。

サービスにリンクされたロールをサポートする他のサービスについては、「IAM と連携する AWS サービス」を開き、「サービスにリンクされたロール」列が「あり」になっているサービスを探してください。

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

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

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

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

サービスにリンクされたロールである AWSServiceRoleForLambdaReplicator は、その引き受け時に次のサービスを信頼します: replicator.lambda.amazonaws.com

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

  • アクション: arn:aws:lambda:*:*:function:* 上でlambda:CreateFunction

  • アクション: arn:aws:lambda:*:*:function:* 上で lambda:DeleteFunction

  • アクション: arn:aws:lambda:*:*:function:* 上で lambda:DisableReplication

  • アクション: all AWS resources 上で iam:PassRole

  • アクション: all AWS resources 上で cloudfront:ListDistributionsByLambdaFunction

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

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

サービスにリンクされたロールである AWSServiceRoleForCloudFrontLogger は、その引き受け時に次のサービスを信頼します: logger.cloudfront.amazonaws.com

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

  • アクション: arn:aws:logs:*:*:log-group:/aws/cloudfront/* 上でlogs:CreateLogGroup

  • アクション: arn:aws:logs:*:*:log-group:/aws/cloudfront/* 上で logs:CreateLogStream

  • アクション: arn:aws:logs:*:*:log-group:/aws/cloudfront/* 上で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 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