Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

おわり。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした