Lambda エラー「最終ポリシーサイズが制限を超えています」を解決する方法を教えてください。

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

AWS Lambda 関数を呼び出すトリガーを設定すると、「最終ポリシーサイズが制限を超えています」というエラーが表示されます。どうすればこのエラーを解決できますか?

簡単な説明

このエラーは、Lambda 関数のリソースベースのポリシーにポリシーステートメントを追加しようとした時に発生することがあります。追加されたポリシーステートメントがポリシーの最大サイズである 20 KB を超えるとエラーが発生し、ステートメントは追加されません。手動で add-permission コマンドを使用している場合や、関数にアクセスするためのアクセス許可が必要な他のサービスのリソースを作成する時に発生することがあります。

繰り返しポリシーステートメントを削除し、ワイルドカード (*) を使用する統合ステートメントに置き換えることで、ポリシーのサイズを減らします。

詳細については、AWS Lambda の制限リソースベースポリシーのクリーンアップを参照してください。

解決方法

関数のリソースベースポリシーを確認する

注意: 次のコマンドでは、my-function を関数の名前または Amazon リソースネーム (ARN) に置き換えます。

1.    AWS コマンドラインインターフェイス (AWS CLI) から get-policy コマンドを使用して、Lambda 関数のリソースベースポリシーを取得して確認します。

$ aws lambda get-policy --function-name my-function

get-policy コマンドでコマンドライン JSON プロセッサ jq を使用して、高度なクエリを記述することもできます。

注意: jq をダウンロードしてインストールする手順については、GitHub にある jq ウェブサイトで [jq をダウンロード] を参照してください。

たとえば、jq を使用してポリシーのフォーマットを指定できます。

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

ポリシーサイズの表示方法:

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

注意: このコマンドの出力値が 20480 (20 KB) に近い場合、ポリシーステートメントを追加しようとすると、サイズエラーが発生することがあります。

特定のポリシーステートメントのステートメント ID (Sid) を取得する方法:

$ aws lambda get-policy --function-name my-function | jq '.Policy 
| fromjson 
| .Statement[] 
| select(.Principal.Service=="events.amazonaws.com") 
| .Sid'

注意: events.amazonaws.com を、関数を呼び出す AWS サービスに置き換えます。

また、同じ文字列で始まる名前を持つリソースの Sid を取得するには、次のようにします。

$ 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 lambda remove-permission --function-name my-function --statement-id sid

注意: my-function は、お使いの関数の名前または ARN に置き換えてください。sid をポリシーステートメントの Sid に置き換えます。

ワイルドカードを使用するポリシーステートメントを追加する

add-permission コマンドを使用して、ワイルドカード (*) を含む新しい統合ポリシーステートメントを追加します。例:

$ 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 サービスへの関数アクセスの付与を参照してください。