Lambdaがいきなり実行できなくなった時の対処
経緯
Lambdaは昨今、様々なユースケースで利用されることが増えてきており、実際に利用されている人もとても多い印象です。自分はTerraformでプロビジョニングを行っていますが、エンハンス開発などで機能追加を行ったりしていると、以前は動いていたのに、、、なぜいきなりLambdaが実行できないんだ。というケースが複数回有りました。
かなり微妙ですが、最初に発生していた頃はLambdaを削除してもう一度Terraform流して動いたらそれでいいや。と問題を先送りにしていたのですがPruductionのリリースなどがうっすら見えてくるとリリース本番でこれが発生したら冷や汗モノだな・・・と思うようになりました。
ということで流石にもう少しきちんと調査して、発生した場合のアクションを決めておこうと思った軌跡をメモします。
遭遇したケースの詳細
Status Code: 502; Error Code: KMSAccessDeniedException; RequestId: ***
このように502で、KMSAccessDeniedExceptionが発生したと言われます。
正直ナンノコッチャでした。
自分が今回遭遇したケースは、AmazonConnectからLambdaを実行する場合ですが、
他のサービス経由で実行した場合も同様の理由でエラーになることはあるのだろうと考えています。
調査
調査をすすめると、AWSの公式ページにそれらしい案内がありました。
- Lambda 関数が失敗する場合のトラブルシューティング方法を教えてください。
- AWS Lambda からの HTTP 502 および HTTP 500 ステータスコード (サーバー側) エラーをトラブルシューティングする方法を教えてください。
まさに!!なページでした。
上記を読みすすめると、以下の部分が今回自分の遭遇したケースに該当しそうです。
KMSAccessDeniedException エラーは、通常、Lambda 関数の IAM ロールが削除され、同じ名前で再作成されたときに発生します。これが起こった場合は、関数の新しい IAM ロールを設定します。その後、関数を再度デプロイし、以前の IAM ロールを再設定します。
なるほど、確かにLambdaの実行ロールであるIAMロールをTerraformで作成しており、replaceなどが走ったような記憶がありますのでこれに違いないと考えました。
対処
まずは、マネジメントコンソールでLambdaの実行ロールで同じIAMロールを再度設定しました。
これは既に設定されているものと同じものではありますが、保存ボタンを押すことでなんらかの更新が入ることを期待しました。
→ 結果不発です。
次に、案内の通り一時的にお隣のLambda関数実行ロール用のIAMロールを設定して保存した後、
もう一度オペレーションをして元に戻しました。
→ 結果Lambdaは正常に実行できるようになりました!
Productionリリースを見据えた場合、マネジメントコンソールでのオペレーションを手順として伝えるのはとても難しく有効ではないので、AWS CLI で同様のことを行えるように備えておきます。
-
aws lambda get-function --function-name {関数名}
を実行して情報取得を行い、現時点のRoleのARNをメモします。 -
aws lambda get-function --function-name {お隣の関数名}
を実行して情報取得を行い、現時点のRoleのARNをメモします。 -
aws lambda update-function-configuration --function-name {関数名} --role {一時的に変更するIAMロールのARN}
を実行して一時的に切り替えます。 -
aws lambda update-function-configuration --function-name {関数名} --role {元のIAMロールのARN}
を実行して元に戻します。
これで他の人への手順伝達もそれなりの精度で行えると思います。
最後に
なにか間違った情報がありましたら、ご指摘いただけると幸いです。
間違った情報を拡散しないように修正いたします。
Discussion