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 コマンドの例
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 サービスへのアクセスを付与する」を参照してください。
関連情報
IAM JSON ポリシーエレメント:リソース
AWS CLI からのコマンド出力の制御 (AWS CLI ユーザーガイド)
Amazon S3 イベント通知で Lambda 関数が呼び出されないのはなぜですか?
Lambda を使用して Amazon EC2 インスタンスを定期的に停止および起動するにはどうすればいいですか?