AWS API Gateway + Lambda (Python) でモックを作ってみよう


前回記事での失敗

前回記事のAWS API Gatewayでモックを作ってみようで、API Gatewayの統合タイプ:MockでAPIのモックを作ってみました。
が、統合タイプ:MockではPOSTのリクエストデータが取得できないようでした。
(参考:teratail AWS API GatewayでHTTPリクエストのjsonを取得したい
そのため今回は統合タイプ:Mockを使わず、統合タイプ:LAMBDAで作っていくことにします。

PythonでLambda関数を作る

  1. Amazon Lambdaコンソール関数の作成ボタンから関数の作成画面に遷移する
  2. 基本的な情報の関数名に任意の関数名を入力する
  3. 基本的な情報のランタイムで使用する言語を選択する(この記事ではPython 3.7を選んでいます)
  4. 基本的な情報のアクセス権限でロールを選択する(ロールの説明は省略 説明できるほど詳しくないので)
  5. 画面右下の関数の作成ボタンをクリックする
  6. 関数を作成する画面に遷移するので、関数コード欄にPythonコードを打ち込んでいく

Lambdaプロキシ統合を使用しない場合

  • API Gatewayでの設定
    • 統合タイプ:Lambda関数
    • Lambdaプロキシ統合の使用:チェックOff
  • Lambda関数コード
import json
def lambda_handler(event, context):
    return {
        'test_data': 123456,
        'test_message': 'Hello, World!'
    }

上記のように記述すると、ステータス 200としてreturnの内容がレスポンス本文として返されます。
ステータス 400等で返す場合は

import json

def lambda_handler(event, context):
    raise Exception('400')

というような形で例外を発生させます。
例外を発生させた場合のレスポンス本文は、API Gatewayの統合レスポンスで設定します。
API Gatewayでメソッドレスポンスに該当ステータス(この場合は400)を追加し、統合レスポンスの該当ステータスのマッピングテンプレートにレスポンス本文を入力します。

Lambdaプロキシ統合を使用する場合

  • API Gatewayでの設定
    • 統合タイプ:Lambda関数
    • Lambdaプロキシ統合の使用:チェックOn
  • Lambda関数コード
import json
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps(
            {
                'test': 123456,
                'test_message': 'Hello, World!'
            }
        )
    }

ステータス 400等で返す場合は、statusCodebodyを書き換えます。
Lambdaプロキシ統合を使用している場合はAPI Gatewayの統合レスポンスでレスポンス本文を設定する必要はありません。(というかLambdaプロキシ統合を使用している場合は統合レスポンスは触れない)
Lambdaプロキシ統合を使用する場合の出力の基本は以下になります。(公式ドキュメントより

{
  "isBase64Encoded" : "boolean",
  "statusCode": "number",
  "headers": { ... },
  "body": "JSON string"
}

複数のリソースからのリクエストを振り分ける

Lambdaプロキシ統合を使用するとAPI GatewayのリソースパスをLambda関数で受け取ることができるので、リソース毎にLambda関数を作るのではなくLambda関数を一つにまとめてみましょう。
API Gatewayのリソースパスはevent['path']で取得できます。

import json

def lambda_handler(event, context):
    path = event['path']

    if path == '/proxy200':
        return {
            'statusCode': 200,
            'body': json.dumps('Good Request!') 
        }
    elif path == '/proxy400':
        return {
            'statusCode': 400,
            'body': json.dumps('Bad Request..')
        }

(API Gatewayで/proxy200/proxy400というというリソースを作成した場合)
このようにevent['path']の値で処理内容を分ければ、一つのLambda関数で複数のリソースに対応できます。

次回

前回と今回の内容で、API Gatewayでのモック作りがある程度出来るようになりました。
次回はSlackからAPI Gatewayモック作りを行えるようにしてみます。

プチ連載

1回目 AWS API Gatewayでモックを作ってみよう
2回目 AWS API Gateway + Lambda (Python) でモックを作ってみよう(本記事)
3回目 Slack + Lambda (Python) でAWS API Gatewayモックを作ってみよう

We're hiring!

AIチャットボットを開発しています。
ご興味ある方は Wantedlyページ からお気軽にご連絡ください!

参考記事

Qiita 【API Gateway】AWS Lambda統合のPythonでHello, world
AWSドキュメント API Gateway で Lambda エラーを処理する