如何解决 Lambda 中的错误“最终策略大小超出限制”?

上次更新日期:2021 年 4 月 14 日

当我设置触发器以调用 AWS Lambda 函数时,遇到错误:“最终策略大小超出限制”。如何解决此错误?

简短描述

如果 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 示例

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

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

使用 jq 获取名称以相同字符串开头的资源的 Sid 的 get-policy 示例

$ 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 CLI 命令以删除每个重复的策略声明:

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

注意:请将 my-function 替换为您的函数的名称或 ARN。将 sid 替换为要删除的策略声明的 Sid

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

运行以下 add-permission AWS CLI 命令以添加包含通配符 (*) 的合并后的新策略语句。

$ 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 服务的权限