AWS Lambda+API GatewayでJSONパーサーAPIを作ってみる。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。

これまで作成していたJSONパーサーAPIを、AWSのLambda,APIGatewayを使用して立ち上げみました。

いろいろアドバイスいただけると嬉しいです。

## 開発概要

以下の仕様とします。

* API稼働フレームワークはLambda(Python)+API Gatewaayを使用する
* API入力は、以下のものを入力する
  - URLにクエリでJSONキーを指定する。(?key=key1)
  - POSTボディーにJSONデータを入れる
* API出力は以下のものとする
  - クエリで指定したJSONキーに対応した値をプレーンテキストで出力する

## 事前準備

AWSアカウントを作成していること。

＊本システムでしたらかかっても1日あたり0.01ドルですみます。

## API構築方法

### Lambda関数作成

AWSのメニューからLanbdaコンソールに入る。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/602f08f4-6b52-f2c7-c904-51024afb2ee8.png)


関数の作成をクリックし、以下の設定を行って関数を作成する。

* 一から選択を選ぶ
* 関数名は任意の名前を選択する
* ランタイムは"Python3.xx"を選択する
* アーキテクチャは"x86_64"を選択する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/325f10eb-cd8a-16cd-c848-e40559d20423.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/5487f445-6d49-30bf-4d7c-689654bcf33c.png)

コードソースに移動して
以下関数内容を入力して、"Deploy"をクリックする。
"Test"は行わなくてよい。

```bash
import json

def lambda_handler(event, context):
    try:
        # POSTで送られてくるJSONデータをパースする
        body = json.loads(event['body'])

        # URLクエリパラメータからキーを取得する
        query_key = event['queryStringParameters']['key']

        # キーに対応する値を取得する
        value = body.get(query_key, 'Key not found in JSON')

        return {
            'statusCode': 200,
            'headers': {'Content-Type': 'text/plain'},
            'body': str(value)
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'headers': {'Content-Type': 'text/plain'},
            'body': str(e)
        }
```

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/976f2b95-72a7-8829-f302-20899753c28f.png)

### APIGateway設定

AWSのメニューからAPI Gatewayコンソールに入る

1.サービスから「API Gateway」を選択します

2.HTTP APIボタンの構築をクリックします

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/20746449-2574-19c1-b91f-2afc237997d2.png)

3.統合に「Lambda」、Lambda関数に先程作成した関数を指定する

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/02b0516e-8575-1f63-9976-06c0c148636d.png)

4.API名を設定し「次へ」をクリックする

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/4bdd4982-9725-4f8d-ea4f-dc5e36249a0d.png)

5.ルート設定画面にて、任意のリソースパスを設定し、「次へ」をクリックする

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/4860ebd1-f65e-3ee6-28fe-6be24728c142.png)

6.ステージを定義画面で「次へ」をクリックする

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/719fe1f4-4a4d-8df6-278f-fdbcfce52d8e.png)

7.「Review and Create」画面で設定を確認し、「作成」をクリックしてAPIを作成します

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/8109b7bc-e660-5471-35d1-9bea63c74b35.png)

8.API一覧から作成したAPIを選択する

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/ea8f55c2-1756-e603-2eb0-0db242336b7c.png)

9.左のメニューからRouteをクリックして、ルート詳細の編集をクリックする

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/2767fff1-395b-1cbf-0c92-9ad48bd575cf.png)

10.ルートとメソッド画面にて"POST"を選択し、保存をクリックする

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/bca4d017-a2e3-1e0b-1a57-d2b669ec0c2b.png)

ここまでで、APIは完成しますが、独自ドメイン+SSLを使用したい場合は以下の手順を参照してください

事前に独自ドメインを入手し、Route53でパブリックホストゾーンを作成してください

### AWS Certificate ManagerでSSL証明書を取得する

1. AWS Management Consoleにサインインし、「AWSCertificate Manager」サービスを選択します

2. 「証明書をリクエスト」をクリックします

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/b5038f44-6ebb-3566-c247-d3beb63975f5.png)

3.パブリック証明書をリクエストを選択し、次へをクリックする

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/5c4b057a-368a-d534-d942-9f184f00921f.png)

4.パブリック証明書をリクエスト画面にてAPIに使用するドメイン名を設定する

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/e19a4de7-c89c-85ae-1a2a-cdf3ae90da3f.png)

5.画面の一番下に移動して、リクエストをクリックする

![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/782eca8a-7a23-6749-80d4-958e1e55e066.png)

6.対象証明書のドメイン設定箇所で、Route53でレコード作成をクリックする

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/42067289-e12e-c1d7-5cc0-c332693091fe.png)

7.右下のレコード作成をクリックする

![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/31d796c8-0fcb-4de1-c085-c98feb955f4f.png)

８．証明書一覧に戻り、ステータスが発行済となっていることを確認する

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/03ffbd27-822e-06e1-ad96-05e53a5db8e0.png)

### API Gatewayでカスタムドメインを作成する

1.AWS Management Consoleで「API Gateway」サービスを選択します

2.左側のナビゲーションパネルで「Custom Domains」をクリックします

![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/835b9495-0ca3-6c79-d06b-5371fd2b1b01.png)

３．SSL証明書を作成する際に使用したドメイン名を設定する

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/fc1f752b-71e0-c01b-a7ef-d9d965f07310.png)

４．エンドポイントはリージョンを選択し、ACM証明書は先ほど作成したものを指定し、ドメイン名を作成をクリックする

![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/146a131e-8314-99a4-7c83-b1946eca7928.png)

### カスタムドメインにAPIをマッピングする

1.左側のカスタムドメイン名設定をクリックします

2.「API マッピング」タブをクリックし、「APIマッピングを設定」をクリックします

![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/9a5bfc99-b92e-01c6-fd2b-199e4f9a8995.png)

３．新しいマッピングをクリックする

![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/2820ca29-a20c-33bc-4ed0-a904b5fb823e.png)

4.APIマッピングを設定に、以下の情報を入力し、保存をクリックする

* 「API」: 作成したAPIを選択します
* 「Stage」: デプロイされているAPIのステージを選択します（通常は「$default」）
* 「Path」:空白にします

![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/3b81d544-59a2-8a3d-f47a-d2e44c3a9356.png)

### Route 53でDNSレコードを設定する

1.AWS Management Consoleで「Route 53」サービスを選択し、ホストゾーンをクリックします

![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/8522cbf8-8037-db46-35fc-147d877b44d3.png)

2.パブリックドメインに対応するホストゾーン名をクリックします

![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/514a5bd4-1a42-af17-0951-8ac8a82627a0.png)

3.「レコードを作成」をクリックし、以下の情報を入力します

* 「Record name」: SSL証明書で指定したドメイン名を入れます
* 「Record type」: 「A - IPv4 address」を選択します
* 「エイリアス」: 有効化にします
* トラフィックについて、作成したAPIGatewayを指定します

![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/1fba5202-12be-ddbc-0e9a-cd01a5d261cb.png)

![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/ce70d6db-8f6c-5a92-08e2-927d48638260.png)

４.右下の「レコードを作成」をクリックして、DNSレコードを作成します

これで、Route 53で持っているドメインとAPI Gatewayが連携し、独自ドメインでAPIにアクセスできるようになります

### 動作確認

ターミナルを立ち上げ、以下のコマンドを入力する
（{ドメイン名}、｛パス名｝を実際のAPI GatewayのURLに置き換えてください）

```bash
curl -X POST -H "Content-Type: application/json" -d '{"name": "John", "age": "30"}' "https://{API_URL}/｛パス名｝?key=age"
```

30という値が返ってくること

# おわりに

AWS Lambda+APIGatewayでのアプリ開発第一歩として、JSONパーサーAPIを構築してみました

この記事がAWS上でのサーバーレスAPIを作ってみたい方の助けになればと思います