设置 Lambda@Edge 的 IAM 权限和角色
要配置 Lambda@Edge,必须设置特定的 IAM 权限和 IAM 执行角色。Lambda@Edge 还会创建一个服务相关角色,以将 Lambda 函数复制到 CloudFront 区域并允许 CloudWatch 使用 CloudFront 日志文件。
将 Lambda@Edge 函数与 CloudFront 分配关联所需的 IAM 权限
除了使用 Amazon Lambda 所需的 IAM 权限之外,用户还需要以下 IAM 权限才能将 Lambda 函数与 CloudFront 分配关联:
-
lambda:GetFunction
允许用户获取 Lambda 函数的配置信息,以及一个用于下载包含该函数的 .zip 文件的预签名 URL。
对于资源,请指定当 CloudFront 事件发生时要执行的函数版本的 ARN,如以下示例所示:
arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2
-
lambda:EnableReplication*
向资源策略添加权限,此策略向 Lambda 复制服务提供获取函数代码和配置的权限。
重要
权限结尾处的星号 (
*
) 是必需的: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
来创建分配。
有关更多信息,请参阅以下文档:
-
Amazon Lambda 开发人员指南中的 Amazon Lambda 的身份验证和访问控制
服务主体的函数执行角色
您必须创建一个可由服务委托人 lambda.amazonaws.com
和 edgelambda.amazonaws.com
担任的 IAM 角色。当服务委托人执行您的函数时,由他们担任该角色。有关更多信息,请参阅 IAM 用户指南中的创建角色和附加策略(控制台)。
在 IAM 中的信任关系选项卡下添加该角色(不要将其添加在权限选项卡下)。
以下是角色信任策略的一个示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "edgelambda.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
有关您需要向执行角色授予的权限的信息,请参阅 Amazon Lambda 开发人员指南中的管理权限:使用 IAM 角色(执行角色)。请注意以下几点:
-
默认情况下,每当 CloudFront 事件触发 Lambda 函数时,数据都会写入到 CloudWatch Logs。如果要使用这些日志,执行角色需要权限来将数据写入 CloudWatch Logs。您可以使用预定义的 AWSLambdaBasicExecutionRole 向执行角色授予权限。
有关 CloudWatch Logs 的更多信息,请参阅边缘函数日志。
-
如果您的 Lambda 函数代码访问其他Amazon资源,比如从 S3 存储桶读取对象,则执行角色需要权限来执行此操作。
Lambda@Edge 的服务相关角色
Lambda@Edge 使用 Amazon Identity and Access Management (IAM) 服务相关角色。服务相关角色是一种与服务直接关联的独特类型的 IAM 角色。服务相关角色是由服务预定义的,具有服务代表您调用其他 Amazon 服务所需的所有权限。
Lambda@Edge 使用以下 IAM 服务相关角色:
AWSServiceRoleForLambdaReplicator – Lambda@Edge 使用该角色以允许 Lambda@Edge 将函数复制到Amazon Web Services 区域。
AWSServiceRoleForCloudFrontLogger – CloudFront 使用此角色将日志文件推送到您的 CloudWatch 账户,以帮助您调试 Lambda@Edge 验证错误。
当您首次在 CloudFront 中添加 Lambda@Edge 触发器时,会自动创建一个名为 AWSServiceRoleForLambdaReplicator 的角色,以允许 Lambda@Edge 将函数复制到Amazon Web Services 区域。使用 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 配合使用的Amazon服务,并查找 Service-Linked Role (服务相关角色) 列为 Yes (是) 的服务。
Lambda@Edge 的服务相关角色权限
Lambda@Edge 使用两个名为 AWSServiceRoleForLambdaReplicator 和 AWSServiceRoleForCloudFrontLogger 的服务相关角色。以下部分介绍了其中的每个角色的权限。
Lambda Replicator 的服务相关角色权限
此服务相关角色允许 Lambda 将 Lambda@Edge 函数复制到Amazon Web Services 区域。
AWSServiceRoleForLambdaReplicator 服务相关角色仅信任以下服务来担任该角色:replicator.lambda.amazonaws.com
角色权限策略允许 Lambda@Edge 对指定的资源完成以下操作:
-
操作:
arn:aws:lambda:*:*:function:*
上的lambda:CreateFunction
-
操作:
lambda:DeleteFunction
上的arn:aws:lambda:*:*:function:*
-
操作:
lambda:DisableReplication
上的arn:aws:lambda:*:*:function:*
-
操作:
iam:PassRole
上的all Amazon resources
-
操作:
cloudfront:ListDistributionsByLambdaFunction
上的all Amazon resources
CloudFront Logger 的服务相关角色权限
该服务相关角色允许 CloudFront 将日志文件推送到 CloudWatch 账户,以帮助您调试 Lambda@Edge 验证错误。
AWSServiceRoleForCloudFrontLogger 服务相关角色仅信任以下服务来担任该角色:logger.cloudfront.amazonaws.com
角色权限策略允许 Lambda@Edge 对指定的资源完成以下操作:
-
操作:
arn:aws:logs:*:*:log-group:/aws/cloudfront/*
上的logs:CreateLogGroup
-
操作:
logs:CreateLogStream
上的arn:aws:logs:*:*:log-group:/aws/cloudfront/*
-
操作:
logs:PutLogEvents
上的arn:aws:logs:*:*:log-group:/aws/cloudfront/*
您必须配置权限以允许 IAM 实体(如用户、组或角色)删除 Lambda@Edge 服务相关角色。有关更多信息,请参阅《IAM 用户指南》中的服务相关角色权限。
为 Lambda@Edge 创建服务相关角色
通常您不需要为 Lambda@Edge 手动创建服务相关角色。在以下情况下,该服务自动为您创建角色:
在首次创建触发器时,该服务创建一个角色(AWSServiceRoleForLambdaReplicator,如果该角色尚不存在的话),以允许 Lambda 将 Lambda@Edge 函数复制到Amazon Web Services 区域。
如果您删除服务相关角色,则在分配中为 Lambda@Edge 添加新触发器时,将再次创建该角色。
在更新或创建具有 Lambda@Edge 关联的 CloudFront 分配时,该服务创建一个角色(AWSServiceRoleForCloudFrontLogger,如果该角色尚不存在)以允许 CloudFront 将日志文件推送到 CloudWatch。
如果删除服务相关角色,在更新或创建具有 Lambda@Edge 关联的 CloudFront 分配时,将再次创建该角色。
如果您必须手动创建这些服务相关角色,请使用 Amazon 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 服务相关角色
Lambda@Edge 不允许您编辑 AWSServiceRoleForLambdaReplicator 或 AWSServiceRoleForCloudFrontLogger 服务相关角色。在该服务创建服务相关角色后,您无法更改该角色的名称,因为不同的实体可能会引用该角色。不过,您可以使用 IAM 编辑角色的说明。有关更多信息,请参阅 IAM 用户指南 中的编辑服务相关角色。
CloudFront 服务相关角色支持的Amazon Web Services 区域
CloudFront 支持在以下Amazon Web Services 区域对 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
)