共通レスポンス Util

以下に、Python で AWS Lambda 内で共通的に使用されるレスポンスのためのユーティリティクラスの例を示します。このクラスを使用すると、Lambda 関数のレスポンスを簡単に作成および返却することができます。

import decimal
import json

class ResponseUtils:
    class DecimalEncoder(json.JSONEncoder):
        """DecimalEncoder クラス
        Decimal クラスを使用して保存された数値を出力するために使用されます(Amazon DynamoDBの数値を保持します)
        """
        def default(self, o):
            if isinstance(o, decimal.Decimal):
                if o % 1 > 0:
                    return float(o)
                else:
                    return int(o)
            return super(DecimalEncoder, self).default(o)


    def response_200(self, body, **kargs):
        """ステータス200返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 200
        """
        body = body or {
            'message': 'OK.',
        }
        eturn self.create_response(200, body, kargs)


    def response_400(self, body=None, **kargs):
        """ステータス400返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 400
        """
        body = body or {
            'message': 'Bad Request.',
        }
        eturn self.create_response(400, body, kargs)

    def response_401(self, body=None, **kargs):
        """ステータス401返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 401
        """
        body = body or {
            'message': 'Unauthorized.',
        }
        eturn self.create_response(401, body, kargs)


    def response_403(self, body=None, **kargs):
        """ステータス403返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 403
        """
        body = body or {
            'message': 'Forbidden.',
        }
        eturn self.create_response(403, body, kargs)

    def response_404(self, body=None, **kargs):
        """ステータス404返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 404
        """
        body = body or {
            'message': 'Not Found.',
        }
        return self.create_response(404, body, kargs)

    def response_500(self, body=None, **kargs):
        """ステータス500返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 500
        """
        body = body or {
            'message': 'Internal Server Error.',
        }
        return self.create_response(500, body, kargs)

    def response_503(self, body=None, **kargs):
        """ステータス503返す
        Args:
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            ステータス: 503
        """
        body = body or {
            'message': 'Service Unavailable.',
        }
        return self.create_response(503, body, kargs)

    def create_response(self, status_code, body=None, **kargs):
        """レスポンス返す
        Args:
            status_code: ステータスコード
            body: ボディー
            kargs: dumpsに設定する変数
        Returns:
            レスポンス
        """
        response = {
            'statusCode': status_code,
            'headers': {'Access-Control-Allow-Origin': '*'},
            'body': body if type(body) is str else json.dumps(body, cls=DecimalEncoder, **kargs),
        }

        return response

上記の例では、ResponseUtils というクラスが定義されています。このクラスはレスポンスの共通操作を提供します。

例えば、以下のような使い方ができます:

def lambda_handler(event, context):
    response_utils = ResponseUtils()

    # 成功レスポンスの作成
    success_response = response_utils.response_200({'message': 'Success'})
    return success_response

    # 失敗レスポンスの作成
    error_response = response_utils.response_500({'error': 'Internal Server Error'})
    return error_response

上記の例では、response_utils インスタンスを作成し、response_200response_500メソッドを使用して成功および失敗のレスポンスを作成しています。

create_response メソッドは、AWS Lambda のレスポンスイベントと互換性があります。したがって、このメソッドで作成されたレスポンスは、AWS Lambda から直接返されることができます。

必要に応じて、レスポンスの形式や内容をカスタマイズできます。また、HTTP ステータスコードやボディの内容は、Lambda 関数の処理結果や要件に応じて適切に設定できます。

参考