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」エラーを返します。

このエラーは、次のいずれかの操作を行って、関数のリソースベースのポリシーにポリシーステートメントを追加するときに発生します。

エラーを解決するには、繰り返しポリシーステートメントを削除し、ワイルドカード (*) を使用する統合ステートメントに置き換えることで、ポリシーのサイズを削減します。詳細については、「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 のサービスへのアクセス権を関数に付与する」を参照してください。