なになれ

IT系のことを記録していきます

DynamoDBにおけるCRUD操作の色々なやり方をまとめた

DynamoDBをよく触るようになったもののDynamoDBヘのCRUD操作は色々なやり方があって、
毎度ググっては実行してというのを繰り返してました。
そのやり方をまとめていちいちググらないようにしたいと思います。

この記事について

色々なやり方があるDynamoDBへのCRUD操作を紹介します。
また、それぞれのやり方のメリット・デメリットを自分なりに説明します。

目次

AWS CLI

AWS CLIを使うやり方です。

CRUD

Create
put-itemでデータを1つ作成できます。

$ aws dynamodb put-item --table-name Sample --item '{"partitionKey": {"S": "posts"}, "sortKey": {"S": "post-1"}}'

Read(query)
queryでkeyを条件にしてデータを取得できます。

$ aws dynamodb query --table-name Sample --key-condition-expression "partitionKey = :value" --expression-attribute-values  '{":value":{"S":"posts"}}'

Update
update-itemで既存のデータを更新できます。

$ aws dynamodb update-item --table-name Sample --key '{ "partitionKey": {"S": "posts"}, "sortKey": {"S": "post-1"}}' --update-expression "SET title = :newval" --expression-attribute-values '{":newval":{"S":"title-1"}}'

データに含まれる値を削除する場合など更新式の書き方のパターンがいくつかあります。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html

Delete
delete-itemで既存のデータを削除できます。

$ aws dynamodb delete-item --table-name Sample --key '{ "partitionKey": {"S": "posts"}, "sortKey": {"S": "post-1"}}' 

メリット&デメリット

AWS CLIがインストールされていないのはあまりないかと思うので、すぐに利用できるのがメリットだと思います。
keyの指定にデータ型が必要だったり、expressionとvalueを分けて書かないといけなかったりと書き方が複雑です。

DQL

非公式ですが、DQLというSQLライクな構文でDynamoDBにアクセスできるツールがあります。

github.com

CRUD

事前に以下のコマンドでREPLを起動します。

$ dql

Create

> INSERT INTO Sample (partitionKey, sortKey) VALUES ('posts', 'post-1');

Read

> SELECT * FROM Sample WHERE partitionKey = 'posts';

Update

> UPDATE Sample SET title = 'title-1' WHERE partitionKey = 'posts' AND sortKey = 'post-1';

Delete

> DELETE FROM Sample WHERE partitionKey = 'posts' AND sortKey = 'post-1';

メリット&デメリット

SQLに慣れていると直感的にDynamoDBの操作ができます。
SELECTの出力形式が扱いづらいのでとりあえずデータの内容を確認したい用途向けだと思います。

AWS SDK

プログラミング言語から操作する方法です。ここではNode.jsを使う方法になります。

CRUD

Create

const AWS = require("aws-sdk");

AWS.config.update({
  region: "ap-northeast-1",
  endpoint: "http://localhost:8000"
});

const docClient = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: "Sample",
  Item: {
    partitionKey: "posts",
    sortKey: "post-1"
  }
};

docClient.put(params).promise();

Read

const AWS = require("aws-sdk");

AWS.config.update({
  region: "ap-northeast-1",
  endpoint: "http://localhost:8000"
});

const docClient = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: "Sample",
  KeyConditionExpression: "partitionKey = :value",
  ExpressionAttributeValues: {
    ":value": "posts"
  }
};

docClient
  .query(params)
  .promise()
  .then(d => {
    console.log(d);
  });

Update

const AWS = require("aws-sdk");

AWS.config.update({
  region: "ap-northeast-1",
  endpoint: "http://localhost:8000"
});

const docClient = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: "Sample",
  Key: {
    partitionKey: "posts",
    sortKey: "post-1"
  },
  UpdateExpression: "set title = :newval",
  ExpressionAttributeValues: {
    ":newval": "title-1"
  }
};

docClient.update(params).promise();

Delete

const AWS = require("aws-sdk");

AWS.config.update({
  region: "ap-northeast-1",
  endpoint: "http://localhost:8000"
});

const docClient = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: "Sample",
  Key: {
    partitionKey: "posts",
    sortKey: "post-1"
  }
};

docClient.delete(params).promise();

メリット&デメリット

DynamoDBは1度に取得できるデータ量に制限があるために大量データを扱う場合には繰り返し実行する必要があります。
SDKを使うとこのような大量データを扱うのがやりやすいです。
ちょっとデータを確認したいというような用途には向かないと思います。

NoSQL Workbench

GUIでDynamoDBを操作するツールです。

インストールは以下からできます。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.settingup.html

CRUD

NoSQL Workbenchを起動します。
f:id:hi1280:20200327225102p:plain:w500

Create
[Operation builder] -> [Build operations] -> [Put Item] を選択します。

f:id:hi1280:20200327230707p:plain:w500

keyを指定して、Executeで実行します。

Read
[Operation builder] -> [Build operations] -> [Query] を選択します。

f:id:hi1280:20200327230728p:plain:w500

keyを指定して、Executeで実行します。

Update
[Operation builder] -> [Build operations] -> [Update Item] を選択します。

f:id:hi1280:20200327230744p:plain:w500

keyとUpdate expressionを指定して、Executeで実行します。

Delete
[Operation builder] -> [Build operations] -> [Delete Item] を選択します。

f:id:hi1280:20200327230759p:plain:w500

keyを指定して、Executeで実行します。

チェックボックスで選択して消す方法もあります。
f:id:hi1280:20200328003731p:plain:w500

メリット&デメリット

CRUD毎に何のパラメータを指定すればいいか指示されているので分かりやすいです。
複数のテーブルを包括したデータモデリングの機能もあります。
GUIに抵抗がなければこれを利用するのが良さそうです。

AWSマネジメントコンソール

ブラウザでAWSマネジメントコンソールから操作する方法です。

CRUD

[DynamoDB] -> [Tables] で特定のテーブルを選択し、[Items]タブを選択します。

f:id:hi1280:20200328111423p:plain:w500

Create
[Create Item] を選択します。

f:id:hi1280:20200328002103p:plain:w500

keyを指定して、Saveで実行します。

Read
[Query] を選択します。
keyを指定して、[Start search] を選択します。

f:id:hi1280:20200328002342p:plain:w500

Update
Itemを選択し、[Actions] -> [Edit] を選択します。

f:id:hi1280:20200328002456p:plain:w500

attributeを指定して、Saveで実行します。

Delete
Itemを選択し、[Actions] -> [Delete] を選択します。

f:id:hi1280:20200328010607p:plain:w500

メリット&デメリット

インストールが不要なのでとにかく簡単に使えます。
ちょっとデータの内容を確認したい場合に良く使います。
マネジメントコンソールの事情ですが、セッションタイムアウトが発生してその度に画面の内容がクリアされるのが欠点かなと思います。

まとめ

DynamoDBへCRUD操作をする場合の色々なやり方を紹介しました。
自分の場合、なんだかんだでAWSマネジメントコンソールを使ってしまいます。