Amazon CloudFront
開発者ガイド (API バージョン 2016-09-29)

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

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

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

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

  • lambda:GetFunction

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

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

  • 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 ユーザーガイド のトピック「職務機能の AWS 管理ポリシー」の「ロールの作成とポリシーのアタッチ (コンソール)」を参照してください。

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

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

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

実行ロールに付与する必要があるアクセス権限の詳細については、AWS Lambda Developer Guide の「アクセス権限の管理: IAM ロール (実行ロール) を使用する」を参照してください。次の点に注意してください。

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

    CloudWatch Logs の詳細については、「Lambda 関数の CloudWatch メトリクスと 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 はこのロールを使用して、Lambda@Edge の検証エラーのデバッグに役立つように、ログファイルを CloudWatch アカウントにプッシュできるようにします。

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 のサービスにリンクされたロールのアクセス許可

This service-linked role allows Lambda to replicate Lambda@Edge functions to AWS Regions.

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 Logger のサービスにリンクされたロールのアクセス許可

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

AWSServiceRoleForCloudFrontLogger サービスにリンクされたロールはその引き受け時に、以下のサービスを信頼します。

  • logger.cloudfront.amazonaws.com

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

  • アクション: logs:CreateLogGrouparn:aws:logs:*:*:/aws/cloudfront/*

  • アクション: logs:CreateLogStreamarn:aws:logs:*:*:/aws/cloudfront/*

  • アクション: logs:PutLogsEventarn:aws:logs:*:*:/aws/cloudfront/*

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

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

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

  • トリガーを初めて作成すると、サービスによってロール AWSServiceRoleForLambdaReplicator が作成されます。このロールにより、Lambda が Lambda@Edge 関数を AWS リージョンにレプリケートできるようになります。

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

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

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

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

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

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

Lambda@Edge を使用する必要がなくなった場合は、サービスにリンクされたロールを削除することをお勧めします。そうすることで、アクティブにモニタリングやメンテナンスがされていない不要なエンティティがなくなります。ただし、ロールを手動で削除する前に、アカウントの Lambda@Edge リソースをクリーンアップする必要があります。

すべてのディストリビューションから Lambda@Edge のすべての関連付けを削除するには、Lambda@Edge 関数のすべてのトリガーを削除するようにディストリビューションを更新するか、または Lambda@Edge 関数を使用しているディストリビューションを削除します。詳細については、「Lambda@Edge 関数とレプリカの削除」を参照してください。

ディストリビューションから Lambda@Edge 関数のすべての関連付けを削除し、CloudFront によって AWS ロケーションからその関数のレプリカが削除されたら、そのサービスにリンクされたロールを削除できます。

注記

CloudFront による更新が完了していない場合、サービスにリンクされたロールの削除は失敗することがあります。失敗した場合は、数分待ってから削除手順をもう一度試してください。

各サービスにリンクされたロールを手動で削除するには、次のような別の手順に従う必要があります。

  • CloudFront コンソールを使用して AWSServiceRoleForLambdaReplicator ロールを削除します。

  • IAM コンソールを使用して AWSServiceRoleForCloudFrontLogger ロールを削除します。

サービスにリンクされたロール AWSServiceRoleForLambdaReplicator を手動で削除するには

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/cloudfront/ にある、CloudFront コンソールを開きます。

  2. [CloudFront Distributions ( ディストリビューション)] ページで、右上にあるアバターをクリックします。

    
  		      CloudFront でのアバターを示すスクリーンショット。
  3. Delete を選択します。

    
  	        CloudFront での Lambda のサービスにリンクされたロールを削除するためのダイアログボックスを示すスクリーンショット。

サービスにリンクされたロール AWSServiceRoleForCloudFrontLogger を手動で削除するには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. IAM コンソールのナビゲーションペインで [ロール] を選択します。ロール名または行そのものではなく、削除するロール名の横にあるチェックボックスをオンにします。

  3. ページ上部にある [ロールのアクション] で [ロールの削除] を選択します。

  4. 確認ダイアログボックスで、サービスの最終アクセス時間データを確認します。これは、選択したそれぞれのロールの AWS サービスへの最終アクセス時間を示します。これは、そのロールが現在アクティブであるかどうかを確認するのに役立ちます。先に進む場合は、[Yes, Delete] を選択し、サービスにリンクされたロールの削除を送信します。

  5. IAM コンソール通知を見て、サービスにリンクされたロールの削除の進行状況を監視します。IAM サービスにリンクされたロールの削除は非同期であるため、削除するロールを送信すると、削除タスクは成功または失敗する可能性があります。詳細については、IAM ユーザーガイド の「サービスにリンクされたロールの削除」を参照してください。

サービスにリンクされたロール CloudFront がサポートされているリージョン

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

リージョン名 リージョン識別子 CloudFront でのサポート
米国東部(バージニア北部) us-east-1 はい
米国東部 (オハイオ) us-west-2 はい
米国西部 (オレゴン) us-west-2 はい
アジアパシフィック (ムンバイ) ap-south-1 はい
アジアパシフィック (東京) ap-northeast-1 はい
アジアパシフィック (ソウル) ap-northeast-2 あり
アジアパシフィック (シンガポール) ap-southeast-1 はい
アジアパシフィック (シドニー) ap-southeast-2 はい
欧州 (フランクフルト) eu-central-1 はい
欧州 (ロンドン) eu-west-2 はい
南米 (サンパウロ) sa-east-1 あり