2
0

More than 1 year has passed since last update.

API Gateway + Lambda(Python) の REST API でステータスコード管理をする

Last updated at Posted at 2022-02-19

背景

API Gateway + Lambda(Python) の REST API があったのですが、えいやで作ったのでエラーハンドリングを全然していませんでした。
全てステータスコード200で返してパラメータでエラーかどうかを設定する方法のが簡単そうでしたが、やっぱり個人的に気持ち悪さを感じるのできっちりステータスコードを使い分けようと思いました。
AWS初心者の私には結構複雑だったのでメモっておきます。
自分的ベストプラクティスのつもりですが、一般的なベストプラクティスがあればぜひコメントください。

結論

先にざっくりと結論から。

API Gateway の設定

Lambda でやること

模索している時は大変だったけど結論にするとなんと簡単そうなことか・・・

API Gateway の設定

メソッドレスポンスにステータスコードを追加する

  1. メソッドを選んでメソッドレスポンスを選択
  2. [レスポンスの追加]から追加したいステータスコードを入力して追加

スクリーンショット 2022-02-19 14.14.26.png

これだけです。簡単です。
今回は400を追加しています。(200はデフォルト)

総合レスポンスにステータスコードに対応するマッピングを追加する

  1. メソッドを選んで総合スポンスを選択
  2. [統合レスポンスの追加]からステータスコードに対応するマッピングを設定する
項目
Lambda エラーの正規表現 ^\[400\].*
マッピングテンプレート
Content-Type
application/json
マッピングテンプレート
JSON内容
{
"errorMessage": "\$input.path('$.errorMessage')"
}

スクリーンショット 2022-02-19 14.19.15.png
一度保存するとマッチングテンプレートが設定できる。
スクリーンショット 2022-02-19 14.21.31.png

正規表現は"[400]"で始まるerrorMessageにマッチします。
マッチングテンプレートはレスポンスに"errorMessage"だけ設定されるようにしています。
そのままだとスタックトレースとかも出てしまうので。
この辺はお好みで設定してください。

このように設定を入れると

{
    "errorMessage": "[400] バリデーションエラー",
    "errorType": "Exception",
    "requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "stackTrace":[
        "hogehoge"
    ]
}

というLambdaのレスポンスを検知するとステータスコードが400になり、

{
    "errorMessage": "[400] バリデーションエラー"
}

に変換して返却してくれます。

設定を入れたらAPIのデプロイをして反映させます。

Lambda でやること

マッピングに該当する"errorMessage"を返却する

raise Exception('[400] バリデーションエラー')

このように例外を発生させてあげるだけで必要としている以下のようなレスポンスが生成されます。(上で書いた奴と同じレスポンス)

{
    "errorMessage": "[400] バリデーションエラー",
    "errorType": "Exception",
    "requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "stackTrace":[
        "hogehoge"
    ]
}

結果

APIのリクエスト結果が下のようになりました。
スクリーンショット 2022-02-19 14.34.06.png

これが私のやりたかった形でした。
あとはLambda側で独自の例外を作ったりをすればいい感じになるかなと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0