如何解决 Lambda 错误:"The final policy size is bigger than the limit"?

上次更新时间:2020 年 4 月 14 日

当我设置触发器以调用 AWS Lambda 函数时,遇到错误:"The final policy size is bigger than the limit"。如何解决此错误?

简短描述

当您尝试将策略语句添加到 Lambda 函数基于资源的策略时,可能出现此错误。如果添加的策略语句导致策略的大小超过其上限值 20 KB,则会发生错误,并且语句不会添加。当您使用 add-permission 命令手动添加,或者为需要权限才能访问您的函数的其他服务创建资源时,会出现这种情况。

删除重复的策略语句并将其替换为使用通配符 (*) 的合并语句,可减小策略的大小。

有关更多信息,请参阅 AWS Lambda 限制清理基于资源的策略

解决方法

查看函数的基于资源的策略

注意:在以下命令中,将 my-function 替换为函数的名称或 Amazon 资源名称 (ARN)

1.    在 AWS 命令行界面 (AWS CLI) 中使用 get-policy 命令获取并查看您的 Lambda 函数基于资源的策略:

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

您还可以在 get-policy 命令中使用命令行 JSON 处理器 jq 编写高级查询。

注意:有关下载和安装 jq 的说明,请在 GitHub 参阅 jq 网站上的下载 jq

例如,您可以使用 jq 来格式化策略:

$ aws lambda get-policy --function-name my-function | jq '.Policy|fromjson'

要查看策略的大小:

$ aws lambda get-policy --function-name my-function | jq -r '.Policy' | wc -c

注意:如果此命令的输出值接近 20480 (20 KB),则在尝试添加更多策略语句时可能会发生大小错误。

要获取特定策略语句的语句 ID (Sid)

$ aws lambda get-policy --function-name my-function | jq '.Policy 
| fromjson 
| .Statement[] 
| select(.Principal.Service=="events.amazonaws.com") 
| .Sid'

注意:events.amazonaws.com 替换为可调用您的函数的 AWS 服务。

或者获取名称以相同字符串开头的资源的 Sid:

$ 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'

注意:arn:aws:events:region:account-id:rule/test- 替换为资源的 ARN 在多个重复的策略语句中共享的字符串。

2.    在基于资源的策略中,标识可以用通配符替换的策略语句。请标记每个策略语句的 Sid。

删除策略语句

可使用 remove-permission 命令删除您在上一步中标记的每个策略语句:

$ aws lambda remove-permission --function-name my-function --statement-id sid

注意:请将 my-function 替换为您的函数的名称或 ARN。将 sid 替换为策略语句的 Sid

添加使用通配符的策略语句

可使用 add-permission 命令添加包含通配符 (*) 的合并的新策略语句。例如:

$ 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-*'

注意:请将 my-function 替换为您的函数的名称或 ARN。将 sid 替换为任何值的新 Sid。将 events.amazonaws.com 替换为可调用您的函数的 AWS 服务或账户主体。将 arn:aws:events:region:account-id:rule/test-* 替换为您授予权限的资源共享的 ARN 字符串(加通配符)。

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