Lambda の「The final policy size is bigger than the limit」エラーを解決する方法を教えてください。
最終更新日: 2022 年 8 月 16 日
AWS Lambda 関数を呼び出すトリガーを設定すると、「The final policy size is bigger than the limit」(最終ポリシーサイズが制限を超えています) というエラーが表示されます。どうすればこのエラーを解決できますか?
簡単な説明
Lambda 関数のリソースベースのポリシーが 20 KB を超える場合、Lambda は、[The final policy size is bigger than the limit」エラーを返します。
このエラーは、次のいずれかの操作を行って、関数のリソースベースのポリシーにポリシーステートメントを追加するときに発生します。
- 手動で add-permission AWS Command Line Interface (AWS CLI) コマンドを使用する。
- 関数にアクセスするためのアクセス許可が必要なその他の AWS のサービスのリソースを作成する。
エラーを解決するには、繰り返しポリシーステートメントを削除し、ワイルドカード (*) を使用する統合ステートメントに置き換えることで、ポリシーのサイズを削減します。詳細については、「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 コマンドの例
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 のサービスへのアクセス権を関数に付与する」を参照してください。