はじめに
前回の記事ではDynamoDBのテーブルと項目作成、Lambda関数で使うロールやインラインポリシーの設定を行いました。今回はその続きで、API Gateway(REST APIでCRUD実装)をトリガーにし、Lambda(NodeJS)関数呼び出して、DynamoDBに参照や更新をできるようにします。
表現等が不適切の場合はご指摘いただければ、幸いです。
※サーバレスに関してよくわからない方は、こちらをご覧いただければと思います。
アーキテクチャ図
流れ
- ソースで直接(Api gatewayを使わず)参照や更新ができるかを確認
- POST(ユーザーの登録)
- domain.com/users/{id}
- DELETE(対象ユーザーの削除)
- domain.com/users/{id}
- GET(全ユーザーの取得)
- domain.com/users
- PATCH(対象ユーザーの更新)
- domain.com/users/{id}
ソースで直接(Api gatewayを使わず)参照や更新ができるかを確認
まずはLambda(NodeJS)でDynamoDBテーブルが参照・更新できるか確認
Lambdaダッシュボード>関数の作成>一から作成>以下の通り入力>関数の作成ボタン
※既存のロール設定は前回の記事で作成したものを使用しています。
データの参照ができるよう、ソース編集
こちらのリファレンスを参考にしました。
'use strict';constAWS=require('aws-sdk');constmyRegion="us-east-2";AWS.config.update({region:myRegion});exports.handler=async(event,context)=>{constdocumentClient=newAWS.DynamoDB.DocumentClient({region:myRegion});//読込用のデータconstparams1={TableName:"Users",Key:{id:"01"}};//書込用のデータconstparams2={TableName:"Users",Item:{id:"02",firstname:"first02",lastname:"last02"}};try{constreadData=awaitdocumentClient.get(params1).promise();constwriteData=awaitdocumentClient.put(params2).promise();console.log(readData);console.log(writeData);}catch(err){console.log(err);}};
⚠️ 必ず、DynamoDBとLambdaは同じリージョンで作成するように気をつける。また上記ソースのmyRegion変数値も合わせるように気をつける。いずれが満たない場合、AccessDeniedExceptionという意味不明なエラーが発生する可能性があります。
テストイベントの設定(今回はgetUserData)>テストボタン>取得結果が表示されれば、OK
DynamoDBにデータ作成されていることを確認
ちなみに、params2でidをそのまま、firstnameやlastnameを変更すると更新される仕様です。
API Gatewayトリガー追加と設定
API Gatewayダッシュボード>APIを作成ボタン>REST APIの構築ボタン(Privateじゃない方)
以下のように入力>APIの作成ボタン
エッジ最適化について(AWS公式より引用)
エッジ最適化 API は、API ゲートウェイによって作成および管理される CloudFront ディストリビューション経由でアクセスするエンドポイントです。以前は、エッジ最適化 API は、API ゲートウェイを使用して API を作成する際のデフォルトオプションでした。
参考記事
・0からREST APIについて調べてみた
・エッジ最適化について説明
リクエスト、レスポンスマッピングのモデルを作成及び設定
参考
モデル名、コンテンツタイプ、スキーマ(ソース)を設定します。
{"$schema":"http://json-schema.org/draft-04/schema#","title":"UsersInputModel","type":"object","properties":{"id":{"type":"string"},"firstname":{"type":"string"},"lastname":{"type":"string"}}}
POSTメソッド実装(ユーザーの登録)
ここではAPI GatewayでPOSTメソッドを作成して、レコードが登録されるかを確認する。
API Gatewayと紐付けるLambda関数を作成と設定
関数名はputUsersで、その他の設定は前回と一緒(察して)(冒頭のLambda関数作成のスクリーンショット参照)
以下のソースを貼り付けます。
DynamoDBの構成に関しては、こちらの記事を参考にしてください。(DynamoDBテーブルの作成部分)
'use strict';constAWS=require('aws-sdk');constmyRegion="us-east-2";AWS.config.update({region:myRegion});exports.handler=async(event,context)=>{constdocumentClient=newAWS.DynamoDB.DocumentClient({region:myRegion});letresponseBody="";letstatusCode=0;const{id,firstname,lastname}=JSON.parse(event.body);constparams={TableName:"Users",Item:{id:id,firstname:firstname,lastname:lastname}};try{constdata=awaitdocumentClient.put(params).promise();responseBody=JSON.stringify(data);statusCode=201;}catch(err){responseBody=`Unable to put user ${err}`;statusCode=403;}constresponse={statusCode:statusCode,headers:{"Content-Type":"application/json"},body:responseBody};returnresponse;}
POSTメソッド作成と設定
メソッドリクエストの設定
モデルの追加には上記の作成したモデルを追加する
API Gatewayで確認テスト
下の方にテストボタンあるので、それを押すとテスト結果(ログも含めて)画面右側に表示されると思います。
{"id":"03","firstname":"first03","lastname":"last03"}
テストステータスで201が返ってこれば、成功みたいです。
⚠️ ちなみに本来DynamoDBテーブルにない項目論理名(例えばfirstnameではなく、あえてnickname)をリクエスト本文に設定された場合、問題なくテスト処理は実行されます。対象のレコードfirstnameには空白が入る仕様になっています。
DynamoDBテーブルにレコードが作成されていることを確認
to be continued
ちょっと長くなりそうなので、続きを次回出します。
あとはDELETE(対象ユーザーの削除), GET(全ユーザーの取得) PATCH(対象ユーザーの更新)のメソッドを作成して、最後までCRUD機能を実装していきます。