😄

API Gateway からDynamoDBを直接操作してみた

5 min read

先日、「ポケットスタディ AWS認定デベロッパーアソシエイト」の著書である山下光洋さんが主催している勉強会「ヤマムギ」に参加しました。

https://yamamugi.connpass.com/event/213548/

API Gateway からLambdaを介してDynamoDBにデータを読み書きするデモがメインでしたが、それだけでなく、API Gatewayから直接DynamoDBに書き込む(PutItem)デモも実施いただきました。API GatewayからDynamoDBを直接操作することを知らなかったので、復習のために自分の環境でも試してみました。また、デモでは実施されていなかった、API GatewayからDynamoDBのデータ読み取り(GetItem)もやってみました。

以下に実施した内容を書いていこうと思います。
※マネジメントコンソールの画面は、2021/6/24現在のものです。

構成

以下のようなシンプルな構成です。

設定

1. DynamoDBの作成

①DynamoDBの画面を開き、テーブルを一つ作成します。
※テーブル名とプライマリーキーの名称は何でも良いです。
※今回はすべてデフォルト設定で作りました。ローカルセカンダリインデックス等は必要に応じて設定してください。

②テーブルのARNを控えておきます。IAMロール作成時に使います。

2. IAMロール作成とインラインポリシーの設定

API GatewayからDynamoDBに書き込みと読み取りを許可するIAMロールを作成していきます。

①IAMの画面を開き、ロールの作成をします。

②ユースケースの選択で「API Gateway」を選択し、「次のステップ:アクセス権限」をクリックします。

③アクセス権限ポリシー欄に「AmazonAPIGatewayPushToCloudWatchLogs」と表示されていることを確認して「次のステップ:タグ」を選択します。

③タグの追加は任意です。「次のステップ:確認」をクリックします。
④ロール名を入力したら、「ロールの作成」をクリックします。

⑤「インラインポリシーの追加」をクリックします。

⑥サービス:DynamoDB、アクション:読み込み(GetItem)と書き込み(PutItem)を選択します。
⑦「ARNの追加」をクリックして、1.で作成したテーブルのARNを入力し、「追加」をクリックします。

⑧「ポリシーの確認」をクリックし、インラインポリシー名を記入したら、「ポリシーの作成」をクリックします。

⑨以下のように表示されたらOKです。

⑩IAMロールのARNを控えておきます。

JSON形式だと、以下のようになります。設定時にビジュアルエディターではなくJSONを記入して設定しても良いと思います(もしかしたら、そちらの方が早いかもしれません)。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:GetItem"
            ],
            "Resource": "arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXX:table/Memo"
        }
    ]
}

3. API Gatewayの設定

(1) PutItem

①API Gateway の画面を開きます。
②REST APIを作成します。プロトコル:REST、新しいAPI、API名を記入したら、「APIの作成」をクリックします。

②子リソース(テーブル名)を作成し、その下にPOSTメソッドを作成します。
③POSTメソッドの統合タイプを「AWSサービス」、AWSサービスを「DynamoDB」、メソッド「POST」アクション「PutItem」、実行ロールに2.で作成したIAMロールのARNを指定します。
⑤入力内容を確認したら「保存」をクリックします。

⑥メソッドリクエストの設定をします。URLクエリ文字列パラメータにテーブルのカラムを追加します。

⑦統合リクエストの設定をします。マッピングテンプレートのContent-Typeに「application/json」を追加し、テンプレートのJSONを以下の通り追加します。

{
    "TableName": "Memo",
    "Item":{
        "MemoId":{
            "S":"$input.params('MemoId')"
        },
        "Memo":{
            "S":"$input.params('Memo')"
        }
    }
}

※以下の警告が出たら、「はい、この統合を保護します」をクリックします。

⑧テストを実行します。クエリ文字列の[memo]に追記したい文字列を記入します。
⑨ステータスコード200とログ内に入力したクエリ文字列がJSON形式で表示されていればOKです。

⑩DynamoDBテーブルにも書き込まれていることを確認します。

(2) GetItem

①POSTメソッド作成時と同じ要領でGETメソッドを作成します。以下、設定内容です。

API GatewayのGETメソッド作成ですが、GetItemを実行するために使うメソッドはPOSTのようです。GETで設定してテストしたら、Not Foundが返ってきました…執筆時点では理由はわかりませんでしたので、ご存知の方ご教示いただけますと幸いです!

②メソッドリクエストの設定をします。URLクエリ文字列パラメータを設定します。ここではプライマリーキーだけ設定します。

③統合リクエストの設定をします。マッピングテンプレートのContent-Typeに「application/json」を追加し、テンプレートのJSONを以下の通り追加します。

{
    "TableName": "Memo",
    "Key":{
        "MemoId":{
            "S":"$input.params('MemoId')"
        }
    }
}

④テストを実行します。クエリ文字列の[memo]にプライマリーキーを記入します。
⑤ステータスコード200であること、レスポンスに入力したプライマリーキーに紐づく項目がJSON形式で表示されていればOKです。

最後に

デモで学んだことを自分で再現してみるのは、思ったよりも難しかったです(自分のスキル不足かもしれませんが…)。また、デモで学んだことを参考にプラスアルファのことをやるのも、面白いけど大変ですね。今まで触らなかったAPI Gatewayを触れて勉強できて収穫が多かったです!

ハンズオンの復習はこれまでもやってきましたが、デモも見るだけで終わるのではなく、復習することと可能ならば自分で再現してみることが凄く重要だと分かりました。今後も可能な範囲でやっていきたいです!!勉強会を開催いただいた山下さんに感謝です!!

参考

ポケットスタディ AWS認定デベロッパーアソシエイト

https://www.shuwasystem.co.jp/book/9784798063409.html

Qiita:APIGatewayから直接DynamoDBのデータを取得する
※GetItem実行のためにPOSTを指定することをこちらから情報入手しました。ありがとうございました!

https://qiita.com/foxtrackjp/items/e286b20943e99e230198

Discussion

ログインするとコメントできます