🤮

ECR ✖️ Lambda ランタイムエラー: Runtime.ExitErrorで沼った

2024/05/30に公開

沼ったところ

以下2つのエラーが発生して、めちゃくちゃ沼った。

  • ランタイムエラー: Runtime.ExitError

  • INIT_REPORTStatus: 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_REPORTStatus: timeout エラーが発生

INIT_REPORT Init Duration: 10002.67 ms Phase: init Status: timeout

  • INIT_REPORTStatus: 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関数は

シェルスクリプトのランタイムは用意していないかった。

Lambda ランタイム - AWS Lambda

なので、今回ランタイムエラーや初期化エラーなどは

ランタイムをnode.jsで指定していたのに、サポートされていない

シェルスクリプトで実行していたため、

exit の処理や謎の初期化エラーが発生していた。

ただ、ここに気づく前に今回のカスタムランタイム(bootstrap)を使用して

どうにかこうにか実行し、正しく動作するようになったが、

カスタムランタイムは、

正しい知識がない場合などやもっともな理由(どうしても現在のバージョンのランタイムを使用しないといけない)などがない限り使用しないが安牌かなと思いました。

チュートリアル: カスタムランタイムの構築 - AWS Lambda

exeを実行したい場合

node.jsの場合

child_process.exec などexeを叩くために使用できるライブラリなどを使用する。

  1. Python:
    • subprocessモジュールを使用して、外部コマンドを実行できます。
    • 例: subprocess.run(["cli-kintone", "record", "export", ...])
  2. Ruby:
    • systemメソッドや%x構文を使用して、外部コマンドを実行できます。
    • 例: system("cli-kintone record export ...")
  3. Java:
    • java.lang.ProcessBuilderクラスを使用して、外部コマンドを実行できます。
    • 例: new ProcessBuilder("cli-kintone", "record", "export", ...).start()
  4. Go:
    • os/execパッケージを使用して、外部コマンドを実行できます。
    • 例: exec.Command("cli-kintone", "record", "export", ...).Run()
  5. C#:
    • System.Diagnostics.Processクラスを使用して、外部コマンドを実行できます。
    • 例: Process.Start("cli-kintone", "record export ...")

Discussion