LoginSignup
14
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-17

前回記事での失敗

前回記事の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. 基本的な情報のアクセス権限でロールを選択する(ロールの説明は省略 :sweat: 説明できるほど詳しくないので)
  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 エラーを処理する

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