跳至内容

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

2 分钟阅读
0

当我设置触发器以调用 AWS Lambda 函数时,我收到 "The final policy size is bigger than the limit" 错误。

简短描述

如果 Lambda 函数的基于资源的策略超过 20KB,则 Lambda 会返回 "The final policy size is bigger than the limit" 错误。

当您为需要权限才能访问您的函数的其他 AWS 服务创建资源时,可能会出现此错误。

**注意:**Lambda 函数基于资源的策略限制为 20KB,不可调整。

要解决此错误,请移除重复的策略语句并将其替换为使用通配符 (*) 的合并语句,从而减小函数的策略大小。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。

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

要查找并查看 Lambda 函数的基于资源的策略,请运行以下 get-policy 命令:

aws lambda get-policy --function-name your-function

**注意:**将 your-function 替换为您的函数名称或 Amazon 资源名称 (ARN)。

您还可以在 get-policy 命令中使用命令行 JSON 处理器 jq 来编写高级查询。有关如何下载和安装 jq 的信息,请参阅 jq 网站上的 Download jq(下载 jq)。

使用 jq 将 Lambda 函数的策略格式化为 JSON 文件的 get-policy 命令示例:

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

使用 jq 查找 Lambda 函数策略大小的 get-policy 命令示例:

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

使用 jq 查找特定策略语句的语句 ID (Sid) 的 get-policy 命令示例:

aws lambda get-policy --function-name your-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 your-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 共享的字符串。

在基于资源的策略中,确定可以用通配符替换的策略语句。记下各策略语句的 Sid。

移除重复的策略语句

要移除每条重复的策略语句,请运行以下 remove-permission 命令:

aws lambda remove-permission --function-name your-function --statement-id sid

**注意:**将 your-function 替换为函数名称或 ARN。将 sid 替换为要移除的策略语句的 Sid。

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

要添加包含通配符 (*) 的新合并策略语句,请运行以下 add-permission 命令:

aws lambda add-permission --function-name your-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 服务或 AWS 账户主体。将 arn:aws:events:region:account-id:rule/test-* 替换为您授权的资源共享的 ARN 字符串(加上通配符)。

有关详细信息,请参阅如何使用 Lambda 的基于资源的策略授予对 AWS 服务的访问权限?

AWS 官方已更新 1 年前