0. はじめに
こんにちは、yuzu_juiceです🥂
最近、Lambdaをコンテナで動かせることを知り、いろいろ遊んでいました。
1. 発生した事象
コンテナからデプロイしたLambdaを実行したところ、CloudWatchのログに以下のエラーが出ました。
INIT_REPORT Init Duration: 10028.26 ms Phase: init Status: timeout
2. 正しかった対応方法
Lambdaのコンソールから、環境変数を設定しました。
ローカルでテストしていた際はコードがDockerfileに設定した環境変数を参照していたため、Lambdaにデプロイ後もDockerfileに書いた環境変数が参照されるだろう、と思っていました。
実際は、コンテナからデプロイされたLambda関数は、Dockerfileの環境変数を読まず、Lambda側の環境変数を読み込むようです。
3. 試したけどうまくいかなかったこと
Lambdaタイムアウト値の変更
Lambdaがタイムアウトしているのだと思い、「Lambda関数→設定→一般設定→タイムアウト」からタイムアウト値を変更して対応しようとしました。
タイムアウト値はデフォルトで3秒になっているので、エラーログに出力されていた10028.26 ms(約10秒)以上に設定してみます。
結果
変わらず、タイムアウトのエラーが解消されませんでした。
タイムアウトの変更では何がダメだったか
Lambdaの実行には、以下4つのフェーズがあります。
- Init phase (初期化フェーズ)
- Restore phase (復元フェーズ)
- Invoke phase (呼び出しフェーズ)
- Shudown phase (シャットダウンフェーズ)
参考ドキュメント:Lambda 実行環境のライフサイクル
今回は、このInit phaseでタイムアウトが発生していたようです。
そして、上で試したタイムアウト時間の延長は、Invoke phaseでのタイムリミットを設定するものであり、Init phaseのタイムアウト時間には関係がないようです。
4. 最後に
一見エラーログを見ただけでは根本原因がつかみにくい事象だったのでかなり焦りましたが、解決できたことでまた少しAWSの力が付いたと思います💪
この記事が同じ事象で困った人の助けになれば幸いです!