ECR ✖️ Lambda ランタイムエラー: Runtime.ExitErrorで沼った
沼ったところ
以下2つのエラーが発生して、めちゃくちゃ沼った。
-
ランタイムエラー:
Runtime.ExitError
-
INIT_REPORT
のStatus: timeout
エラー -
ログ
Calling handler function Starting export_kintone_record.sh script Exporting kintone records Kintone records exported successfully Starting main.js script INIT_REPORT Init Duration: 9998.10 ms Phase: init Status: timeout Calling handler function Starting export_kintone_record.sh script Exporting kintone records Kintone records exported successfully Starting main.js script XMLファイルがS3に出力されました: Promise { <pending> } プロセスが終了コード 0 で終了しました。 success All INIT_REPORT Init Duration: 20841.76 ms Phase: invoke Status: error Error Type: Runtime.ExitError START RequestId: f1c70146-f1e0-4422-8a60-227080f4866b Version: $LATEST RequestId: f1c70146-f1e0-4422-8a60-227080f4866b Error: Runtime exited without providing a reason Runtime.ExitError END RequestId: f1c70146-f1e0-4422-8a60-227080f4866b REPORT RequestId: f1c70146-f1e0-4422-8a60-227080f4866b Duration: 20842.78 ms Billed Duration: 20843 ms Memory Size: 1000 MB Max Memory Used: 408 MB Calling handler function Starting export_kintone_record.sh script Exporting kintone records Kintone records exported successfully Starting main.js script INIT_REPORT Init Duration: 10002.67 ms Phase: init Status: timeout
-
ランタイムエラー:
Runtime.ExitError
Lambdaのデフォルトの初期化時間(通常は数秒)を超えると、INIT_REPORT
の Status: timeout
エラーが発生
INIT_REPORT Init Duration: 10002.67 ms Phase: init Status: timeout
-
INIT_REPORT
のStatus: timeout
エラー
プログラムが未知の理由で終了したことを示す
INIT_REPORT Init Duration: 20841.76 ms Phase: invoke Status: **error** **Error** Type: Runtime.ExitError
START RequestId: f1c70146-f1e0-4422-8a60-227080f4866b Version: $LATEST
RequestId: f1c70146-f1e0-4422-8a60-227080f4866b **Error**: Runtime exited without providing a reason Runtime.ExitError
ちなみに、Runtime.ExitError
に関して
呼び出し元でexit0で終了させたが改善せず。
実行環境
node.js18
のバージョンを指定
launch.shで以下の処理を実行
- shスクリプトでkintoneのデータをエクスポート(kintone CLI)
- 上記のkintoneデータをmain.jsで処理を回す
Docker file
FROM public.ecr.aws/lambda/nodejs:18
ENV LAMBDA_TASK_ROOT=/var/task
ENV LAMBDA_RUNTIME_DIR=/var/runtime
WORKDIR $LAMBDA_TASK_ROOT
# 依存関係のインストール
COPY src/package*.json $LAMBDA_TASK_ROOT/
RUN npm install
# cli-kintone のコピー
COPY cli-kintone $LAMBDA_RUNTIME_DIR/cli-kintone
# アプリケーションファイルのコピー
COPY src/*.js $LAMBDA_TASK_ROOT/src/
COPY src/*.sh $LAMBDA_TASK_ROOT/src/
# カスタムランタイムとエントリポイントのスクリプト
COPY bootstrap launch.sh $LAMBDA_RUNTIME_DIR/
RUN chmod 755 $LAMBDA_RUNTIME_DIR/bootstrap $LAMBDA_RUNTIME_DIR/launch.sh
CMD ["/var/runtime/bootstrap"]
そもそもランタイムとは
ランタイム
(英:runtime)とは
プログラムとかを動かすとき(実行時)のこと。
あるいは
プログラムとかを動かすときに必要な部品のこと
~ 中略 ~
****まぁ「ランタイム」って単語が出てきたら「実行時のこと、あるいは、実行時に必要な物のことなんだな~」と、お考えください。
ランタイムは、nodeなどのJavaScriptで動かすために必要な部品!
要は「実行環境」
以前、紹介したBunとかも最近流行りのJavaScriptのランタイム!
Bunでシェルスクリプトかけるらしい。。。
【Bun】JavaScriptでシェルスクリプトを書けると噂のBun Shell使ってみた | ソフトウェア開発のギークフィード
では、
なぜ私は正しくDockerfileでnode.jsの(戻り値も正しく返していた)
ランタイムを指定していたのに実行する中に謎のランタイムエラー
が出てしまったのか。
実行するスクリプトをシェルにしていたからだ!!
そもそも、以下で確認するとLambda関数は
シェルスクリプトのランタイムは用意していないかった。
なので、今回ランタイムエラーや初期化エラーなどは
ランタイムをnode.jsで指定していたのに、サポートされていない
シェルスクリプトで実行していたため、
exit
の処理や謎の初期化エラーが発生していた。
ただ、ここに気づく前に今回のカスタムランタイム(bootstrap)を使用して
どうにかこうにか実行し、正しく動作するようになったが、
カスタムランタイムは、
正しい知識がない場合などやもっともな理由(どうしても現在のバージョンのランタイムを使用しないといけない)などがない限り使用しないが安牌かなと思いました。
チュートリアル: カスタムランタイムの構築 - AWS Lambda
exeを実行したい場合
node.jsの場合
child_process.exec
などexeを叩くために使用できるライブラリなどを使用する。
- Python:
-
subprocess
モジュールを使用して、外部コマンドを実行できます。 - 例:
subprocess.run(["cli-kintone", "record", "export", ...])
-
- Ruby:
-
system
メソッドや%x
構文を使用して、外部コマンドを実行できます。 - 例:
system("cli-kintone record export ...")
-
- Java:
-
java.lang.ProcessBuilder
クラスを使用して、外部コマンドを実行できます。 - 例:
new ProcessBuilder("cli-kintone", "record", "export", ...).start()
-
- Go:
-
os/exec
パッケージを使用して、外部コマンドを実行できます。 - 例:
exec.Command("cli-kintone", "record", "export", ...).Run()
-
- C#:
-
System.Diagnostics.Process
クラスを使用して、外部コマンドを実行できます。 - 例:
Process.Start("cli-kintone", "record export ...")
-
Discussion