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

#前回記事での失敗
前回記事の[AWS API Gatewayでモックを作ってみよう](https://qiita.com/takeh/items/4fd78774eef1a36d8b3a)で、API Gatewayの`統合タイプ：Mock`でAPIのモックを作ってみました。
が、`統合タイプ：Mock`ではPOSTのリクエストデータが取得できないようでした。
（参考：[teratail　AWS API GatewayでHTTPリクエストのjsonを取得したい](https://teratail.com/questions/172025)）
そのため今回は`統合タイプ：Mock`を使わず、`統合タイプ：LAMBDA`で作っていくことにします。

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

##Lambdaプロキシ統合を使用しない場合
* API Gatewayでの設定
 * 統合タイプ：Lambda関数
 * Lambdaプロキシ統合の使用：チェックOff
* Lambda関数コード

```python
import json
def lambda_handler(event, context):
    return {
        'test_data': 123456,
        'test_message': 'Hello, World!'
    }
```
上記のように記述すると、ステータス 200としてreturnの内容がレスポンス本文として返されます。
ステータス 400等で返す場合は

```python
import json

def lambda_handler(event, context):
    raise Exception('400')
```
というような形で例外を発生させます。
例外を発生させた場合のレスポンス本文は、API Gatewayの`統合レスポンス`で設定します。
API Gatewayで`メソッドレスポンス`に該当ステータス（この場合は400）を追加し、`統合レスポンス`の該当ステータスのマッピングテンプレートにレスポンス本文を入力します。
##Lambdaプロキシ統合を使用する場合
* API Gatewayでの設定
 * 統合タイプ：Lambda関数
 * Lambdaプロキシ統合の使用：チェックOn
* Lambda関数コード

```python
import json
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps(
            {
                'test': 123456,
                'test_message': 'Hello, World!'
            }
        )
    }
```
ステータス 400等で返す場合は、`statusCode`と`body`を書き換えます。
Lambdaプロキシ統合を使用している場合はAPI Gatewayの`統合レスポンス`でレスポンス本文を設定する必要はありません。（というかLambdaプロキシ統合を使用している場合は`統合レスポンス`は触れない）
Lambdaプロキシ統合を使用する場合の出力の基本は以下になります。（[公式ドキュメントより](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html)）

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

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

```python
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関数で複数のリソースに対応できます。
#次回
[前回](https://qiita.com/takeh/items/4fd78774eef1a36d8b3a)と今回の内容で、API Gatewayでのモック作りがある程度出来るようになりました。
次回はSlackからAPI Gatewayモック作りを行えるようにしてみます。

#プチ連載
[1回目　AWS API Gatewayでモックを作ってみよう](https://qiita.com/takeh/items/4fd78774eef1a36d8b3a)
2回目　AWS API Gateway + Lambda (Python) でモックを作ってみよう（本記事）
[3回目　Slack + Lambda (Python) でAWS API Gatewayモックを作ってみよう](https://qiita.com/takeh/items/9941f78449ff907c1e76)

#We're hiring!
AIチャットボットを開発しています。
ご興味ある方は [Wantedlyページ](https://www.wantedly.com/projects/266837) からお気軽にご連絡ください！

#参考記事
[Qiita 【API Gateway】AWS Lambda統合のPythonでHello, world](https://qiita.com/baikichiz/items/2de7c4c0dcf9b051037a)
[AWSドキュメント API Gateway で Lambda エラーを処理する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html)