シェルスクリプトを Lambda で実行すると途中終了するときの対処方法

シェルスクリプトのオプションによっては、同じ処理でも途中終了するためご注意ください
2022.07.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

AWS CLI を実行するシェルスクリプトの実行環境を EC2 から Lambda に移行中です。
サンプルドキュメントを参考に、aws --versionが Lambda で実行できる環境まで作ることができ、シェルスクリプトを実際に Lambda で実行したところ、処理の途中で終了しました。
数分の処理なので15分のタイムアウトは関係ないと思いますが、他に確認すべき点はありますか。

Lambdaのログ

{
  "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 でないステータスで終了します。