AWSのDynamoDBをAPIでCRUD操作する

概要

DynamoDBをAPIで使えるようにした。

次にAPIを通じてCRUD操作する方法を記録しておく。

基本的に公式ガイドを参照したけどわかりにくかったので他も色々見ながら試行錯誤した。

検索するといろんな情報(古い書き方、非推奨の書き方や別の言語での書き方)が入り混じっていて結構わかりにくかった。

create レコードを新規作成

payload.TableNameで指定したテーブルにpayload.Item内のJSONを新規登録する。

テーブル作成時にプライマリーキーに設定した属性は必須。

それ以外はJSONであれば自由。

また、プライマリーキーの値がすでにあるものであった場合はレコードそのものを上書きする。

read レコード1件取得

payload.TableNameで指定したテーブルにpayload.Keyにプライマリーキーを指定して1レコードを取得する。

 

update レコード1件更新

createで同一プライマリキーを指定したときとは違って、レコードの一部を変更できる。

payload.Keyで指定したレコードの更新を行う。

プライマリキー属性は更新できないので、その場合はdeleteしてcreateしなおす必要がある。

また、AttributeUpdatesで処理を定義することもできるが現在は非推奨とされている。

まずUpdateExpressionに式を記入する。

以下の4つの式が使えるがSET, REMOVEの他は基本使わない。

  • SET – 属性の追加、更新
  • REMOVE – 1 つ以上の属性を項目から削除
  • ADD – 数値とセットデータのみサポートするが、通常はADD ではなく SET が推奨される
  • DELETE – セットデータ(HashSet)からString配列で指定したものを削除

次にExpressionAttributeNamesに属性名を定義。直接UpdateExpressionで指定してもいいが予約語とかぶらないように注意する。

同様にExpressionAttributeValuesに代入する値を定義。

ReturnValuesは以下から選ぶ。

  • ALL_OLD – 更新の発生前に表示されたように、項目全体が返される。
  • ALL_NEW – 更新後に表示されるように、項目全体が返される。
  • UPDATED_OLD – 更新の発生前に表示されたように、更新した値のみが返される。
  • UPDATED_NEW – 更新後に表示されるように、更新した値のみが返される。

 

DELETEは今回の例だと使えないため割愛。

書き方 : DELETE HashSet [“a”,”b”,…]

delete レコード1件削除

プライマリキーを指定してレコードを削除する。

list レコード一覧取得

テーブルを指定してレコード一覧を取得する。

 

HTTP RequestでDynamoDBを操作する

何をするか

外からAPIを叩いてデータをDBに保存してみたかったので試してみた。
プラットフォームはAWSオンリー。
以下のサービスを使って連携をしてみる。

  • API Gateway
  • Lambda
  • DynamoDB

DynamoDBの用意

まずAWSでNoSQL DBサービスのDynamoDBの準備をする。
AWSのサービスはそれぞれテスト機能があるので一番深いところから用意していくとトントン進む気がする。

  1. サービス一覧からDynamoDBを選択する
  2. テーブルの作成ボタンを押す
  3. 好きなテーブル名、プライマリーキーを設定する。今回はtestテーブル、キーをidにした。

以上でDBの準備完了。簡単!

Lambda, APIの作成

LambdaはAWSで用意されているコードの実行サービス。
Java,Nodejs,Pythonコードを実行可能(今回はNodejs)。
なのでここには処理の実行部分を書く。
今後処理の内容を弄るときには基本的にここをでロジックを書く必要がある。
今回やりたいことはBlueprint(色々セットで作ってくれるテンプレートのようなもの)で用意されているのでそれを使う。

  1. サービス一覧からLambdaを選択
  2. Create lambda functionボタンを押す
  3. Select blueprintからmicroservice-http-endpointを選択
  4. Nameは好きな名前を入れる(今回はtestLambda)
  5. RoleでBasic with DynamoDBを選ぶと新規ページが開く
  6. そのまま右下の許可を押す
  7. Roleの選択肢にlambda_dynamoが追加されているの選択(今後は直接これを選ぶ)
  8. 右下のNextボタンを押す
  9. microservice-http-endpointで作成した場合にはそのままAPIが作成できるのでmethodをPOST,SecurityをOpenに変えてNext
  10.  確認画面でOKなら完了

これで準備完了なのでテストしてみる。

Lambdaのテスト機能を使う

Lambdaの左上のTestボタンを押すとeventの中身を直接入力してテストできる。

以下のJSONを入力してテストすると実際にレコードが登録される。

DynamoDBのtestテーブルを見るとレコードが追加されているのが確認できる。

RESTクライアントを使ったテスト

ブラウザの拡張でREST APIテスト用のアドオンがあるのでそれで実際の動作を確かめる。

restclient

URL:APIエンドポイント
Method:POST
Body:

結果

Dynamoのtestテーブルを見ると2つのテストで入れたレコードが確認できる。

dynamo

このままだとURLをたたけば誰でもデータベース操作できてしまうのでLambdaの処理を絞ったり、APIに認証を設定したりする必要がある。