🥃
AWS Lambda (Node.js) で同期実行時にカスタムエラーを投げる場合はnameプロパティも変えると良い
これはなんですか
- 表題の通りです。
- AWS Lambda (Node.js) を同期実行した際のエラーに含まれる
errorType
はErrorオブジェクトのname
プロパティを参照します。
AWS Lambda (Node.js) のエラーメッセージ
AWS Lambdaは同期実行をサポートしています。例えば ドキュメント に記載のある通り、AWS CLIで aws lambda invoke
コマンドを実行すると同期的にLambda Functionが実行されて、Functionの実行結果が取得できます。
Lambdaの同期実行例
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{ "key": "value" }' response.json
Node.jsのLambda Functionを同期実行した場合、実行中にエラー終了すると、以下の例のようなメッセージが返却されます。(ドキュメント)
エラーの例
{
"errorType": "ReferenceError",
"errorMessage": "x is not defined",
"trace": [
"ReferenceError: x is not defined",
" at Runtime.exports.handler (/var/task/index.js:2:3)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:63:25)",
" at process._tickCallback (internal/process/next_tick.js:68:7)"
]
}
ここで、errorType
はエラーの種類、errorMessage
はエラー本文、trace
はエラーのトレースです。
errorType
を使ってハンドリングしたいが……
Lambda Functionを同期実行して後続の処理でエラーハンドリングをするとき、 errorType
を見て処理を変えたくなります。errorType
はエラーの種類によって変わるようなので、動作確認用に以下のLambda Functionを作成します。
class CustomError extends Error {
constructor(message) {
super(message);
}
}
exports.handler = async (event) => {
throw new CustomError('this is a error');
};
上記のFunctionを実行して得られたレスポンスは以下の通りです。
{
"errorType": "Error",
"errorMessage": "this is a error",
"trace": [
"Error: this is a error",
" at Runtime.exports.handler (/var/task/index.js:9:11)",
" at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1028:29)"
]
}
errorType
はErrorのままです。
name
属性を設定する
CustomErrorの どうやら、 errorType
はErrorオブジェクトの name
属性を見ているようでした。Lambda Functionを以下のように書き換えます。
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
exports.handler = async (event) => {
throw new CustomError('this is a error');
};
実際のレスポンスは以下の通りです。
{
"errorType": "CustomError",
"errorMessage": "this is a error",
"trace": [
"CustomError: this is a error",
" at Runtime.exports.handler (/var/task/index.js:9:11)",
" at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1028:29)"
]
}
"errorType": "CustomError"
となり、 errorType
の値が変わっていることが確認できました。
まとめ
AWS Lambda (Node.js) のエラーハンドリングで errorType
を使う場合は、カスタムエラーオブジェクトの name
属性を変えると良いです。
Discussion