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

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

要配置 Lambda@Edge,您必须针对 Lambda 设置以下 IAM 权限和角色:

  • IAM 权限 – 这些权限允许您创建自己的 AWS Lambda 函数并将其与您的 CloudFront 分配相关联。

  • Lambda 函数执行角色(IAM 角色)– Lambda 服务主体代入此角色来执行您的函数。

  • 服务相关 Lambda@Edge 角色 – 服务相关角色允许特定 AWS 服务将 Lambda 函数复制到 AWS 区域,并允许 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:UpdateDistributioncloudfront:CreateDistribution - 授予更新或创建分配的权限。

有关更多信息,请参阅以下主题:

服务主体的函数执行角色

您必须创建一个 IAM 角色,以便 lambda.amazonaws.comedgelambda.amazonaws.com 服务主体在执行您的函数时可以代入该角色。

提示

当您在 Lambda 控制台中创建函数时,可以选择使用 AWS 策略模板创建新的执行角色。此步骤会自动 添加执行函数所需的 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" } ] }

有关需要向执行角色授予的权限的更多信息,请参阅《AWS Lambda 开发人员指南》中的 Lambda 资源访问权限

注意
  • 默认情况下,每当 CloudFront 事件触发 Lambda 函数时,数据都会写入到 CloudWatch Logs。如果要使用这些日志,执行角色需要权限来将数据写入 CloudWatch Logs。您可以使用预定义的 AWSLambdaBasicExecutionRole 向执行角色授予权限。

    有关 CloudWatch Logs 的更多信息,请参阅边缘函数日志

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

Lambda@Edge 的服务相关角色

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

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

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

    当您首次在 CloudFront 中添加 Lambda@Edge 触发器时,会自动创建一个名为 AWSServiceRoleForLambdaReplicator 的角色,以允许 Lambda@Edge 将函数复制到 AWS 区域。使用 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 使用两个名为 AWSServiceRoleForLambdaReplicatorAWSServiceRoleForCloudFrontLogger 的服务相关角色。以下部分介绍了其中的每个角色的权限。

Lambda Replicator 的服务相关角色权限

此服务相关角色允许 Lambda 将 Lambda@Edge 函数复制到AWS 区域。

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 对指定的 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 函数复制到 AWS 区域。

    如果您删除服务相关角色,则在分配中为 Lambda@Edge 添加新触发器时,将再次创建该角色。

  • 在更新或创建具有 Lambda@Edge 关联的 CloudFront 分配时,该服务会创建 AWSServiceRoleForCloudFrontLogger 角色(如果该角色尚不存在)。该角色允许 CloudFront 将日志文件推送到 CloudWatch。

    如果删除服务相关角色,在更新或创建具有 Lambda@Edge 关联的 CloudFront 分配时,将再次创建该角色。

要手动创建这些服务相关角色,可以运行以下 AWS Command Line Interface(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 用户指南》 中的编辑服务相关角色

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

CloudFront 支持在以下AWS 区域对 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)