如何解决 Lambda 中的错误“The final policy size is bigger than the limit(最终策略大小超出限制)”?

2 分钟阅读
0

当我设置触发器以调用 AWS Lambda 函数时,出现错误:“The final policy size is bigger than the limit(最终策略大小超出限制)”。如何解决此错误?

简短描述

如果 Lambda 函数的基于资源的策略超过 20 KB,则 Lambda 将返回最终策略大小超出限制错误。

当您通过执行以下任一操作将策略语句添加到函数的基于资源的策略时,可能会出现此错误:

要解决此错误,请删除重复的策略语句并将其替换为使用通配符 (*) 的合并语句,以减小函数的策略大小。有关更多信息,请参阅 Lambda 配额清理基于资源的策略

解决方法

注意:如果您在运行 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 控制台中可能不可见。有关更多信息,请参阅事件驱动型调用

有关更多信息,请参阅授予函数访问 AWS 服务的权限


相关信息

IAM JSON 策略元素:资源

控制 AWS CLI 的命令输出(AWS CLI 用户指南)

为什么我的 Amazon S3 事件通知不调用 Lambda 函数?

如何使用 Lambda 按固定间隔停止和启动 Amazon EC2 实例?

相关视频

AWS 官方
AWS 官方已更新 2 年前