

# Lambda@Edge 用の IAM アクセス許可とロールのセットアップ
<a name="lambda-edge-permissions"></a>

Lambda@Edge を設定するには、AWS Lambda に対する以下の IAM アクセス許可およびロールが必要です。
+ [IAM アクセス許可](#lambda-edge-permissions-required) – これらのアクセス許可により、Lambda 関数を作成して CloudFront ディストリビューションに関連付けることができます。
+ [Lambda 関数実行ロール](#lambda-edge-permissions-function-execution) (IAM ロール) – Lambda サービスプリンシパルは、このロールを引き受けて関数を実行します。
+ [Lambda@Edge のサービスリンクロール](#using-service-linked-roles-lambda-edge) – サービスリンクロールにより、特定の AWS のサービス が Lambda 関数を AWS リージョン にレプリケートし、CloudWatch が CloudFront ログファイルを使用できるようになります。

## Lambda@Edge 関数を CloudFront ディストリビューションに関連付けるために必要な IAM アクセス許可
<a name="lambda-edge-permissions-required"></a>

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` – ディストリビューションを更新または作成するアクセス許可を付与します。

詳細については、以下の各トピックを参照してください。
+ [Amazon CloudFront のアイデンティティとアクセス管理](security-iam.md)
+ 「*AWS Lambda デベロッパーガイド*」の「[Lambda リソースのアクセス許可](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role)」

## サービスプリンシパルの関数実行ロール
<a name="lambda-edge-permissions-function-execution"></a>

ユーザーの関数を実行するときに `lambda.amazonaws.com` と `edgelambda.amazonaws.com` サービスプリンシパル が引き受けることができる IAM ロールを作成する必要があります。

**ヒント**  
Lambda コンソールで関数を作成する場合、AWS ポリシーテンプレートを使用して新しい実行ロールを作成することを選択できます。このステップでは、関数を実行するために必要な Lambda@Edge アクセス許可が*自動的に*追加されます。[チュートリアル: シンプルな Lambda@Edge 関数の作成のステップ 5](lambda-edge-how-it-works-tutorial.md#lambda-edge-how-it-works-tutorial-create-function) を参照してください。

IAM ロールを手動で作成する詳細については、「*IAM ユーザーガイド*」の「[ロールの作成とポリシーのアタッチ (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions_create-policies.html)」を参照してください。

**Example 例: ロール信頼ポリシー**  
IAM コンソールの **[信頼関係]** タブで、このロールを追加できます。このポリシーは **[アクセス許可]** タブには追加しないでください。    
****  

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

実行ロールに付与する必要がある許可の詳細については、「*AWS Lambda デベロッパーガイド*」の「[Lambda リソースのアクセス許可](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role)」を参照してください。

**注意事項**  
デフォルトでは、CloudFront イベントが Lambda 関数をトリガーするたびに、データが CloudWatch Logs に書き込まれます。これらのログを使用する場合は、CloudWatch Logs にデータを書き込むためのアクセス権限が実行ロールに必要です。事前定義された AWSLambdaBasicExecutionRole を使用して、実行ロールにアクセス許可を付与できます。  
CloudWatch Logs の詳細については、「[エッジ関数のログ](edge-functions-logs.md)」を参照してください。
S3 バケットからのオブジェクトの読み取りなど、Lambda 関数コードが他の AWS リソースにアクセスする場合、そのアクションを実行するためのアクセス許可が実行ロールに必要です。

## Lambda@Edge 用のサービスにリンクされたロール
<a name="using-service-linked-roles-lambda-edge"></a>

Lambda@Edge は IAM [サービスリンクロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role)を使用します。サービスにリンクされたロールは、サービスに直接リンクされた一意のタイプの 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 のサービスにリンクされたロール](security_iam_service-with-iam.md#security_iam_service-with-iam-roles-service-linked)」を参照してください。

### Lambda@Edge 用のサービスにリンクされたロールのアクセス許可
<a name="slr-permissions-lambda-edge"></a>

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

**Contents**
+ [Lambda Replicator 用のサービスにリンクされたロールのアクセス許可](#slr-permissions-lambda-replicator)
+ [CloudFront ロガー用のサービスにリンクされたロールのアクセス許可](#slr-permissions-cloudfront-logger)

#### Lambda Replicator 用のサービスにリンクされたロールのアクセス許可
<a name="slr-permissions-lambda-replicator"></a>

このサービスにリンクされたロールにより、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 ロガー用のサービスにリンクされたロールのアクセス許可
<a name="slr-permissions-cloudfront-logger"></a>

このサービスリンクロールでは、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 ユーザーガイド* の「[サービスにリンクされた役割のアクセス許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#service-linked-role-permissions)」を参照してください。

### Lambda@Edge 用のサービスにリンクされたロールの作成
<a name="create-slr-lambda-edge"></a>

通常、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 のサービスにリンクされたロールの編集
<a name="edit-slr-lambda-edge"></a>

Lambda@Edge のサービスリンクロール AWSServiceRoleForLambdaReplicator または AWSServiceRoleForCloudFrontLogger を編集することはできません。サービスによってサービスリンクロールが作成された後は、多くのエンティティでそのロールが参照されるため、そのロール名は変更できません。ただし、IAM を使用してロールの説明を編集することはできます。詳細については、「*IAM ユーザーガイド*」の「[サービスリンクロールの編集](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#edit-service-linked-role)」を参照してください。

### Lambda@Edge サービスリンクロールでサポートされている AWS リージョン
<a name="slr-regions-lambda-edge"></a>

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`