Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

设置 Lambda@Edge 的 IAM 权限和角色

特定 IAM 权限和 IAM 执行角色在配置 Lambda@Edge 时是必需的。Lambda@Edge 还会创建一个服务相关角色,以将 Lambda 函数复制到 CloudFront 区域并允许您的 CloudWatch 账户使用日志文件。

将 Lambda 函数与 CloudFront 分配关联所需的 IAM 权限

除了使用 AWS Lambda 所需的 IAM 权限以外,IAM 用户还需要具有以下 IAM 权限才能将 Lambda 函数与 CloudFront 分配关联:

  • 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

    用于创建 Lambda@Edge 使用的服务相关角色 (用于在 CloudFront 中复制 Lambda 函数)。在该角色已由您用于 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

  • 如果您的 Lambda 函数代码访问其他 AWS 资源,比如从 S3 存储桶读取对象,则执行角色需要权限来执行该操作。

Lambda@Edge 的服务相关角色

Lambda@Edge 使用 AWS Identity and Access Management (IAM) 服务相关角色。服务相关角色是一种与服务直接关联的独特类型的 IAM 角色。服务相关角色是由服务预定义的,具有服务代表您调用其他 AWS 服务所需的所有权限。

Lambda@Edge 使用以下 IAM 服务相关角色:

  • AWSServiceRoleForLambdaReplicator–Lambda@Edge 使用该角色以允许 Lambda@Edge 将函数复制到 AWS 区域。

  • AWSServiceRoleForCloudFrontLogger–CloudFront 使用该角色将日志文件推送到 CloudWatch 账户,以帮助您调试 Lambda@Edge 验证错误。

在 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 函数关联以允许 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 资源。

有关支持服务相关角色的其他服务的信息,请参阅与 IAM 配合使用的 AWS 服务并查找 Service-Linked Role 列为 Yes 的服务。

Lambda@Edge 的服务相关角色权限

Lambda@Edge 使用两个名为 AWSServiceRoleForLambdaReplicatorAWSServiceRoleForCloudFrontLogger 的服务相关角色。以下部分介绍了其中的每个角色的权限。

Lambda Replicator 的服务相关角色权限

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

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 的服务相关角色权限

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

AWSServiceRoleForCloudFrontLogger 服务相关角色仅信任以下服务来担任该角色:

  • logger.cloudfront.amazonaws.com

角色权限策略允许 Lambda@Edge 对指定的资源完成以下操作:

  • 操作:logs:CreateLogGroup 上的 arn:aws:logs:*:*:/aws/cloudfront/*

  • 操作:logs:CreateLogStream 上的 arn:aws:logs:*:*:/aws/cloudfront/*

  • 操作:logs:PutLogsEvent 上的 arn: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 分配时,将再次创建该角色。

如果必须手动预配置 AWSServiceRoleForCloudFrontLogger 服务相关角色,请在 AWS 命令行上运行以下命令:

aws iam create-service-linked-role --aws-service-name replicator.lambda.amazonaws.com

编辑 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 管理控制台,通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/

  2. CloudFront 分配页面上,单击右上角的头像。

    
  		      显示 CloudFront 中的头像的屏幕截图。
  3. 选择 Delete

    
  	        显示在 CloudFront 中删除服务相关角色的对话框的屏幕截图。

手动删除 AWSServiceRoleForCloudFrontLogger 服务相关角色

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

  2. 在 IAM 控制台的导航窗格中,选择角色。然后,选中要删除的角色名称旁边的复选框,而不是名称或行本身。

  3. 对于页面顶部的角色操作,请选择删除角色

  4. 在确认对话框中,查看上次访问服务数据,该数据显示每个选定角色上次访问 AWS 服务的时间。这样可帮助您确认角色当前是否处于活动状态。如果要继续,请选择Yes, Delete以提交要删除的服务相关角色。

  5. 观察 IAM 控制台通知,以监控服务相关角色的删除进度。由于 IAM 服务相关角色的删除是异步操作,因此,在提交要删除的角色后,删除任务可能会成功,也可能会失败。有关更多信息,请参阅 IAM 用户指南 中的删除服务相关角色

CloudFront 服务相关角色的受支持区域

CloudFront 支持在以下区域中对 Lambda@Edge 使用服务相关角色。

区域名称 区域标识 在 CloudFront 中支持
美国东部(弗吉尼亚北部) us-east-1
美国东部(俄亥俄州) us-east-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