AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS Lambda 的基于资源的策略

AWS Lambda 支持将基于资源的权限策略用于 Lambda 函数和层。基于资源的策略允许您基于资源向其他账户授予使用权限。您也可以使用基于资源的策略来允许 AWS 服务调用您的函数。

对于 Lambda 函数,您可以授予账户权限以便其可以调用或管理这些函数。可以添加多个语句来向多个账户授权,或允许任何账户调用您的函数。对于其他 AWS 服务为响应您账户中的活动而调用的函数,您可以使用策略来向服务授予调用权限

对于 Lambda 层,在层版本上使用基于资源的策略以允许其他账户使用它。除了向单个或所有账户授权的策略,对于层,您还可以向组织中的所有账户授权。

注意

只能为 AddPermissionAddLayerVersionPermission API 操作范围内的 Lambda 资源更新基于资源的策略。不能为您在 JSON 中的 Lambda 资源编写策略,或使用不映射到那些操作的参数的条件。

基于资源的策略应用于单个函数、版本、别名或层版本。它们向一个或多个服务和账户授权。对于您希望其能够访问多个资源或使用基于资源的策略不支持的 API 操作的信任账户,您可以使用跨账户角色

向 AWS 服务授予函数访问权

当您使用 AWS 服务调用您的函数时,可以用基于资源的策略语句授权。可以将该语句应用于函数,或将其限制为单个版本或别名。

注意

当您通过 Lambda 控制台向函数添加触发器时,该控制台会更新函数的基于资源的策略以允许服务调用它。要向 Lambda 控制台中不可用的其他账户或服务授予权限,请使用 AWS CLI。

使用 add-permission 命令添加一条语句。最简单的基于资源的策略语句是允许一个服务调用某个函数。以下命令授予 Amazon SNS 调用名为 my-function 的函数的权限。

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns \ --principal sns.amazonaws.com --output text {"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

这允许 Amazon SNS 调用该函数,但不限制触发调用的 Amazon SNS 主题。为确保您的函数只被特定资源调用,请使用 source-arn 选项指定资源的 Amazon 资源名称 (ARN)。以下命令只允许 Amazon SNS 调用名为 my-topic 的主题的订阅函数。

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \ --principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

有些服务可以调用其他账户中的函数。如果您指定的一个源 ARN 中包含您的账户 ID,这不是问题。但对于 Amazon S3 来说,源是其 ARN 中不包含账户 ID 的存储桶。有可能是您删除了该存储桶,而另一个账户用同样的名称创建了这样一个存储桶。使用 account-id 选项确保只有您账户中的资源可以调用该函数。

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id s3-account \ --principal s3.amazonaws.com --source-arn arn:aws:s3:::my-bucket-123456 --source-account 123456789012

向其他账户授予函数访问权

要向另一个 AWS 账户授权,请将账户 ID 指定为 principal。以下示例向账户 210987654321 授权以 prod 别名调用 my-function

$ aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 210987654321 --output text {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

要限制对另一账户中用户、组或角色的访问,请将身份的完整 ARN 指定为委托人。例如:arn:aws:iam::123456789012:user/developer

别名限制了其他账户可以调用哪个版本。它要求其他账户在函数 ARN 中包括该别名。

$ aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out { "StatusCode": 200, "ExecutedVersion": "1" }

然后,您可以根据需要更新该别名以指向新版本。当您更新别名时,其他账户不需要更改其代码以使用新版本,它仅有权调用您选择的版本。

您可以授予对作用于现有函数的任何 API 操作的跨账户访问权。例如,您可以授予 lambda:ListAliases 权限,以允许一个账户获得别名列表,或授予 lambda:GetFunction 权限,以让它们下载您的函数代码。分别添加每个权限,或使用 lambda:* 授予有关指定函数的所有操作的权限。

要授予其他账户对多个函数的权限,或不对某个函数执行的操作的权限,请使用角色

向其他账户授予层访问权

要向另一个账户授予层使用权限,请使用 add-layer-version-permission 命令向层版本的权限策略添加语句。在每个语句中,您可以向单个账户、所有账户或组织授予权限。

$ aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

权限仅适用于层的单一版本。每次创建新的层版本时都重复此过程。

要向一个组织中的所有账户授予权限,请使用 organization-id 选项。以下示例向组织中的所有账户授予层的版本 3 的使用权限。

$ aws lambda add-layer-version-permission --layer-name my-layer \ --statement-id engineering-org --version-number 3 --principal '*' \ --action lambda:GetLayerVersion --organization-id o-t194hfs8cz --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

要向所有 AWS 账户授予权限,请将 * 用于委托人并忽略组织 ID。对于多个账户或组织,请添加多个语句。

清除基于资源的策略

要查看函数的基于资源的策略,请使用 get-policy 命令。

$ aws lambda get-policy --function-name my-function --output text {"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]} 7c681fc9-b791-4e91-acdf-eb847fdaa0f0

对于版本和别名,请在函数名后面附加版本号或别名。

$ aws lambda get-policy --function-name my-function:PROD

要从函数中删除权限,请使用 remove-permission

$ aws lambda remove-permission --function-name example --statement-id sns

使用 get-layer-version-policy 命令可查看层的权限,使用 remove-layer-version-permission 可删除策略中的语句。

$ aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}" $ aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org