Lambda内でcontext.fail()を呼び出して処理を中断させようとしても、後続の処理が実行されてしまうことに気がつきました。
例:
exports.handler = function(event, context, callback) {
if (!event.id) {
context.fail(new Error('Invalid input: id is missing'));
}
// この行以降の処理が実行されてしまう
console.log('Success');
const response = {
statusCode: 200,
body: JSON.stringify({message: 'Success'})
};
callback(null, response);
};
調べた記録と対処を書いておきます。
stackoverflowの回答
stackoverflowで見つけた質問と回答を読んでみます。
AWS Lambda function continues for a bit after context.fail
要約すると、
context.failを呼び出してもその後の処理が少し続くみたいなのですが・・?これって仕様ですか?
という問いに対して、
ドキュメントに明記されてないので確証はありませんが仕様みたいです。
fail()は「失敗を示す」と書かれていますが、それ以上の実行の停止を保証しているわけではありません。
以下がドキュメントの文書です。
context.fail()
Indicates the Lambda function execution and all callbacks completed unsuccessfully, resulting in a handled exception.
→ 全てのコールバックの失敗を受けて例外を処理します。
なるほどそういう仕様らしいことがわかりました。
ただ貼ってあった公式ドキュメントのリンクをみたところ、context.fail()
についての記述は書いてありませんでした。
ChatGPTに聞いてみる
▶︎ context.fail()について教えて
context.fail() は、AWS Lambda関数の実行を失敗させるために使用されるコンテキストオブジェクトのメソッドの1つです。Lambda関数がエラーになった場合に使用され、エラーを生成して呼び出し元にエラーを返します。
context.fail() メソッドに渡されたエラーは、Lambda関数の呼び出し元に返され、エラーの詳細を確認することができます。
▶︎ context.fail()についての公式ドキュメントのURLをください
申し訳ありませんが、context.fail() はAWS LambdaのPythonランタイムのコンテキストオブジェクトであり、AWS Lambdaの公式ドキュメントには記載されていません。ただし、AWS LambdaのPythonランタイムのコンテキストオブジェクトについては、以下のリンクからドキュメントを参照できます。
AWS Lambda context object in Python
Pythonのページしかないみたいでした。中身見ましたがfail()について書かれていません。
どうしよう... → 結局throw new Error()する
もうシンプルにエラーが起きたら throw new Error()
することにしました。
if (!error) {
throw new Error('Invalid input: id is missing');
}
例外がスローされると、Lambda関数の実行が停止され、エラーが呼び出し元に返されます。
手元で実行したことろ、fail()とは違って後続の処理が実行されることはありませんでした。
以上