元ネタ
API Gateway で Lambda エラーを処理する
※2019.10.08 AWSのドキュメントのフィードバックに報告済みなのでドキュメント側も修正済みの場合があります
このドキュメントですが、これに書いてある通りにやってもエラー処理が正常にできずステータス200が帰ってきてしまう。
原因はここの誤記
aws apigateway put-integration-response --rest-api-id [rest-api-id] --resource-id [resource-id] --http-method GET --status-code 400 --selection-pattern "Invalid*" --region us-west-2
"Invalid*"
を"Invalid.*"
にするとちゃんと動きました。
詳しい解説
誤記について
--selection-pattern
は正規表現を用いることになっていますが
によると、"Invalid*"
だと"Invalid〜"
みたいな文字列にはマッチしません。
("Invali", "Invalid", "Invaliddddd"とかがマッチ対象になるのかな)
なので、"Invalid〜"
に対応させるには"Invalid.*"
と表記します。
Lamvda -> API Gateway でのエラー検知について
上記の正規表現ですが「どこをみてるの?」という話。
結論から言うと標準エラーからハンドリングする場合は
{
"errorMessage": "Malformed input ...",
"errorType": "Error",
"stackTrace": [
"exports.handler (/var/task/index.js:3:14)"
]
}
こちらの標準エラーの"errorMessage"
が上記正規表現の対象になるみたいです。
なので、ドキュメントの解説に沿って対応させるには正規表現は"Malformed.*"
と設定する必要があります。
まとめ
以下のようにそれぞれのステータスコードを設定していくと管理しやすそうですね。
Lambdaエラーの正規表現
400.*
メソッドレスポンスのステータス
400
レスポンス処理
exports.handler = function(event, context, callback) {
callback(new Error("400 Bad Request"));
};