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
を選択してディストリビューションを作成します。
詳細については、次のドキュメントを参照してください。
-
このガイドの「CloudFront の Identity and Access Management (IAM)」を参照してください。
-
AWS Lambda デベロッパーガイドの「AWS Lambda の認証とアクセスコントロール」
サービスプリンシパルの関数実行ロール
サービスプリンシパル lambda.amazonaws.com
と edgelambda.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 の詳細については、「Lambda@Edge 関数の CloudWatch メトリクスおよびログ」を参照してください。
-
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
-
アクション:
logs:CreateLogStream
上でarn:aws:logs:*:*:log-group:/aws/cloudfront/*
-
アクション:
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 User Guide」(IAM ユーザーガイド) の「Editing a service-linked role」(サービスリンクロールの編集) を参照してください。
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