APIGatewayから直接DynamoDBのデータを取得する

[Developers.IOの記事](http://dev.classmethod.jp/cloud/aws/api-gateway-aws-service-proxy-dynamodb/)を参考に進めていたのですが、個人的にハマったところがあるのでまとめていきたいと思います。

## やりたいこと
__APIGatewayから直接DynamoDBにあるデータを取得したい。__

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/142489/3f29b2ca-5a99-3b1b-5dae-e56b425de751.png "p1.png")
今までAPIGatewayからDynamoDBのデータを取得する際、基本的にLambdaを挟む構成だったのですが、

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/142489/75c2b393-3dbd-7792-ba63-1fc0a37b5c66.png "p2.png")
今回はAPIGatewayのAWS Proxy（'AWS サービス'に呼び方変わった？）という機能を使い、Lambdaを挟まずにデータを取得したいと思います。

Lambdaを挟まない事により、コスト削減、レイテンシの低下を目指します。

## DB作成
![p3.png](https://qiita-image-store.s3.amazonaws.com/0/142489/ce09ad3e-2484-568a-25df-7e9b8ce8ff89.png "p3.png")
idというキーを持ったTestというテーブルを作りました。

![p4.png](https://qiita-image-store.s3.amazonaws.com/0/142489/f8dfb9c3-ca7d-075b-2f13-7b5a54ed1483.png "p4.png")
読み込み1ユニット、書き込み1ユニットの最小構成です。

## データ作成

![p5.png](https://qiita-image-store.s3.amazonaws.com/0/142489/b3c97484-e2bb-f31f-e485-713140fc415e.png "p5.png")
![p6.png](https://qiita-image-store.s3.amazonaws.com/0/142489/44fc0ebd-3424-8b61-689e-5ab50cda7a4b.png "p6.png")
上記のようなデータを作成しました。

![p7.png](https://qiita-image-store.s3.amazonaws.com/0/142489/cf974ec1-59d0-8316-31d4-b6f469a512dc.png "p7.png")
後ほど権限作成の際に使用するので、ARNを控えておきます。

## ポリシー作成
![s1.png](https://qiita-image-store.s3.amazonaws.com/0/142489/f44fdd8d-b84d-bf87-ea79-130367ad4c36.png "s1.png")
先ほど作成したDBに対し、GetItemができるロール「DynamoGetItem」を作成します。

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

## ロール作成
![p8.png](https://qiita-image-store.s3.amazonaws.com/0/142489/0e1b2296-8633-ba9c-fd56-7b5a0bfe0431.png "p8.png")
IAMから、ロールを作成します。今回は「GatewayDynamo」という名前で作成しました。

![p9.png](https://qiita-image-store.s3.amazonaws.com/0/142489/60e86a7e-81f5-c889-8090-6794158c7d8c.png "p9.png")

![p10.png](https://qiita-image-store.s3.amazonaws.com/0/142489/9b6ba361-35ad-1905-b8e5-831f5013d506.png "p10.png")
こんな感じになると思います。
のちの設定で使用するので、ARNを控えておきます。

![s2.png](https://qiita-image-store.s3.amazonaws.com/0/142489/e35fc407-a6c0-2c00-52e9-d108523fb513.png "s2.png")
作成後、先ほどの「DynamoGetItem」ポリシーをアタッチしておきます。

## APIGateway作成
![p11.png](https://qiita-image-store.s3.amazonaws.com/0/142489/8c85887a-150e-a22b-5de8-86db9aee539e.png "p11.png")
TestというAPI名で作成しました。

![p12.png](https://qiita-image-store.s3.amazonaws.com/0/142489/5031fb08-d3bc-dedd-9388-d83a500c1f0c.png "p12.png")

![p13.png](https://qiita-image-store.s3.amazonaws.com/0/142489/bc3fc681-e1c8-0da8-69b0-b42a75c13918.png "p13.png")
作成したAPIにGETのメソッドを追加します。

![p14.png](https://qiita-image-store.s3.amazonaws.com/0/142489/f7a97a64-9724-1c8e-c10d-00bb8bee1cad.png "p14.png")
今回はDynamoDBのGetItemという処理を呼びます。APIGateway自体を呼ぶ処理はGETで作りましたが、APIGatewayからDynamoDBのGetItemを呼ぶにはPOSTを使う必要があるのでこのような設定になりました。

## メソッドリクエストの設定
![p15.png](https://qiita-image-store.s3.amazonaws.com/0/142489/df28dcd1-c2d0-b614-5710-9d7788390685.png "p15.png")
メソッドリクエストの設定を来ないます。
![p16.png](https://qiita-image-store.s3.amazonaws.com/0/142489/4656565e-721d-7d6c-41fd-d2e9aacea07d.png "p16.png")
URLクエリ文字列にidという文字列を追加します。

## 総合リクエストの設定
![p17.png](https://qiita-image-store.s3.amazonaws.com/0/142489/9cf3b2e9-4f23-2d3c-0f07-df603eccc002.png "p17.png")
APIGatewayに投げられたidという文字列を使ってDynamoDBへ投げるための設定を行います。

![p18.png](https://qiita-image-store.s3.amazonaws.com/0/142489/8ee54522-75d7-fb29-6f78-ed7fc62c6765.png "p18.png")
APIGatewayがidという名前で受け取ったデータをDyanmoDBに対しidという名前で投げます。（テーブル名もここで指定しています。）

```
#set($item = $input.path('$.Item'))
{
#foreach($param in $item.keySet())
  $param : ${item.get($param).S}
#end
}
```

## 総合レスポンスの設定
![p19.png](https://qiita-image-store.s3.amazonaws.com/0/142489/c84574da-4dab-1328-f4c1-a1dc4b0f3780.png "p19.png")
総合レスポンスから本文マッピングテンプレートを設定します。

![p20.png](https://qiita-image-store.s3.amazonaws.com/0/142489/da202137-805b-4c9c-d1db-f56faed92382.png "p20.png")
これはDynamoDBから帰ってきた値を整形してAPIGatewayへ返す際のマッピング設定です。

__以上で全ての設定は完了です。__

## リクエストテスト

![p21.png](https://qiita-image-store.s3.amazonaws.com/0/142489/242001ea-27d5-90a9-387d-63cd23e211af.png "p21.png")
idに「test.data」を入力してテストを行います。

>{
>  body : テストデータ
>  id : test.data
>}

無事、データが帰ってきました。

## APIデプロイ
![p22.png](https://qiita-image-store.s3.amazonaws.com/0/142489/52ab348f-b298-f852-6a3b-1d0e75effd40.png "p22.png")
![p23.png](https://qiita-image-store.s3.amazonaws.com/0/142489/20d38b5b-168b-7330-a031-0aa28f906952.png "p23.png")
せっかくなのでAPIデプロイしてみます。

```
curl "https://**********.execute-api.ap-northeast-1.amazonaws.com/prod?id=test.data"
```

![24.png](https://qiita-image-store.s3.amazonaws.com/0/142489/2b8934b0-436e-8b48-a248-7c4018e61238.png "24.png")

__無事取得できました！！__