Developers.IOの記事を参考に進めていたのですが、個人的にハマったところがあるのでまとめていきたいと思います。
やりたいこと
APIGatewayから直接DynamoDBにあるデータを取得したい。
今までAPIGatewayからDynamoDBのデータを取得する際、基本的にLambdaを挟む構成だったのですが、
今回はAPIGatewayのAWS Proxy('AWS サービス'に呼び方変わった?)という機能を使い、Lambdaを挟まずにデータを取得したいと思います。
Lambdaを挟まない事により、コスト削減、レイテンシの低下を目指します。
DB作成
データ作成
ポリシー作成
先ほど作成したDBに対し、GetItemができるロール「DynamoGetItem」を作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:GetItem"
],
"Effect": "Allow",
"Resource": "arn:aws:dynamodb:ap-northeast-1:**********:table/Test"
}
]
}
ロール作成
IAMから、ロールを作成します。今回は「GatewayDynamo」という名前で作成しました。
こんな感じになると思います。
のちの設定で使用するので、ARNを控えておきます。
作成後、先ほどの「DynamoGetItem」ポリシーをアタッチしておきます。
APIGateway作成
今回はDynamoDBのGetItemという処理を呼びます。APIGateway自体を呼ぶ処理はGETで作りましたが、APIGatewayからDynamoDBのGetItemを呼ぶにはPOSTを使う必要があるのでこのような設定になりました。
メソッドリクエストの設定
メソッドリクエストの設定を来ないます。
URLクエリ文字列にidという文字列を追加します。
総合リクエストの設定
APIGatewayに投げられたidという文字列を使ってDynamoDBへ投げるための設定を行います。
APIGatewayがidという名前で受け取ったデータをDyanmoDBに対しidという名前で投げます。(テーブル名もここで指定しています。)
#set($item = $input.path('$.Item'))
{
#foreach($param in $item.keySet())
$param : ${item.get($param).S}
#end
}
総合レスポンスの設定
これはDynamoDBから帰ってきた値を整形してAPIGatewayへ返す際のマッピング設定です。
以上で全ての設定は完了です。
リクエストテスト
{
body : テストデータ
id : test.data
}
無事、データが帰ってきました。
APIデプロイ
curl "https://**********.execute-api.ap-northeast-1.amazonaws.com/prod?id=test.data"
無事取得できました!!