AWS Lambda(Python)で独自例外を投げて、API Gatewayを通じてレスポンスを返すまでの設定メモです。
背景
Lambda処理内で例外がライズされると、Lambdaはスタックトレース等諸々を一つのJSONにシリアライズしてレスポンスとして返します。
だけど、実際の運用上はスタックトレースは返さず、かつ独自のフォーマットでレスポンスを返したいケースが主だと思います。
ここの設定に微妙に時間を取られてしまったのでメモとして残しておきます。
Lamda Functinon
先ずはLambdaFunction側で関数を定義します。
仮にHTTPステータスの500番を返したいとします。
コード
強制的に例外を投げる実装です。
カスタム例外クラスの中で__str__
関数をオーバーライドし、JSON文字列として返す実装にします。
# -*- coding: utf-8 -*-
import json
class MyException(Exception):
def __init__(self, code, messages):
self.code = code
self.messages = messages
def __str__(self):
exobj = {
'error': {
'code': self.code,
'messages': self.messages
}
}
return json.dumps(exobj)
def lambda_handler(event, context):
raise MyException(
500,
[
{'message': 'hoge'},
{'message': 'fuga'},
{'message': 'piyo'}
]
)
Lambda Function実行時
Lambdaのコンソール上でテスト実行してみます。
__str__
関数で文字列化した内容がerrorMessage
要素に出力されています。
この時点ではスタックトレース等余計な情報が含まれています。
API Gateway
続いて、API Gatewayの設定に移ります。
通常どおりにリソース・メソッドを作成し、バックエンド処理に先程のLambdaを指定します。
単純にAPI作っただけ
この時点ではLambdaから返されたレスポンスがそのままクライアントに帰ることになります。
HTTPステータスも200番が返っています。
メソッドレスポンスと統合レスポンスを設定する
API GatewayはデフォルトではLambdaの処理の成否に関係なく200番でレスポンスを返します。
正しくステータスを返すようにメソッドレスポンスと統合レスポンスの設定を行います。
メソッドレスポンス
HTTPスタータスの500番を追加します。
統合レスポンス
各HTTPステータスの紐付けと、マッピングテンプレートの設定を行います。
- 「Lambda エラーの正規表現」では、Lambdaレスポンスの
errorMessage
属性に出力したエラーコード(code
)にマッチする指定を行います。 - 「マッピングテンプレート」では、Lambdaレスポンスの
errorMessage
だけ抜き出してマッピングする指定を行います。
再度APIのレスポンスを確認する
独自のエラーレスポンスが返る様になりました。
余計な情報も出力されていませんし、HTTPステータスも500番台で返っています。
おわり。