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
– ディストリビューションを更新または作成するアクセス許可を付与します。
詳細については、次のトピックを参照してください。
-
「AWS Lambda デベロッパーガイド」の「Lambda リソースのアクセス許可」
サービスプリンシパルの関数実行ロール
ユーザーの関数を実行するときに lambda.amazonaws.com
と edgelambda.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:CreateFunction
arn:aws:lambda:*:*:function:*
での -
lambda:DeleteFunction
arn:aws:lambda:*:*:function:*
での -
lambda:DisableReplication
arn:aws:lambda:*:*:function:*
での -
iam:PassRole
all AWS resources
での -
cloudfront:ListDistributionsByLambdaFunction
all 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