本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
设置 Lambda@Edge 的 IAM 权限和角色
要配置 Lambda@Edge,必须设置特定的 IAM 权限和 IAM 执行角色。Lambda @Edge 还会创建服务相关角色来将 Lambda 函数复制到CloudFront 区域并允许 CloudWatch 使用日志文件。 CloudFront
将 Lambda @Edge 函数与分配关联所需的 IAM 权限 CloudFront
除了您需要使用AWS 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
-
lambda:DisableReplication*
向资源策略添加权限,此策略向 Lambda 复制服务提供允许删除函数的权限。
重要
权限结尾处的星号 (
*
) 是必需的:lambda:DisableReplication*
对于资源,请指定 CloudFront 事件发生时要执行的函数版本的 ARN,如以下示例所示:
arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2
-
iam:CreateServiceLinkedRole
允许用户创建服务关联角色,Lambda @Edge 使用该角色在中复制 Lambda 函数。 CloudFront在该角色已由您用于 Lambda@Edge 的第一个分配创建后,您不需要向您用于 Lambda@Edge 的其他分配添加权限。
-
cloudfront:UpdateDistribution
或cloudfront:CreateDistribution
使用
cloudfront:UpdateDistribution
来更新分配,或使用cloudfront:CreateDistribution
来创建分配。
有关更多信息,请参阅以下文档:
-
AWS Lambda 开发人员指南中的 AWS 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" } ] }
有关您需要向执行角色授予的权限的信息,请参阅 AWS Lambda 开发人员指南中的管理权限:使用 IAM 角色(执行角色)。请注意以下几点:
-
默认情况下,每当 CloudFront 事件触发 Lambda 函数时,数据都会写入 CloudWatch 日志。如果要使用这些日志,则执行角色需要向 CloudWatch 日志写入数据的权限。您可以使用预定义AWSLambdaBasicExecutionRole 向执行角色授予权限。
有关 CloudWatch 日志的更多信息,请参阅边缘函数日志。
-
如果您的 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 验证错误。
首次在中添加 Lambda @Edge 触发器时 CloudFront,系统会自动创建一个名AWSServiceRoleForLambdaReplicator为的角色以允许 Lambda @Edge 向其复制函数。AWS 区域使用 Lambda@Edge 函数也需要该角色。AWSServiceRoleForLambdaReplicator 角色的 ARN 如下所示:
arn:aws:iam::123456789012:role/aws-service-role/replicator.lambda.amazonaws.com/AWSServiceRoleForLambdaReplicator
第二个名为AWSServiceRoleForCloudFrontLogger的角色是在您添加 Lambda @Edge 函数关联以允许将 Lambda @Edge 错误日志文件推送 CloudFront 到时自动创建的。 CloudWatchAWSServiceRoleForCloudFrontLogger 角色的 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 使用两个名为 AWSServiceRoleForLambdaReplicator 和 AWSServiceRoleForCloudFrontLogger 的服务相关角色。以下部分介绍了其中的每个角色的权限。
Lambda Replicator 的服务相关角色权限
此服务相关角色允许 Lambda 将 Lambda@Edge 函数复制到AWS 区域。
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 AWS resources
-
操作:
cloudfront:ListDistributionsByLambdaFunction
上的all AWS resources
Logger 的服务相关角色权限 CloudFront
此服务相关角色允许将日志文件推送 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 函数复制到AWS 区域。
如果您删除服务相关角色,则在分配中为 Lambda@Edge 添加新触发器时,将再次创建该角色。
当您更新或创建具有 Lambda @Edge 关联的 CloudFront 分配时,如果该角色尚不存在AWSServiceRoleForCloudFrontLogger,则该服务会创建一个允许将日志文件推送 CloudFront 到的角色。 CloudWatch
如果您删除服务相关角色,则当您更新或创建具有 Lambda @Edge 关联的 CloudFront 分配时,将再次创建该角色。
如果您必须手动创建这些服务相关角色,请使用 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 服务相关角色
Lambda@Edge 不允许您编辑 AWSServiceRoleForLambdaReplicator 或 AWSServiceRoleForCloudFrontLogger 服务相关角色。在该服务创建服务相关角色后,您无法更改该角色的名称,因为不同的实体可能会引用该角色。不过,您可以使用 IAM 编辑角色的说明。有关更多信息,请参阅 IAM 用户指南 中的编辑服务相关角色。
AWS 区域支持 CloudFront 与服务相关的角色
CloudFront 支持在以下内容中为 Lambda @Edge 使用服务相关角色:AWS 区域
-
美国东部(弗吉尼亚北部)–
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
)