シェルスクリプトを Lambda で実行すると途中終了するときの対処方法
困っていた内容
AWS CLI を実行するシェルスクリプトの実行環境を EC2 から Lambda に移行中です。
サンプルやドキュメントを参考に、aws --version
が Lambda で実行できる環境まで作ることができ、シェルスクリプトを実際に Lambda で実行したところ、処理の途中で終了しました。
数分の処理なので15分のタイムアウトは関係ないと思いますが、他に確認すべき点はありますか。
{ "errorMessage": "RequestId: f3a45ffe-fb50-15dd-22de-8fca9af4b439 Error: Runtime exited with error: exit status 254", "errorType": "Runtime.ExitError" }
どう対応すればいいの?
bootstrap
ファイルのオプションを確認してください。
#!/bin/sh set -euo pipefail
ドキュメントに記載のbootstrap
ファイルでは、-e
オプションが設定されており、シェルスクリプトの実行中に終了コードが 0 以外になると、その時点で処理を終了します。
また、-u
オプションも設定されているため、未定義の変数を使用している場合も同様に処理が終了します。
そのため、シェルスクリプトの処理内容とオプションによっては、同じ処理でも途中で終了する場合があると理解し、オプションの変更やシェルスクリプト内のコマンド修正をご検討ください。
参考資料
-e
パイプライン (1 つの 単純なコマンド からなるものでもよい)、 括弧で囲まれた サブシェル のコマンド、 ブレース (前述の シェルの文法 を参照) で囲まれたコマンドのリストの一部として実行されたコマンドの 1 つ が 0 でないステータスで終了した場合、即座に終了します。-u
パラメータ展開の実行中に、特殊パラメータ "@" と "*" 以外で 設定されていない変数やパラメータをエラーとして扱います。 設定されていない変数やパラメータを展開しようとした場合、 シェルはエラーメッセージを出力します。 シェルが対話的でなければ、0 でないステータスで終了します。