AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

对 AWS Lambda 使用基于资源的策略(Lambda 函数策略)

Lambda 函数是 AWS Lambda 中的资源之一。您可以将权限添加到与 Lambda 函数关联的策略。附加到 Lambda 函数的权限策略称作基于资源的策略(在 Lambda 中,称作 Lambda 函数策略)。可以使用 Lambda 函数策略来管理 Lambda 函数调用权限(请参阅 Invoke)。

重要

在创建基于资源的策略之前,建议您首先阅读以下介绍性主题,这些主题讲解了管理 AWS Lambda 资源访问的基本概念和选项。有关更多信息,请参阅 管理您的 AWS Lambda 资源的访问权限概述

Lambda 函数策略主要是在以下情况下使用:您在 AWS Lambda 中设置事件源以向服务或事件源授予调用 Lambda 函数的权限(请参阅 Invoke)。此情况的一个例外是在事件源(例如 Amazon DynamoDB 或 Kinesis)使用拉模式(其中,权限改为在 Lambda 函数执行角色中进行管理)的情况下。有关更多信息,请参阅 事件源映射

此外,可利用 Lambda 函数策略轻松授予跨账户权限来调用 Lambda 函数。假设您希望授予跨账户权限(例如,对 Amazon S3 的权限)来调用 Lambda 函数。您可以在 Lambda 函数策略中添加相关权限,而不是创建 IAM 角色来授予跨账户权限。

注意

如果自定义应用程序及其调用的 Lambda 函数属于同一 AWS 账户,则无需使用附加到 Lambda 函数的策略来授予显式权限。

AWS Lambda 提供以下 API 操作来管理与 Lambda 函数关联的权限策略:

注意

利用 AWS Lambda 控制台在 Lambda 函数策略中管理事件源及其权限是最轻松的。如果事件源的 AWS 服务控制台支持配置事件源映射,则也可使用该控制台。在配置新的事件源或修改现有事件源时,控制台将自动修改与 Lambda 函数关联的权限策略。

使用控制台在函数的详细信息页面选择 Triggers 选项卡,然后选择 View function policy,可以查看函数策略。控制台不支持直接在函数策略中修改权限。您必须使用 AWS CLI 或 AWS 开发工具包。以下是本主题中之前列出的 API 操作的 AWS CLI 示例:

示例 1:允许 Amazon S3 调用 Lambda 函数

要向 Amazon S3 授予调用 Lambda 函数的权限,您可配置如下权限:

  • s3.amazonaws.com 指定为 principal 值。

  • 指定 lambda:InvokeFunction 作为授予其权限的 action

要确保从特定 AWS 账户拥有的特定存储桶中生成事件,您还可以:

  • 指定存储桶 ARN 作为 source-arn 值以限制特定存储桶中的事件。

  • 指定拥有存储桶的 AWS 账户 ID 以确保指定的存储桶由账户所有。

以下示例 AWS CLI 命令将权限添加到 helloworld Lambda 函数策略,用来向 Amazon S3 授予调用该函数的权限。

Copy
aws lambda add-permission \ --region us-west-2 \ --function-name helloworld \ --statement-id 1 \ --principal s3.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:s3:::examplebucket \ --source-account 111111111111 \ --profile adminuser

该示例假定 adminuser(具有完全权限)正在添加此权限。因此,--profile 参数指定 adminuser 配置文件。

作为响应,AWS Lambda 返回以下 JSON 代码。Statement 值是已添加到 Lambda 函数策略的语句的 JSON 字符串版本。

Copy
{ "Statement": "{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"111111111111\"}, \"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::examplebucket\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:111111111111:function:helloworld\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"}, \"Sid\":\"1\"}" }

有关推模型的信息,请参阅事件源映射

示例 2:允许 Amazon API Gateway 调用 Lambda 函数

要授予权限以允许 Amazon API Gateway 调用 Lambda 函数,请执行以下操作:

  • apigateway.amazonaws.com 指定为 principal 值。

  • 指定 lambda:InvokeFunction 作为授予其权限的 action。

  • 指定 API 网关 终端节点 ARN 作为 source-arn 值。

以下示例 AWS CLI 命令将权限添加到 helloworld Lambda 函数策略,用来向 API 网关 授予调用该函数的权限。

Copy
aws lambda add-permission \ --region us-west-2 \ --function-name helloworld \ --statement-id 5 \ --principal apigateway.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:execute-api:region:account-id:api-id/stage/method/resource-path \ --profile adminuser

作为响应,AWS Lambda 返回以下 JSON 代码。Statement 值是已添加到 Lambda 函数策略的语句的 JSON 字符串版本。

Copy
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:apigateway:us-east-1::my-api-id:/test/petstorewalkthrough/pets\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"apigateway.amazonaws.com\"}, \"Sid\":\"5\"}" }

示例 3:允许另一个 AWS 账户创建的用户应用程序调用 Lambda 函数(跨账户方案)

要向另一个 AWS 账户授予权限(即,创建跨账户方案),您需要指定 AWS 账户 ID 作为 principal 值,如以下 AWS CLI 命令中所示:

Copy
aws lambda add-permission \ --region us-west-2 \ --function-name helloworld \ --statement-id 3 \ --principal 111111111111 \ --action lambda:InvokeFunction \ --profile adminuser

作为响应,AWS Lambda 返回以下 JSON 代码。Statement 值是已添加到 Lambda 函数策略的语句的 JSON 字符串版本。

Copy
{ "Statement": "{\"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"account-id\"}, \"Sid\":\"3\"}" }

示例 4:检索 Lambda 函数策略

要检索 Lambda 函数策略,请使用 get-policy 命令:

Copy
aws lambda get-policy \ --function-name example \ --profile adminuser

示例 5:从 Lambda 函数策略中删除权限

要从 Lambda 函数策略中删除权限,请使用 remove-permission 命令,并指定函数名称和语句 ID:

Copy
aws lambda remove-permission \ --function-name example \ --statement-id 1 \ --profile adminuser

示例 6:使用 Lambda 函数版本控制、别名和权限

有关针对 Lambda 函数版本和别名的权限策略的更多信息,请参阅版本控制、别名和资源策略