当我设置触发器以调用 AWS Lambda 函数时,会出现“The final policy size is bigger than the limit”错误。
简短描述
如果 Lambda 函数的基于资源的策略超过 20 KB,则 Lambda 会返回**“The final policy size is bigger than the limit”**错误。
当通过执行以下任一操作将策略语句添加到函数的基于资源的策略时,可能会发生错误:
要解决此错误,请删除重复的策略语句并将其替换为使用通配符(*) 的合并语句,从而减小函数的策略大小。有关更多信息,请参阅 Lambda quotas 和 Cleaning up resource-based policies。
解决方法
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保使用的是最新版本的 AWS CLI。
查看函数的基于资源的策略
**注意:**对于以下命令,请将 my-function 替换为函数名称或 Amazon 资源名称(ARN)。
1.运行以下 get-policy AWS CLI 命令,以查找并查看 Lambda 函数的基于资源的策略:
$ aws lambda get-policy --function-name my-function
**注意:**您还可以在 get-policy 命令中使用命令行 JSON 处理器 **jq ** 来编写高级查询。有关如何下载和安装 jq 的信息,请前往 GitHub 参阅 jq 网站上的下载 jq。
使用 jq 将 Lambda 函数的策略格式化为 JSON 文件的 get-policy 命令示例
$ aws lambda get-policy --function-name my-function | jq '.Policy|fromjson'
使用 jq 查找 Lambda 函数策略大小的 get-policy 命令示例
$ aws lambda get-policy --function-name my-function | jq -r '.Policy' | wc -c
使用 jq 查找特定策略语句的语句 ID(Sid)的 get-policy 命令示例
将 events.amazonaws.com 替换为可调用您函数的 AWS 服务。
$ aws lambda get-policy --function-name my-function | jq '.Policy
| fromjson
| .Statement[]
| select(.Principal.Service=="events.amazonaws.com")
| .Sid'
使用 jq 获取名称以相同字符串开头的资源的 Sid 的 get-policy 命令示例
将 arn:aws:events:region:account-id:rule/test- 替换为由多个重复策略语句中的资源 ARN 共享的字符串。
$ aws lambda get-policy --function-name my-function | jq '.Policy
| fromjson
| .Statement[]
| select(.Condition.ArnLike."AWS:SourceArn" | startswith("arn:aws:events:region:account-id:rule/test-"))
| .Sid'
2.在基于资源的策略中,确定可以用通配符替换的策略语句。记下各策略语句的 Sid。
删除重复的策略语句
运行以下 remove-permission AWS CLI 命令以删除每条重复的策略语句。请将 my-function 替换为函数名称或 ARN。将 sid 替换为要删除的策略语句的 Sid。
$ aws lambda remove-permission --function-name my-function --statement-id sid
添加使用通配符(*)的策略语句
运行以下 add-permission AWS CLI 命令以添加包含通配符(*)的新合并策略语句,将 my-function 替换为函数名称或 ARN。将 sid 替换为任何值的新 Sid。将 events.amazonaws.com 替换为可调用您函数的 AWS 服务或账户主体。将 arn:aws:events:region:account-id:rule/test-* 替换为您授权的资源共享的 ARN 字符串(加上通配符)。
$ aws lambda add-permission --function-name my-function \
--statement-id 'sid' \
--action 'lambda:InvokeFunction' \
--principal 'events.amazonaws.com' \
--source-arn 'arn:aws:events:region:account-id:rule/test-*'
注意: 基于资源的策略中带有通配符的触发器可能在 Lambda 控制台中不可见。有关更多信息,请参阅 Event-driven invocation。
有关详细信息,请参阅 Granting function access to AWS services。
相关信息
IAM JSON 策略元素:Resource
控制 AWS CLI 的命令输出(AWS CLI 用户指南)
为什么我的 Amazon S3 事件通知不调用 Lambda 函数?
如何使用 Lambda 以固定间隔停止和启动 Amazon EC2 实例?