Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
12
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@syuni

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

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

おわり。

12
Help us understand the problem. What is going on with this article?
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
12
Help us understand the problem. What is going on with this article?