「API Gateway で Lambda エラーを処理する」が動かなかった話


元ネタ
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

レスポンス処理

Node.js
exports.handler = function(event, context, callback) {
    callback(new Error("400 Bad Request"));
};