LoginSignup
10
12

More than 5 years have passed since last update.

API Gateway & Lambda Function(Python)でカスタムエラーのレスポンスを返す

Posted at

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要素に出力されています。

この時点ではスタックトレース等余計な情報が含まれています。

Lambda

API Gateway

続いて、API Gatewayの設定に移ります。

通常どおりにリソース・メソッドを作成し、バックエンド処理に先程のLambdaを指定します。

単純にAPI作っただけ

この時点ではLambdaから返されたレスポンスがそのままクライアントに帰ることになります。

HTTPステータスも200番が返っています。

ApiGateway-default

メソッドレスポンスと統合レスポンスを設定する

API GatewayはデフォルトではLambdaの処理の成否に関係なく200番でレスポンスを返します。

正しくステータスを返すようにメソッドレスポンスと統合レスポンスの設定を行います。

メソッドレスポンス

HTTPスタータスの500番を追加します。

Response-1

統合レスポンス

各HTTPステータスの紐付けと、マッピングテンプレートの設定を行います。

  • 「Lambda エラーの正規表現」では、LambdaレスポンスのerrorMessage属性に出力したエラーコード(code)にマッチする指定を行います。
  • 「マッピングテンプレート」では、LambdaレスポンスのerrorMessageだけ抜き出してマッピングする指定を行います。

Response-2

再度APIのレスポンスを確認する

独自のエラーレスポンスが返る様になりました。

余計な情報も出力されていませんし、HTTPステータスも500番台で返っています。

Response-3

おわり。

10
12
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
10
12