授予 Lambda 函数访问 AWS 服务 的权限
当您使用 AWS 服务调用您的函数时,可以用基于资源的策略语句授权。您可以将语句应用于整个函数,也可以将语句限制为单个版本或别名。
注意
当您通过 Lambda 控制台向函数添加触发器时,该控制台会更新函数的基于资源的策略以允许服务调用它。要向 Lambda 控制台中不可用的其他账户或服务授予权限,可以使用 AWS CLI。
建议使用 put-resource-policy 定义完整 JSON 策略。您借助 put-resource-policy 添加拒绝语句、使用全部 IAM 条件键,并在单个文档内统一管理所有权限。对于简单使用案例,您还可通过 add-permission 添加单独语句。
重要
使用 put-resource-policy 将替换该资源上所有现有的基于资源的策略。若资源已通过 add-permission 定义了权限,则 put-resource-policy 会覆盖这些权限。进行修改前,请使用 get-resource-policy 获取现有策略。
使用完整 JSON 策略(推荐)
以下示例策略授予 Amazon Simple Notification Service 调用名为 my-function 的函数的权限,但仅允许来自特定主题的调用。该策略还拒绝来自另一特定主题的调用。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-sns-my-topic", "Effect": "Allow", "Principal": { "Service": "sns.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:my-topic" } } }, { "Sid": "deny-sns-other-topic", "Effect": "Deny", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:123456789012:function:my-function", "arn:aws:lambda:us-east-2:123456789012:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:restricted-topic" } } } ] }
将策略保存至名为 put-resource-policy 的文件,然后通过 policy.json 应用:
aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function\ --policy file://policy.json
对于 Amazon S3,源为 ARN 不包含账户 ID 的存储桶。您删除存储桶后,其他账户有可能使用相同名称新建存储桶。使用 aws:SourceAccount 条件键,确保仅账户内的资源可调用该函数:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }
使用 add-permission
对于简单使用案例,您可借助 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"}
注意
若在 put-resource-policy 之后调用 add-permission,新语句将附加至现有 JSON 策略。
如需将调用限制至特定资源,请使用 source-arn 选项:
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
对于 Amazon S3,请结合账户 ID 使用 source-account 选项:
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-account123456789012