授予 Lambda 函数访问 AWS 服务的权限 - AWS Lambda

授予 Lambda 函数访问 AWS 服务的权限

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

注意

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

使用 add-permission 命令添加一条语句。最简单的基于资源的策略语句是允许一个服务调用某个函数。以下命令授予 Amazon Simple Notification Service 调用名为 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 在函数上调用 Invoke API 操作,但不会限制触发调用的 Amazon SNS 主题。为确保您的函数只被特定资源调用,请使用 source-arn 选项指定资源的 Amazon Resource Name (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 的存储桶。有可能是您删除了该存储桶,而另一个账户用同样的名称创建了这样一个存储桶。使用 source-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:::amzn-s3-demo-bucket \ --source-account 123456789012