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

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

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

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) のサービスにリンクされたロールを使用します。サービスにリンクされたロールは、Lambda@Edge に直接リンクされた一意のタイプの IAM ロールです。サービスにリンクされたロールは、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

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

サービスにリンクされたロールを削除するには、その前に、それらのロールに関連付けられた CloudFront または Lambda@Edge リソースを削除する必要があります。これにより、リソースに対するアクセス権限が不注意に削除されることがなくなり、Lambda@Edge リソースは保護されます。

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

Lambda@Edge のサービスにリンクされたロールのアクセス権限

Lambda@Edge は、AWSServiceRoleForLambdaReplicator という、サービスにリンクされたロールを使用します。This service-linked role allows Lambda to replicate Lambda@Edge functions to AWS Regions.

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 resourcesiam:PassRole

  • アクション: all AWS resourcescloudfront:ListDistributionsByLambdaFunction

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

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

Lambda@Edge のサービスにリンクされたロールを手動で作成する必要はありません。first create a trigger, the service creates a role that allows Lambda to replicate Lambda@Edge functions to AWS Regions.

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

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

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

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

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

AWSServiceRoleForLambdaReplicator で使用されている Lambda@Edge リソースを削除するには

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

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

注記

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

Lambda@Edge のサービスにリンクされたロールを手動で削除するには (CloudFront コンソール)

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

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

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

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