API Gateway + AWS LambdaにPOSTした時のeventの中身

## 概要
HTTPでPOSTした際に、
AWS Lambdaの`event`の中身はどういう形式か調査したので、共有する。

参考 : https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html

```sh
curl -X POST -H "Content-Type: application/json" -d '{"Name":"Tanaka", "Age":"100"}' <api-url>
```

## 結論
`event`の中身は、以下の設定によって変わる。

1. `lambda統合プロキシ`を使用している場合
2. それ以外の場合

どこで設定するのかも詳しくみる。

## A : 設定値により`event`が変わるパターン

### 1 : `lambdaプロキシ統合`を使用している場合

`REST API`を使用している場合、
`lambdaプロキシ統合`を使用しているかどうか以下で判断できる。

このページの`統合リクエスト`をクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182163/f9b7a80b-9595-3057-86be-18bca341324d.png)

以下のチェックがついてるかどうか！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182163/d2c4ca48-015b-6c31-0490-97139b0b83b1.png)


チェックがついてる場合、
`event`は以下のjsonになる。

```json
{
  "version": "2.0",
  "routeKey": "$default",
  "rawPath": "/my/path",
  "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
  "cookies": [
    "cookie1",
    "cookie2"
  ],
  "headers": {
    "Header1": "value1",
    "Header2": "value1,value2"
  },
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
  "body": "Hello from Lambda",
  "pathParameters": {
    "parameter1": "value1"
  },
  "isBase64Encoded": false,
  "stageVariables": {
    "stageVariable1": "value1",
    "stageVariable2": "value2"
  }
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "api-id",
    "authentication": {
      "clientCert": {
        "clientCertPem": "CERT_CONTENT",
        "subjectDN": "www.example.com",
        "issuerDN": "Example issuer",
        "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
        "validity": {
          "notBefore": "May 28 12:30:02 2019 GMT",
          "notAfter": "Aug  5 09:36:04 2021 GMT"
        }
      }
    },
    "authorizer": {
      "jwt": {
        "claims": {
          "claim1": "value1",
          "claim2": "value2"
        },
        "scopes": [
          "scope1",
          "scope2"
        ]
      }
    },
    "domainName": "id.execute-api.us-east-1.amazonaws.com",
    "domainPrefix": "id",
    "http": {
      "method": "POST",
      "path": "/my/path",
      "protocol": "HTTP/1.1",
      "sourceIp": "IP",
      "userAgent": "agent"
    },
    "requestId": "id",
    "routeKey": "$default",
    "stage": "$default",
    "time": "12/Mar/2020:19:03:58 +0000",
    "timeEpoch": 1583348638390
  }
}
```

つまり、bodyを取得したい場合は以下のコードでOK。

```python
def lambda_handler(event, context):
    body = event["body"]
    print(body) # => {"Name":"Tanaka", "Age":"100"}
```


### 2 : それ以外の場合

`マッピングテンプレート`の設定値に準拠する。
`lambdaプロキシ統合`を下にスクロールすると、次の画面が現れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182163/05084cee-2d59-a8c0-98d9-674b67ea6b7c.png)

最も上の設定だと、そのまま通過する。
つまり`body`を以下のように取得できる。

```python
def lambda_handler(event, context):
    print(event) # => {"Name":"Tanaka", "Age":"100"}
```

`マッピングテンプレート`を追加すると、eventsの情報を自分好みに変えることが可能。
詳しくはこちらの記事で。
https://dev.classmethod.jp/articles/api-gateway-mapping-template/


## HTTP APIの場合は？

API Gatewayには`REST API`だけでなく、`HTTP API`もある。
`HTTP API`の場合は、`lambdaプロキシ統合`に準拠してるっぽい(?)。
僕は設定値変えるところを見つけられなかった。