

# 设置 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 分配相关联：
+ `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 的 Identity and Access Management](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>

您必须创建一个 IAM 角色，以便 `lambda.amazonaws.com` 和 `edgelambda.amazonaws.com` 服务主体在执行您的函数时可以代入该角色。

**提示**  
当您在 Lambda 控制台中创建函数时，可以选择使用 AWS 策略模板创建新的执行角色。此步骤*会自动* 添加执行函数所需的 Lambda@Edge 权限。请参阅[教程中的步骤 5：创建简单的 Lambda@Edge 函数](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)。
如果您的 Lambda 函数代码访问其他 AWS 资源，比如从 S3 存储桶读取对象，则执行角色需要权限来执行此操作。

## 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 函数关联以允许 CloudFront 将 Lambda@Edge 错误日志文件推送到 CloudWatch 时，将自动创建 AWSServiceRoleForCloudFrontLogger 角色。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** 的服务相关角色。以下部分介绍了其中的每个角色的权限。

**Contents**
+ [Lambda Replicator 的服务相关角色权限](#slr-permissions-lambda-replicator)
+ [CloudFront Logger 的服务相关角色权限](#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 Logger 的服务相关角色权限
<a name="slr-permissions-cloudfront-logger"></a>

该服务相关角色允许 CloudFront 将日志文件推送到 CloudWatch 账户，以便您可以调试 Lambda@Edge 验证错误。

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`)