はじめに
前回の記事ではDynamoDBのテーブルと項目作成、Lambda関数で使うロールやインラインポリシーの設定を行いました。今回はその続きで、API Gateway(REST APIでCRUD実装)をトリガーにし、Lambda(NodeJS)関数呼び出して、DynamoDBに参照や更新をできるようにします。
表現等が不適切の場合はご指摘いただければ、幸いです。
※サーバレスに関してよくわからない方は、こちらをご覧いただければと思います。
アーキテクチャ図
Image may be NSFW.
Clik here to view.
流れ
- ソースで直接(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ダッシュボード>関数の作成>一から作成>以下の通り入力>関数の作成ボタン
※既存のロール設定は前回の記事で作成したものを使用しています。
Image may be NSFW.
Clik here to view.
データの参照ができるよう、ソース編集
こちらのリファレンスを参考にしました。
'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
Image may be NSFW.
Clik here to view.
DynamoDBにデータ作成されていることを確認
ちなみに、params2でidをそのまま、firstnameやlastnameを変更すると更新される仕様です。
Image may be NSFW.
Clik here to view.
API Gatewayトリガー追加と設定
API Gatewayダッシュボード>APIを作成ボタン>REST APIの構築ボタン(Privateじゃない方)
以下のように入力>APIの作成ボタン
Image may be NSFW.
Clik here to view.
エッジ最適化について(AWS公式より引用)
エッジ最適化 API は、API ゲートウェイによって作成および管理される CloudFront ディストリビューション経由でアクセスするエンドポイントです。以前は、エッジ最適化 API は、API ゲートウェイを使用して API を作成する際のデフォルトオプションでした。
参考記事
・0からREST APIについて調べてみた
・エッジ最適化について説明
リクエスト、レスポンスマッピングのモデルを作成及び設定
参考
モデル名、コンテンツタイプ、スキーマ(ソース)を設定します。
Image may be NSFW.
Clik here to view.
{"$schema":"http://json-schema.org/draft-04/schema#","title":"UsersInputModel","type":"object","properties":{"id":{"type":"string"},"firstname":{"type":"string"},"lastname":{"type":"string"}}}
アクション>リソースの作成
リソースは2つ作成します。
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
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メソッド作成と設定
アクション>メソッドの作成
Image may be NSFW.
Clik here to view.
メソッドリクエストの設定
モデルの追加には上記の作成したモデルを追加する
Image may be NSFW.
Clik here to view.
API Gatewayで確認テスト
下の方にテストボタンあるので、それを押すとテスト結果(ログも含めて)画面右側に表示されると思います。
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
{"id":"03","firstname":"first03","lastname":"last03"}
テストステータスで201が返ってこれば、成功みたいです。
⚠️ ちなみに本来DynamoDBテーブルにない項目論理名(例えばfirstnameではなく、あえてnickname)をリクエスト本文に設定された場合、問題なくテスト処理は実行されます。対象のレコードfirstnameには空白が入る仕様になっています。
DynamoDBテーブルにレコードが作成されていることを確認
Image may be NSFW.
Clik here to view.
to be continued
ちょっと長くなりそうなので、続きを次回出します。
あとはDELETE(対象ユーザーの削除), GET(全ユーザーの取得) PATCH(対象ユーザーの更新)のメソッドを作成して、最後までCRUD機能を実装していきます。