设置 Lambda@Edge 的 IAM 权限和角色
要配置 Lambda@Edge,您必须针对 Amazon Lambda 设置以下 IAM 权限和角色:
-
IAM 权限 – 这些权限允许您创建自己的 Lambda 函数并将其与您的 CloudFront 分配相关联。
-
Lambda 函数执行角色(IAM 角色)– Lambda 服务主体代入此角色来执行您的函数。
-
服务相关 Lambda@Edge 角色 – 服务相关角色允许特定 Amazon Web Services 服务将 Lambda 函数复制到 Amazon Web Services 区域,并允许 CloudWatch 使用 CloudFront 日志文件。
将 Lambda@Edge 函数与 CloudFront 分配关联所需的 IAM 权限
除了配置 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 Lambda 开发人员指南》中的 Lambda 资源访问权限
服务主体的函数执行角色
您必须创建一个 IAM 角色,以便 lambda.amazonaws.com
和 edgelambda.amazonaws.com
服务主体在执行您的函数时可以代入该角色。
提示
当您在 Lambda 控制台中创建函数时,可以选择使用 Amazon 策略模板创建新的执行角色。此步骤会自动 添加执行函数所需的 Lambda@Edge 权限。请参阅教程中的步骤 5:创建简单的 Lambda@Edge 函数。
有关手动创建 IAM 角色的更多信息,请参阅《IAM 用户指南》中的创建角色并附加策略(控制台)。
例 示例:角色信任策略
您可以在 IAM 控制台的信任关系选项卡下添加此角色。请勿在权限选项卡下添加此策略。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "edgelambda.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
有关需要向执行角色授予的权限的更多信息,请参阅《Amazon Lambda 开发人员指南》中的 Lambda 资源访问权限。
注意
-
默认情况下,每当 CloudFront 事件触发 Lambda 函数时,数据都会写入到 CloudWatch Logs。如果要使用这些日志,执行角色需要权限来将数据写入 CloudWatch Logs。您可以使用预定义的 AWSLambdaBasicExecutionRole 向执行角色授予权限。
有关 CloudWatch Logs 的更多信息,请参阅边缘函数日志。
-
如果您的 Lambda 函数代码访问其他 Amazon 资源,比如从 S3 存储桶读取对象,则执行角色需要权限来执行此操作。
Lambda@Edge 的服务相关角色
Lambda@Edge 使用 IAM 服务相关角色。服务相关角色是一种与服务直接关联的独特类型的 IAM 角色。服务相关角色是由服务预定义的,具有服务代表您调用其他 Amazon 服务所需的所有权限。
Lambda@Edge 使用以下 IAM 服务相关角色:
-
AWSServiceRoleForLambdaReplicator – Lambda@Edge 使用该角色来允许 Lambda@Edge 将函数复制到 Amazon Web Services 区域。
当您首次在 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
-
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 的服务相关角色。
Lambda@Edge 的服务相关角色权限
Lambda@Edge 使用两个名为 AWSServiceRoleForLambdaReplicator 和 AWSServiceRoleForCloudFrontLogger 的服务相关角色。以下部分介绍了其中的每个角色的权限。
Lambda Replicator 的服务相关角色权限
此服务相关角色允许 Lambda 将 Lambda@Edge 函数复制到Amazon Web Services 区域。
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 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
-
logs:PutLogEvents
您必须配置权限以允许 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 Command Line Interface(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
)