AWS Lambdaのリソースベースポリシーのサイズが上限に達して困った話


はじめに

AWS samを利用しAPI gateway + Lambdaの構成を作成していたのですが、Cloudformationの変更セットを実行中に以下のエラーを取得してしまいました。

The final policy size (20857) is bigger than the limit (20480). 
(Service: AWSLambda; Status Code: 400; Error Code: PolicyLengthExceededException; 
Request ID: xxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx)

このエラーが示す内容としては、 Lambdaのリソースベースポリシーがサイズ上限に達した ということを示しています。
この状態になるとAPIのメソッドの統合リクエストのタイプにこのLambdaを指定することが出来なくなります。

調べてみて

いくつか記事を漁っていると、以下の記事を発見しました。
Lambda エラー「最終ポリシーサイズが制限を超えています」を解決する方法を教えてください。

この記事では、複数あるリソースベースポリシーをポリシー内のリソースの指定にワイルドカードを用いることで、ポリシーのサイズを縮小する方法を説明してくれています。

とりあえず、今あるポリシーを削除して新たにワイルドカードを含むポリシーをセットしてやればいいようです。
残念ながらAWS Lambdaのリソースベースポリシーはマネジメントコンソールからは操作することが出来ないのでCLIを使って操作していきます。

追記
消す方法ありました。(笑)

トリガーでAPI Gatewayを選択すると、登録されているリソースベースポリシーがリソース単位で確認でき、ここから削除をするとポリシーからも削除できるようです!

削除のコマンド

以下のコマンドでLambdaのリソースベースポリシーを1件削除することが出来ます。
残念ながら一括で削除をすることは出来ないようです。
なので大量にある場合は二人で上下から削除していくか、諦めてLambdaを作り直すとかした方が良さそうですね。

$ aws lambda remove-permission \
--function-name my-function \
--statement-id sid

作成のコマンド

以下のコマンドでLambdaのリソースベースポリシーを1件追加することが出来ます。

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-*' 

ここで、API gatewayの指定方法がわからず詰んでいましたが、なんとか以下の指定で通すことが出来ました。
このように指定することで1個のAPIからリクエストの種類が増えても、このポリシー1つで補うことが出来ます。

aws lambda add-permission 
--function-name my-function \
--statement-id 1 \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn arn:aws:execute-api:${region}:${AWSアカウントID}:${APIの識別子}/*

samでこれをやる場合の注意点

恐らくsamに限った話ではないと思いますが、新しくワイルドカードを含むポリシーを追加後、新たにメソッドを追加したtemplateを実行すると、 追加した分の ポリシーが追加されてしまいました。放っておくと将来的に同じ事象にぶつかると思うので、逐次消すなりする必要があると思います。

最後に

APIの指定の方法がわかり、なんとか解決することが出来て良かったです。
こういったこともありえるのでAWS Lambdaは極力分割していくのが良いんでしょうね。

ではまた。

参考資料

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