【Amazon API Gateway】AWS DynamoDBの値をAPIで参照する

##やろうとすること

[![Image from Gyazo](https://i.gyazo.com/6ea052cb746bbc262635b4e44386e557.png)](https://gyazo.com/6ea052cb746bbc262635b4e44386e557)

ほとんど、以下のサイトに書いてあることですが、自分用に書きます。

- [Amazon API GatewayのAWS 統合を使い、AWS Lambdaを通さずにAmazon DynamoDBへアクセスする](https://qiita.com/ma2shita/items/351746f2b6c414f9d5ab)

あと、こちらも参考にしました。

- [Amazon API Gateway で AWS Service Proxy を使って DynamoDB にアクセスする](https://dev.classmethod.jp/articles/api-gateway-aws-service-proxy-dynamodb/)



##AWS DynamoDB
すでにDynamoDBにて、こんなDBがあると仮定

※DynamoDBの作成方法やセンサー値の保存の方法はこちらを参照
[M5StackGRAYのセンサの値を3G拡張ボードを使ってDynamoDBに送ってみた](https://qiita.com/tatsuya1970/items/a9bc1856c454cfa24141)

[![Image from Gyazo](https://i.gyazo.com/e17e9948c75bd828fd8c08ba681d24b9.png)](https://gyazo.com/e17e9948c75bd828fd8c08ba681d24b9)

DynamoDB JSONで表示すると、 
（普通のJSONと違います）

```
{
  "id": {
    "S": "1"
  },
  "payloads": {
    "M": {
      "gyroX": {
        "N": "0.75"
      },
      "gyroY": {
        "N": "11.3"
      },
      "gyroZ": {
        "N": "-2.5"
      }
    }
  }
}

```


##IAM Role の作成

AWS マネジメントコンソールで、
[IAM] > [ポリシー] > [ポリシーの作成]
[![Image from Gyazo](https://i.gyazo.com/50c7fb87d0370f9f5617d71f1d38732c.png)](https://gyazo.com/50c7fb87d0370f9f5617d71f1d38732c)

JSONを編集 > [ポリシーの確認]
[![Image from Gyazo](https://i.gyazo.com/542f65e490e973b60428a2549d296a39.png)](https://gyazo.com/542f65e490e973b60428a2549d296a39)

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "dynamodb:GetItem"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXXXXXXX:table/Lambda-Dynamo"
    }
  ]
}
```

Resource にはDynamoDBのARN（DynamoDB 概要の一番下に記載あり）

ポリシーの確認で、
好きな名前を入力し、
[ポリシーの作成]をクリック

[![Image from Gyazo](https://i.gyazo.com/2621200d621a399da8bce02892bc96ec.png)](https://gyazo.com/2621200d621a399da8bce02892bc96ec)

ロール

[![Image from Gyazo](https://i.gyazo.com/7376590dc0335ebf2b8d3a934245ec76.png)](https://gyazo.com/7376590dc0335ebf2b8d3a934245ec76)

ロールの作成
[![Image from Gyazo](https://i.gyazo.com/b69499fb6be6205485cd564f728c9ba3.png)](https://gyazo.com/b69499fb6be6205485cd564f728c9ba3)

ここ良く分かりませんが
一般的なユースケースとして、
EC2か　Lambda を選択し、[次のステップ]
[![Image from Gyazo](https://i.gyazo.com/99d62512e1281d3fd33f517e35caf320.png)](https://gyazo.com/99d62512e1281d3fd33f517e35caf320)


アクセス権限ポリシー
さっき作ったポリシーを選択し、「次のステップ」
[![Image from Gyazo](https://i.gyazo.com/6e235eb259ea65baf627fb19325bd2c9.png)](https://gyazo.com/6e235eb259ea65baf627fb19325bd2c9)

タグの追加（オプション）
何もせずに「次のステップ」

ロール名を入力し、「ロールの作成」
[![Image from Gyazo](https://i.gyazo.com/03bfd7ee8782b45fa0766107dea9af42.png)](https://gyazo.com/03bfd7ee8782b45fa0766107dea9af42)


これでロールを作ることができました。


次にAPI　Gatewayにアクセスできるように、
[信頼関係] をクリック
[![Image from Gyazo](https://i.gyazo.com/3b0a9597f3cf69bb75c21bc919f53384.png)](https://gyazo.com/3b0a9597f3cf69bb75c21bc919f53384)

[信頼関係の編集] をクリック
[![Image from Gyazo](https://i.gyazo.com/d2423bf2ca46c8678fb2a2ee2dab9262.png)](https://gyazo.com/d2423bf2ca46c8678fb2a2ee2dab9262)

"Service"を "apigateway.amazonaws.com"　に変更　> [信頼ポリシーの更新]
[![Image from Gyazo](https://i.gyazo.com/7460b6a37ea07c6a71defbafc49e8e41.png)](https://gyazo.com/7460b6a37ea07c6a71defbafc49e8e41)

信頼されらエンティティが　apigateway.amazonaws.com　に代わってればOK

[![Image from Gyazo](https://i.gyazo.com/8fba84c4d75c6cd0088b5220f71a7055.png)](https://gyazo.com/8fba84c4d75c6cd0088b5220f71a7055)

##Amazon API Gateway

###API作成

Amazon API Gatewayにアクセス
[APIを作成]をクリック
[![Image from Gyazo](https://i.gyazo.com/8e6f84b4c7910cba3fa858cb86d37cca.png)](https://gyazo.com/8e6f84b4c7910cba3fa858cb86d37cca)

REST　API構築
[![Image from Gyazo](https://i.gyazo.com/667dee22072c07363dc7f6bf5166274a.png)](https://gyazo.com/667dee22072c07363dc7f6bf5166274a)

[API入力]　>　[APIの作成]
[![Image from Gyazo](https://i.gyazo.com/dc80f3bd4d2991f97ad2137c90435f0f.png)](https://gyazo.com/dc80f3bd4d2991f97ad2137c90435f0f)

###リソース作成
GET /items/{id} を作る
[![Image from Gyazo](https://i.gyazo.com/1dd98cb1eb0c44d20eef78d2c34b83d9.png)](https://gyazo.com/1dd98cb1eb0c44d20eef78d2c34b83d9)

[アクション] > [リソースの作成]
[![Image from Gyazo](https://i.gyazo.com/42b7366d3f1c2949d3de5f433f9c517d.png)](https://gyazo.com/42b7366d3f1c2949d3de5f433f9c517d)

リソース名、リソースパスを図のように入力し、[リソースの作成]
[![Image from Gyazo](https://i.gyazo.com/46d858941aacc9fd1f570bd02a494ad7.png)](https://gyazo.com/46d858941aacc9fd1f570bd02a494ad7)

そのまま、[アクション] > [リソースの作成]
[![Image from Gyazo](https://i.gyazo.com/9a03ef87ee431d06320107eb93451233.png)](https://gyazo.com/9a03ef87ee431d06320107eb93451233)

id ができた。
[![Image from Gyazo](https://i.gyazo.com/df329d8149dc04a794fa84eb716e3454.png)](https://gyazo.com/df329d8149dc04a794fa84eb716e3454)


###メソッドの作成
[アクション] > [メソッドの作成]
[![Image from Gyazo](https://i.gyazo.com/e2bc7814de848cd9bb81f0634a40eb2b.png)](https://gyazo.com/e2bc7814de848cd9bb81f0634a40eb2b)

GETを選択して、右横のチェックマークをクリック
[![Image from Gyazo](https://i.gyazo.com/72b7c11820a831b661c3cdf0975e9bc4.png)](https://gyazo.com/72b7c11820a831b661c3cdf0975e9bc4)

下図のとおりに入力
[![Image from Gyazo](https://i.gyazo.com/a7f46c378c27be89cab1246a50bea1c5.png)](https://gyazo.com/a7f46c378c27be89cab1246a50bea1c5)

統合タイプ　：　　　AWS サービス
AWS リージョン：	(DynamoDBのあるリージョン)
AWS サービス：	DynamoDB
AWS サブドメイン：	<空>
HTTP メソッド：	POST
アクションの種類：	アクション名の使用
アクション：	GetItem
実行ロール：	(ロールのARN)
コンテンツの処理：	パススルー
デフォルトタイムアウトの使用：	チェックをつける

###統合リクエスト

[![Image from Gyazo](https://i.gyazo.com/c1ee858401ea249899e3e9d8bf508424.png)](https://gyazo.com/c1ee858401ea249899e3e9d8bf508424)

下の方のマッピングテンプレートを以下のように
[![Image from Gyazo](https://i.gyazo.com/16c96be7d218e557451c2bc7621ec3f5.png)](https://gyazo.com/16c96be7d218e557451c2bc7621ec3f5)

JSONはこれ

```
{
  "TableName": "M5Stack",
  "Key": {
    "id": {
      "S": "$input.params('id')"
    }
  }
}
```

ここで、テストしてみる。
[![Image from Gyazo](https://i.gyazo.com/a7529fbb3e6f29a090ff8219a5084d7e.png)](https://gyazo.com/a7529fbb3e6f29a090ff8219a5084d7e)

パス　{id} に値を入力してみて
ここまでうまくいっとけば、こんな感じのJSONが出力される。
[![Image from Gyazo](https://i.gyazo.com/30291a643b66d03edf11441bb88092ea.png)](https://gyazo.com/30291a643b66d03edf11441bb88092ea)

###統合レスポンスの設定

DynamoDB JSONのままでは後々不便なので、普通に使うJSONに直す。
[![Image from Gyazo](https://i.gyazo.com/72ea3c4714f28931752913664b92ce9e.png)](https://gyazo.com/72ea3c4714f28931752913664b92ce9e)

下スクショの赤のところをクリック
[![Image from Gyazo](https://i.gyazo.com/3ecc171641ff7eb90911afc7600b9124.png)](https://gyazo.com/3ecc171641ff7eb90911afc7600b9124)

以下のように展開される。
マッピングテンプレートをクリック
[![Image from Gyazo](https://i.gyazo.com/3007113bddcf75a448e89c02af0d9b43.png)](https://gyazo.com/3007113bddcf75a448e89c02af0d9b43)

以下のように展開される。
Application/JSON をクリック
[![Image from Gyazo](https://i.gyazo.com/fb183d86de6a3089ea140f759b597da1.png)](https://gyazo.com/fb183d86de6a3089ea140f759b597da1)

以下のように展開される。
JSONを入力
[![Image from Gyazo](https://i.gyazo.com/a6cf006285985b9a6c8dacf6d4624216.png)](https://gyazo.com/a6cf006285985b9a6c8dacf6d4624216)

```
{
  "id": "$input.path('$').Item.id.S",
  "payloads": {
    "gyroX": $input.path('$').Item.payloads.M.gyroX.S,
    "gyroY": $input.path('$').Item.payloads.M.gyroY.S,
    "gyroZ": $input.path('$').Item.payloads.M.gyroZ.S
  }
}[

```

これでさっきと同じテストをすると、
おなじみのJSONが出力された。
[![Image from Gyazo](https://i.gyazo.com/cf5bccbcd497def0891672499cec298c.png)](https://gyazo.com/cf5bccbcd497def0891672499cec298c)


### デプロイ
APIのデプロイ
[![Image from Gyazo](https://i.gyazo.com/4ca813a4968a959deb722a441f5664e8.png)](https://gyazo.com/4ca813a4968a959deb722a441f5664e8)

ステージ名を入力してデプロイ
[![Image from Gyazo](https://i.gyazo.com/3f4d901c34afea2ff0e7a500c8ad4653.png)]
(https://gyazo.com/3f4d901c34afea2ff0e7a500c8ad4653)

以下スクショの赤で囲んだところが、呼び出しURL
[![Image from Gyazo](https://i.gyazo.com/eee9305101dfae54918575387f2c4e9e.png)](https://gyazo.com/eee9305101dfae54918575387f2c4e9e)

こんな形のURL

```
https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/XXXXX
```

###curlで実行
```
$ curl -v  https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/M5Stack/items/1

(途中略）

{
  "id": "1",
  "payloads": {
    "gyroX": 0.75,
    "gyroY": 11.3,
    "gyroZ": -2.5
  }
}
```


やったー、できた！！