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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

设置 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:UpdateDistributioncloudfront:CreateDistribution

    使用 cloudfront:UpdateDistribution 来更新分配,或使用 cloudfront:CreateDistribution 来创建分配。

有关更多信息,请参阅以下文档:

服务主体的函数执行角色

您必须创建一个可由服务委托人 lambda.amazonaws.comedgelambda.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 使用两个名为 AWSServiceRoleForLambdaReplicatorAWSServiceRoleForCloudFrontLogger 的服务相关角色。以下部分介绍了其中的每个角色的权限。

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)