Posted at

API GatewayからDynamoDBの読み書きを行う


はじめに

AWSのAPI Gatewayから前回作ったLambda関数を起動することによりDynamoDBを読み書きする方法です。Lambdaでは書き込み専用、読み込み専用として別々の関数を作りましたが、今回は一つのAPI Gateway中にGET機能とPOST機能を持たせます。

・ API Gatewayの管理画面にアクセスします。

・ RESTプロトコルを選択します。

・ 適当なAPI名をつけます。

・ エンドポイントタイプはリージョンを選択します。

・ APIの作成を押すとメソッド画面が開きます。


GETコマンドの設定

・ アクションからリソースの作成を選択します。

・ リソース名に[comments]と入力しリソースの作成を押します。

・ アクションからメソッドの作成を選びます。

・ GETを選んでチェックマークを押します。

・ GETセットアップにて、統合タイプはLambda関数、関数名には読み込み用のLambda関数名を入力して保存します。

・「 API GatewayにLambda関数を呼び出す権限を与えようとしています」のメッセージが出るのでOKを押します。

・ メソッドのリクエストをクリックします。

・ URLクエリ文字列パラメーターを開きます。

・ クエリ文字列の追加をクリックし名前にDBのプライマリーキーである[track]と入力してチェックマークを押します。(全データを呼び出すことになる)

・ メソッドの実行をクリックして前の画面に戻ります。

・ 統合リクエストをクリックします。

・ マッピングテンプレートを選択して開きます。

・ テンプレートが定義されていない場合(推奨)を選んでマッピングプレートの追加をクリックします。

・ [Context-Type]に[application/json]と入力し、右のチェックを押します。

・ [application/json]をクリックし以下をコピーし保存します。

#set($inputRoot = $input.path('$'))

{
"track": "$input.params('track')"
}

・ メソッドの実行をクリックして前の画面に戻リます。

・ これでGET時にLambda関数を介してDynamoDBへQueryを実行できるようになります。

・ テストを押します。

・ クエリ文字列に[track=Test]と入力してテストボタンを押します。

・ 画面右側にDynamoDBの値が出力されれば成功です。

・ メソッドの実行をクリックして前の画面に戻ります。


POSTコマンドの設定

・ アクションからメソッドの作成を選びます。

・ POSTを選び右側のチェックを押します。

・ POSTセットアップにて、統合タイプはLambda関数、関数名には読み込み用のLambda関数名を入力して保存します。

・ 「API GatewayにLambda関数を呼び出す権限を与えようとしています」のメッセージが出るのでOKを押します。

・ 統合リクエストをクリックします。

・ マッピングテンプレートを選択して開きます。

・ テンプレートが定義されていない場合(推奨)を選んでマッピングプレートの追加をクリックします。

・ [Context-Type]に[application/json]と入力し、右のチェックを押します。

・ [application/json]をクリックし以下をコピーし保存します。

$input.json('$’)

・ メソッドの実行をクリックして前の画面に戻ります。

・ テストを押します。

・ リクエスト本文に以下を記入します。

{

"track": "Test",
"comment": "Hello API GW",
"name": "zzzz"
}

・ テストを押します。

・ レスポンスに{}と表示されれば成功です。

・ DynamoDBの管理画面でデータが追加されていることを確認します。

以上でREST APIが完成です。


デプロイとテスト

・ アクションからAPIのデプロイを選択します。

・ デプロイされるステージで新しいステージを選び、ステージ名に[demo]と入力しDeployボタンを押します。

・ 画面にURLが表示されるのでコピーします。

・ ブラウザのアドレスバーにペーストし、最後に[/comments?track=Test]を追記します。

・ GETの結果としてQuery結果が表示されます。POSTについては手作業でのテストは行えません。POSTMAN(www.getpostman.com)などでテストを行う必要があります。