Lambda 执行角色 - AWS Lambda

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

Lambda 执行角色

Lambda 函数的执行角色是一个 AWS Identity and Access Management (IAM) 角色,用于向函数授予访问AWS服务和资源的权限。例如,您可以创建一个执行角色,该角色有权向 Amazon 发送日志 CloudWatch 并将跟踪数据上传到AWS X-Ray。此页面提供有关如何创建、查看和管理 Lambda 函数执行角色的信息。

您在创建函数时提供一个执行角色。在调用函数时,Lambda 会通过代入此角色自动为函数提供临时凭证。您无需在函数代码中调用 sts:AssumeRole

为了让 Lambda 正确担任执行角色,该角色的信任策略必须将 Lambda 服务主体(lambda.amazonaws.com)指定为可信服务。

查看函数的执行角色
  1. 打开 Lamba 控制台的函数页面

  2. 选择一个函数的名称。

  3. 选择 Configuration(配置),然后选择 Permissions(权限)。

  4. Resource summary(资源摘要)下,查看函数可访问的服务和资源。

  5. 从下拉列表中选择一个服务以查看与该服务相关的权限。

可以随时在函数的执行角色中添加或删除权限,或配置您的函数以使用不同的角色。为您的函数使用AWS开发工具包调用的任何服务以及为 Lambda 用来启用可选功能的服务添加权限。

向函数添加权限时,请也更新其代码或配置。这会强制停止并替换函数的具有过时凭证的运行实例。

在 IAM 控制台中创建执行角色

预设情况下,当您在 Lambda 控制台中创建函数时,Lambda 会创建具有最少权限的执行角色。您也可以在 IAM 控制台中创建执行角色。

在 IAM 控制台中创建执行角色
  1. 在 IAM 控制台中,打开 Roles(角色)页面。

  2. 选择 Create role(创建角色)。

  3. Use case(使用案例)下,选择 Lambda

  4. 选择下一步

  5. 选择AWS托管策略AWSLambdaBasicExecutionRoleAWSXRayDaemonWriteAccess

  6. 选择下一步

  7. 输入角色名称,然后选择创建角色

有关详细说明,请参阅 IAM 用户指南中的为AWS服务(控制台)创建一个角色

授予对 Lambda 执行角色的最低访问权限

在开发阶段首次为 Lambda 函数创建 IAM 角色时,有时授予的权限可能超出所需权限。在生产环境中发布函数之前,最佳实践是调整策略,使其仅包含所需权限。有关更多信息,请参阅《IAM 用户指南》中的应用最低权限许可

使用 IAM 访问分析器帮助确定 IAM 执行角色策略所需的权限。IAM 访问分析器将检查您指定的日期范围内的 AWS CloudTrail 日志,并生成仅具有该函数在该时间内使用的权限的策略模板。您可以使用模板创建具有精细权限的托管策略,然后将其附加到 IAM 角色。这样,您仅需授予角色与特定使用案例中的 AWS 资源进行交互所需的权限。

有关更多信息,请参阅《IAM 用户指南》中的基于访问活动生成策略

使用 IAM API 管理角色

要使用 AWS Command Line Interface (AWS CLI) 创建执行角色,请使用 create-role 命令。在使用此命令时,您可以指定内联信任策略。角色的信任策略会向指定主体授予代入该角色的权限。在以下示例中,您向 Lambda 服务主体授予代入角色的权限。请注意,JSON 字符串中对转义引号的要求可能因 shell 而异。

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

您还可以使用单独的 JSON 文件为角色定义信任策略。在下面的示例中,trust-policy.json 是位于当前目录中的一个文件。

例 trust-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json

您应看到以下输出:

{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }
注意

当您调用函数时,Lambda 会自动代入您的执行角色。您应该避免在函数代码中手动调用 sts:AssumeRole。如果您的使用案例要求角色能代入自己,则必须将角色本身作为可信主体包含在角色的信任策略中。有关如何修改角色信任策略的更多信息,请参阅《IAM 用户指南》中的修改角色信任策略(控制台)

要向角色添加权限,请使用 attach-policy-to-role 命令。首先添加 AWSLambdaBasicExecutionRole 托管策略。

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

临时安全凭证的会话持续时间

Lambda 会代入与您的函数关联的执行角色以获取临时安全凭证,这些凭证随后可在函数调用期间作为环境变量使用。如果您在 Lambda 之外使用这些临时凭证,例如创建预签名的 Amazon S3 URL,则无法控制会话持续时间。IAM 最长会话持续时间设置不适用于由 AWS 服务(例如 Lambda)代入的会话。如果您需要控制会话持续时间,请使用 sts: AssumeRole 操作。

Lambda 功能的AWS托管式策略

以下 AWS 托管式策略提供使用 Lambda 函数所需的权限。

更改 描述 日期

AWSLambdaMSKExecutionRole— Lambda 为此策略添加了 kafka: DescribeCluster V2 权限。

AWSLambdaMSKExecutionRole授予读取和访问亚马逊托管流媒体for Apache Kafka(亚马逊 MSK)集群的记录、管理弹性网络接口 (ENI) 和写入日志的权限。 CloudWatch

2022 年 6 月 17 日

AWSLambdaBasicExecutionRole— Lambda 已开始跟踪此政策的变更。

AWSLambdaBasicExecutionRole 授予将日志上传至 CloudWatch 的权限。

2022 年 2 月 14 日

AWSLambdaDynamoDBExecutionRole— Lambda 已开始跟踪此政策的变更。

AWSLambdaDynamoDBExecutionRole授予从 Amazon DynamoDB 流中读取记录和写入日志的权限。 CloudWatch

2022 年 2 月 14 日

AWSLambdaKinesisExecutionRole— Lambda 已开始跟踪此政策的变更。

AWSLambdaKinesisExecutionRole授予从 Amazon Kinesis 数据流读取事件和写入日志的 CloudWatch 权限。

2022 年 2 月 14 日

AWSLambdaMSKExecutionRole— Lambda 已开始跟踪此政策的变更。

AWSLambdaMSKExecutionRole授予读取和访问亚马逊托管流媒体for Apache Kafka(亚马逊 MSK)集群的记录、管理弹性网络接口 (ENI) 和写入日志的权限。 CloudWatch

2022 年 2 月 14 日

AWSLambdaSQSQueueExecutionRole— Lambda 已开始跟踪此政策的变更。

AWSLambdaSQSQueueExecutionRole授予读取亚马逊简单队列服务 (Amazon SQS) 队列中的消息和写入日志的权限。 CloudWatch

2022 年 2 月 14 日

AWSLambdaVPCAccessExecutionRole— Lambda 已开始跟踪此政策的变更。

AWSLambdaVPCAccessExecutionRole授予在 Amazon VPC 内管理 ENI 和写入 CloudWatch 日志的权限。

2022 年 2 月 14 日

AWSXRayDaemonWriteAccess— Lambda 已开始跟踪此政策的变更。

AWSXRayDaemonWriteAccess 授予将跟踪数据上传到 X-Ray 的权限。

2022 年 2 月 14 日

CloudWatchLambdaInsightsExecutionRolePolicy— Lambda 已开始跟踪此政策的变更。

CloudWatchLambdaInsightsExecutionRolePolicy授予向 CloudWatch Lambda Insights 写入运行时指标的权限。

2022 年 2 月 14 日

AmazonS3 ObjectLambdaExecutionRolePolicy — Lambda 已开始跟踪该政策的变更。

AmazonS3ObjectLambdaExecutionRolePolicy授予与亚马逊简单存储服务 (Amazon S3) Simple S3 对象 Lambda 交互和写入日志的权限。 CloudWatch

2022 年 2 月 14 日

对于某些功能,Lambda 控制台会尝试在客户管理型策略中向执行角色添加缺失的权限。这些策略可能会变得很多。为避免创建额外的策略,在启用功能之前,请将相关的 AWS 托管策略添加到您的执行角色。

当您使用事件源映射调用您的函数时,Lambda 将使用执行角色读取事件数据。例如,Kinesis 的事件源映射从数据流读取事件并将事件成批发送到您的函数。

当服务在您的账户中担任角色时,您的角色信任策略中可以包含 aws:SourceAccountaws:SourceArn 全局条件上下文密钥,以将对角色的访问限制为仅由预期资源生成的请求。有关更多信息,请参阅防止 AWS Security Token Service 跨服务混淆代理

可以将事件源映射用于以下服务:

除了AWS托管式策略,Lambda 控制台还提供模板,以创建包含用于额外使用案例的权限的自定义策略。当您在 Lambda 控制台中创建函数时,可以选择利用来自一个或多个模板的权限创建新的执行角色。当您从蓝图创建函数,或者配置需要访问其他服务的选项时,也会自动应用这些模板。示例模板可在本指南的GitHub存储库中找到。

使用 Lambda 执行环境凭证

您的 Lambda 函数代码通常会向其他 AWS 服务发出 API 请求。为了发出这些请求,Lambda 通过承担您的函数的执行角色来生成一组临时凭证。这些凭证在函数调用期间可用作环境变量。使用 AWS 开发工具包时,无需直接在代码中为开发工具包提供凭证。默认情况下,凭证提供程序链会按顺序检查每个可以设置凭证的位置,然后选择第一个可用位置,通常是环境变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN)。

如果请求是来自您执行环境中的 AWS API 请求,Lambda 会将源函数 ARN 注入到凭证上下文中。Lambda 还会为其在执行环境之外代表您发出的以下 AWS API 请求注入源函数 ARN:

服务 操作 Reason
CloudWatch 日志 CreateLogGroup, CreateLogStream, PutLogEvents

将日志存储到 CloudWatch 日志日志组中

X-Ray PutTraceSegments

将跟踪数据发送到 X-Ray

Amazon EFS ClientMount

将函数连接到 Amazon Elastic File System(Amazon EFS)文件系统

使用相同执行角色在执行环境之外代表您进行的其他 AWS API 调用不包含源函数 ARN。执行环境之外的此类 API 调用示例包括:

  • 调用 AWS Key Management Service (AWS KMS) 以自动加密和解密您的环境变量。

  • 调用 Amazon Elastic Compute Cloud(Amazon EC2),为启用 VPC 的函数创建弹性网络接口(ENI)。

  • 调用 Amazon Simple Queue Service(Amazon SQS)等 AWS 服务,从设置为事件源映射的事件源进行读取。

使用凭证上下文中的源函数 ARN,您可以验证对您的资源的调用是否来自特定 Lambda 函数的代码。要对此进行验证,请在 IAM 基于身份的策略或服务控制策略(SCP)中使用 lambda:SourceFunctionArn 条件键。

注意

您不能在基于资源的策略中使用 lambda:SourceFunctionArn 条件键。

在基于身份的策略或 SCP 中使用此条件键,您可以为您的函数代码对其他 AWS 服务执行的 API 操作实施安全控制。这有一些关键的安全应用程序,例如帮助您识别凭证泄漏的来源。

注意

lambda:SourceFunctionArn 条件键与 lambda:FunctionArnaws:SourceArn 条件键不同。lambda:FunctionArn 条件键仅适用于事件源映射,并帮助定义您的事件源可以调用哪些函数。aws:SourceArn 条件键仅适用于以您的 Lambda 函数为目标资源的策略,并帮助定义哪些其他 AWS 服务和资源可以调用该函数。lambda:SourceFunctionArn 条件键可应用于任何基于身份的策略或 SCP,以定义有权对其他资源进行特定 AWS API 调用的特定 Lambda 函数。

要在您的策略中使用 lambda:SourceFunctionArn,请将其作为条件包含在任何 ARN 条件运算符中。密钥的值必须是有效的 ARN。

例如,假设您的 Lambda 函数代码进行了针对特定 Amazon S3 存储桶的 s3:PutObject 调用。您可能希望仅允许一个特定 Lambda 函数让 s3:PutObject 访问该存储桶。在这种情况下,您的函数的执行角色应附加如下所示的策略:

例 授予特定 Lambda 函数访问 Amazon S3 资源的权限的策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleSourceFunctionArn", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::lambda_bucket/*", "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda" } } } ] }

如果源是具有 ARN arn:aws:lambda:us-east-1:123456789012:function:source_lambda 的 Lambda 函数,则此策略仅允许 s3:PutObject 访问。此策略不允许 s3:PutObject 访问任何其他调用身份。即使不同的函数或实体使用相同的执行角色进行 s3:PutObject 调用也是如此。

注意

lambda:SourceFunctionARN 条件键不支持 Lambda 函数版本或函数别名。如果您将 ARN 用于特定函数版本或别名,则函数将无权执行您指定的操作。确保使用函数的非限定 ARN(不带版本或别名后缀)。

您还可以在服务控制策略中使用 lambda:SourceFunctionArn。例如,假设您希望将对存储桶的访问限制为单个 Lambda 函数的代码或来自特定 Amazon 虚拟私有云(VPC)的调用。以下 SCP 对此进行了说明。

例 在特定条件下拒绝访问 Amazon S3 的策略
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::lambda_bucket/*", "Effect": "Deny", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": [ "vpc-12345678" ] }, "ArnNotEqualsIfExists": { "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda" } } } ] }

此策略将拒绝所有 S3 操作,除非它们来自具有 ARN arn:aws:lambda:*:123456789012:function:source_lambda 的特定 Lambda 函数,或者它们来自指定的 VPC。StringNotEqualsIfExists 运算符告诉 IAM 仅当请求中存在 aws:SourceVpc 键时才处理此条件。同样,仅当存在 lambda:SourceFunctionArn 时,IAM 才会考虑 ArnNotEqualsIfExists 运算符。