DynamoDB
DynamoDBとは
Amazon DynamoDB は、ハイパフォーマンスなアプリケーションをあらゆる規模で実行するために設計された、フルマネージド、サーバーレスの key-value NoSQL データベースです。DynamoDB は、内蔵セキュリティ、継続的なバックアップ、自動化されたマルチリージョンでのレプリケーション、インメモリキャッシング、データエクスポートツールを提供します。(公式ドキュメントより)
「キー」と「値」のペアを格納するというKey-Value型のデータベースであり、シンプルにデータの格納と取得する点においては非常に高速に行うことができる特徴がある。ただし、複雑なクエリで結合等を行うことは不得意であるため、複雑なクエリ発行を行いたい場合は別データベースを検討したほうが良い。
「キー」と「値」のペアを格納するというKey-Value型のデータベースであり、シンプルにデータの格納と取得する点においては非常に高速に行うことができる特徴がある。ただし、複雑なクエリで結合等を行うことは不得意であるため、複雑なクエリ発行を行いたい場合は別データベースを検討したほうが良い。
DynamoDBのテーブル作成手順
1

メインメニューからDynamoDBのページを開く。左メニューバーからテーブルを押下し、テーブルの作成ボタンを押下する。

メインメニューからDynamoDBのページを開く。左メニューバーからテーブルを押下し、テーブルの作成ボタンを押下する。
2

次にテーブルの設定を行う。
ここでテーブルの名称を決め、テーブルのプライマリキーとなるパーティションキー(必須)とソートキー(オプション)を決定する。パーティションキーは値がユニークかつ一意である必要があるため、設定するキーは注意すること。(値が被る可能性があるものだったり、値が無い可能性があるキーはパーティションキーに設定しないこと。)連番のIDなどをパーティションキーとするとよい。

次にテーブルの設定を行う。
ここでテーブルの名称を決め、テーブルのプライマリキーとなるパーティションキー(必須)とソートキー(オプション)を決定する。パーティションキーは値がユニークかつ一意である必要があるため、設定するキーは注意すること。(値が被る可能性があるものだったり、値が無い可能性があるキーはパーティションキーに設定しないこと。)連番のIDなどをパーティションキーとするとよい。


次にテーブルのカスタマイズを行うかどうかの設定をする。
デフォルトですでにカスタマイズされているテーブルがあるため、その内容で問題なければデフォルトのまま利用するでよい。もし、デフォルト設定から変えたい場合は設定をカスタマイズのほうを選択し、カスタマイズする。

最後にタグを利用する場合は設定を行う。

以上で問題なければテーブルの作成は完了となる。
DynamoDBへのデータ挿入(コンソール上での場合)
1

テーブルのアクションメニューから項目を作成を選択する。

テーブルのアクションメニューから項目を作成を選択する。
2(フォーム入力の場合)

パーティションキーの値を記入する。

ほかに入れたいキーと値が存在する場合は新しい属性の追加を押下し、型を指定する。

入れる値の入力が完了したら項目を作成ボタンを押下する。

パーティションキーの値を記入する。

ほかに入れたいキーと値が存在する場合は新しい属性の追加を押下し、型を指定する。

入れる値の入力が完了したら項目を作成ボタンを押下する。
3(JSON入力の場合)

画面右上にJSONとフォームを切り替えるボタンがあるため、JSONに切り替える。JSON形式でデータを入力し、項目を作成ボタンを押下する。

画面右上にJSONとフォームを切り替えるボタンがあるため、JSONに切り替える。JSON形式でデータを入力し、項目を作成ボタンを押下する。
データ検索手順(コンソール上での場合)


左メニューバーから項目を探索を押下する。
フィルターを設定(ここではID-0条件を付けている)し、実行するを押下すると、フィルタされたデータ一覧が返される。
EC2からの操作
テーブル作成
aws dynamodb create-table --table-name 'テーブル名' \
--attribute-definitions '[{"AttributeName":"キーとなるカラム名","AttributeType": "型名"}]' \
--key-schema '[{"AttributeName":"キーとなるカラム名","KeyType": "HASH"}]' \
--provisioned-throughput '{"ReadCapacityUnits": 読み込みユニット数,"WriteCapacityUnits": 書き込みユニット数}'
ユニット数によって以下のようにテーブルへの読み込み、書き込み速度が変化する。(なお、ユニット数を0に設定すると、データ量によってユニット数が変化するオンデマンドモードになる。)
- 1 秒あたり 24 KB までの強力な整合性のある読み込みを実行する(4 KB x 6 読み込み容量単位)
- 1 秒あたり 48 KB までの結果的に整合性のある読み込みを実行する (2 倍の読み込みスループット)
- 1 秒あたり 12 KB までのトランザクション読み込みリクエストを実行する
- 1 秒あたり 6 KB までの書き込みを実行する (1 KB x 6 書き込み容量単位)
- 1 秒あたり 3 KB までのトランザクション書き込みリクエストを実行する
データ挿入
aws dynamodb put-item --table-name cities --item '{ "カラム名1": { "型名": "値" }, "カラム名2": { "型名": "値" } ...}'
カラムに関しては好きな種類を何個入れても良い。
ただし、キーとなるカラム(プライマリキー)に関しては必ず入っていなければならない、そちらに関しても同じようにカラム名と型名と値を入力すればよい。
ただし、キーとなるカラム(プライマリキー)に関しては必ず入っていなければならない、そちらに関しても同じようにカラム名と型名と値を入力すればよい。
テーブルのデータ取得
aws dynamodb scan --table-name テーブル名
全データ取得となる。
キーを指定してデータの取得
aws dynamodb get-item --table-name cities --key '{ "キーとなるカラム名": {"型名": "値" } }'
キー以外のカラムでのデータ取得は不可。
キーを指定してデータを削除
aws dynamodb delete-item --table-name cities --key '{"キーとなるカラム名": {"型名": "値" }}'
キー以外のカラムでのデータ削除は不可。
テーブルの削除
aws dynamodb delete-table --table-name テーブル名
javaによるDynamoDB操作
javaからawsを操作する場合、aws-java-sdkが必要となる。
https://aws.amazon.com/jp/sdk-for-java/からダウンロードするか、Mavenのpomに記入してダウンロードするなどを行うこと。(下記はpom.xml例)
https://aws.amazon.com/jp/sdk-for-java/からダウンロードするか、Mavenのpomに記入してダウンロードするなどを行うこと。(下記はpom.xml例)
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.256</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>amazon-kinesis-client</artifactId>
<version>1.2.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
テーブルの作成
//テーブルリクエストの作成
CreateTableRequest createTableRequest = new CreateTableRequest().withTableName("テーブル名")
.withKeySchema(new
KeySchemaElement().withAttributeName("鍵となるカラム名").withKeyType(KeyType.HASH))
.withAttributeDefinitions(new
AttributeDefinition().withAttributeName("鍵となるカラム名").withAttributeType(ScalarAttributeType.S))
.withProvisionedThroughput(new
ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L));
//テーブルが存在しない場合に追加を行うようにする
TableUtils.createTableIfNotExists(dynamoDB, createTableRequest);
//テーブルが追加されるまで待つ
TableUtils.waitUntilActive(dynamoDB, tableName);
//前段の設定を利用してテーブルの追加を実行する
DescribeTableRequest describeTableRequest = new
DescribeTableRequest().withTableName"テーブル名);
TableDescription tableDescription = dynamoDB.describeTable(describeTableRequest).getTable();
//追加されたテーブルの確認
System.out.println("Table Description: " + tableDescription);
例えば以下のように利用する。

するとこのようなテーブルが作成される。


するとこのようなテーブルが作成される。

データの追加
//Itemに好きなカラムの要素を記入し、putする
Map<String, AttributeValue>item = newItem("Airplane", 1980, "*****", "James", "Billy Bob");
putItemRequest = new PutItemRequest(tableName, item);
putItemResult = dynamoDB.putItem(putItemRequest);
System.out.println("Result: " + putItemResult);
なお、以下のようにitemの定義をしておくこと。
private static Map<String, AttributeValue> newItem(String name, int year, String rating, String... fans) {
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("name", new AttributeValue(name));
item.put("year", new AttributeValue().withN(Integer.toString(year)));
item.put("rating", new AttributeValue(rating));
item.put("fans", new AttributeValue().withSS(fans));
return item;
}
これを実行すると、先ほど作成したテーブルにデータが追加される。


データの削除
DeleteItemSpec deleteItemSpec = new DeleteItemSpec()
.withPrimaryKey(new PrimaryKey("鍵となるカラム名", "鍵となるカラムで削除したい値"));
// データを削除する
table.deleteItem(deleteItemSpec);
上記2ステップで削除可能