Lambda の「The final policy size is bigger than the limit」エラーを解決する方法を教えてください。

最終更新日: 2021 年 4 月 14 日

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 のクォータ」と「リソースベースポリシーのクリーンアップ」を参照してください。

解決方法

注: 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 ウェブサイトで「Download 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 のサービスへのアクセス権を関数に付与する」を参照してください。