この資料は JAWS FESTA 2023 Kyushu で行われるハンズオンために書かれました。
イベントページはこちら。
手を動かしながら Amazon DynamoDB の基本を学ぶことができます。
Amazon DynamoDB(以下、DynamoDB) は高速で予測可能なパフォーマンスやシームレスなスケーラビリティを提供するフルマネージドでサーバーレスの key-value NoSQL データベースサービスです。
以下のような利点があります。
DynamoDB では以下のような特徴があります。
DynamoDB では以下のような機能が提供されています。
以下のような1秒間に数百万回のリクエストを処理する必要がある業界で使われています。
詳細は AWS 公式サイト「Amazon DynamoDB」のユースケースセクションをご覧ください。
DynamoDB の課金対象は大きく分けて以下の 2 つです。
さらに 1. には「オンデマンド」と「プロビジョニング」という 2 種類のキャパシティモードがあり、それぞれのモードにおけるテーブルの読み書き処理について別個の請求オプションがあります。
詳しくはAWS公式サイト「Amazon DynamoDB 料金」をご覧ください。
Amazon DynamoDBには無期限の無料利用枠があります。
安心安全 AWS 公式ドキュメントのリンクはこちらです↓
例えば以下のようなものが載っています。
今回のハンズオンは公式ドキュメントの内容を元に作成しています。
属性は、基盤となるデータ要素であり、それ以上分割する必要がないものです。
参考:AWS 公式ドキュメント「Amazon DynamoDB のコアコンポーネント」
項目は、他のすべての項目間で一意に識別可能な属性の集合です。
参考:AWS 公式ドキュメント「Amazon DynamoDB のコアコンポーネント」
テーブルの重要な用語は以下の通りです。
それぞれの用語について説明していきます。
その名の通りテーブルの名前です。
a-zA-Z0-9_ (下線)- (ダッシュ).(ドット)詳細については、AWS 公式ドキュメント「Amazon DynamoDB でサポートされるデータ型と命名規則」を参照してください。
現在のテーブルの状態について知ることができます。AWS SDK for Java V2 では以下のような状態が定義されています。(一部抜粋)
テーブルの項目を一意に識別するために使用される属性または属性のセットです。
DynamoDB は 2 種類の異なるプライマリキーをサポートします。
プライマリキー属性はスカラー値である必要があり、許可される唯一のデータ型は、文字列、数値、またはバイナリです。
参考:AWS 公式ドキュメント「Amazon DynamoDB のコアコンポーネント」
1 つの属性で構成されたシンプルなプライマリキーです。
同じパーティションキー値を持つすべての項目をソートしてまとめて保管するための複合プライマリキーです。
Query) でテーブルから複数の項目を読み取ることができるDynamoDB では、次の 2 種類のインデックスをサポートしています。
テーブルで読み込みおよび書き込みを処理するためのキャパシティモードについて説明します。
オンデマンドキャパシティモードの特徴は以下の通りです。
オンデマンドキャパシティモードは以下のような場合に適しています。
プロビジョニングキャパシティモードの特徴は以下の通りです。
プロビジョニングキャパシティモードは以下のような場合に適しています。
プロビジョニングモードのテーブルでは、読み取りキャパシティユニット (RCU) と書き込みキャパシティユニット (WCU) の観点でスループットキャパシティを指定できます。
参考:AWS 公式ドキュメント「読み取り/書き込みキャパシティモード」
コストの最適化に役立つように設計された 2 つのテーブルクラスが用意されています。
テーブルクラスに関する料金の詳細については、「Amazon DynamoDB の料金表」を参照してください。
参考:AWS 公式ドキュメント「テーブルクラス」
削除保護はテーブルの削除を防ぐために使用される機能です。







トップページには座学編で説明した内容が書かれています。

では早速、テーブルを作成していきましょう!


書棚を管理するためのテーブルを作成していきます。

以下の内容を入力します。
Books」と入力します。ISBN」と入力します。Title」と入力します。ISBN(アイエスビーエヌ)は、International Standard Book Number の略称(頭字語)。図書(書籍)および資料の識別用に設けられた国際規格コード(番号システム)の一種
引用:Wikipedia「ISBN」

Group」と入力します。jft2023-dynamodb-handson」と入力します。
「テーブルの作成」をクリックするとテーブル一覧が表示され、自動的に作成処理が開始されます。テーブルの作成にはしばらく時間がかかりますが、テーブルが作成中かどうかの状態などを一覧から確認できます。通常、1 分程度で完了します。

作成が完了すると以下のような画面になります。

テーブルを作成できました!🎉
それでは最初の項目を追加してみましょう。



ISBN」に「978-1234567890」と入力します。Title」に「Sample Book 1」と入力します。Author」、値に「John Doe」と入力します。PublicationYear」値に「2022」と入力します。
項目が追加されました!🎉

参考:https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/getting-started-step-2.html
もう 1 つ項目を追加してみましょう。

先ほどはフォームに入力しましたが、今度は DynamoDB JSON を入力してみます。

{
"ISBN": { "S": "978-0987654321" },
"Title": { "S": "Sample Book 2" },
"Author": { "S": "Jane Smith" },
"PublicationYear": { "N": "2023" }
}

DynamoDB では、JSON を使用して項目を作成することもできます。
JSON ビューにした際に「DynamoDB JSON の表示」トグルをクリックしてオフにすると、生の JSON を編集することができます。例えば以下のような JSON を入力して項目を作成することができます。
{
"ISBN": { "S": "978-1111222233" },
"Title": { "S": "Sample Book 3" },
"Author": { "S": "Alice Brown" },
"PublicationYear": { "N": "2020" }
}
余裕があれば試してみてください。

様々な方法で項目を検索してみましょう。
全ての項目のデータ属性を返します。1 回のスキャンで最大 1 MB のデータを返すことができます。
実は項目作成後に見た「返された項目」はの内容はスキャンの結果です。

テーブルまたはインデックス内の項目をクエリします。パーティションキーやソートキーを指定して検索することができます。
今回は ISBN が「978-1234567890」の項目を検索してみましょう。
ISBN」に「978-1234567890」と入力します。
クエリできました!🎉

フィルター機能も試してみましょう。クエリと違い、フィルタはスキャンやクエリの後に行うことができます。
Title」に文字列」に次と等しい:」にSample Book 2」に
フィルタできました!🎉

項目の操作をやってみましょう。
任意の項目を編集してみます。

PublicationYear」を「2023」に変更します。
編集できました!🎉

次に項目を複製してみます。

見慣れてきたフォームが表示されます。プライマリキーであるパーティションキーとソートキーの複合キーは一意である必要があるので変更する必要があります。
ISBN」を「978-1234567891」に変更します。Title」を「Sample Book 1 Copy」に変更します。
複製できました!🎉

最後に項目を削除してみます。


削除できました!🎉

テーブルアイテムをCSVダウンロードしてみましょう。


ここではグローバルセカンダリインデックスの追加とその動きを見ていきましょう。
インデックスタブを開く![[9005502645341738] スクリーンショット 2023-10-07 1.23.07](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/1fa98e49-fcdf-48e7-8bec-4e7946f4bbdb.png)
インデックスの作成をクリックする![[9005502645148844] スクリーンショット 2023-10-07 1.26.17](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/484e9933-30c9-445f-afbf-0e5201e20bda.png)
TitleTitle-All-Index![[9005502642510468] スクリーンショット 2023-10-07 2.10.16](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/1f8024a2-d8b7-4325-972f-a12292438888.png)
![[9005502644969926] スクリーンショット 2023-10-07 1.29.16](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/1e0f1e54-52a1-42d7-a736-96cca1f33a30.png)
![[9005502644904375] スクリーンショット 2023-10-07 1.30.02](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/492b3248-a112-4268-af42-c5aa543f07c1.png)
インデックスの作成をクリックする![[9005502644562107] スクリーンショット 2023-10-07 1.36.06](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/7c050d20-1562-4b85-8c13-8146959e3641.png)
アクティブになるまで待つ![[9005502644391946] スクリーンショット 2023-10-07 1.38.54](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/21f13b53-6cc8-4110-aa9d-ed90bc558444.png)
![[9005502643873292] スクリーンショット 2023-10-07 1.47.40](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/2f78d726-a1bc-45b9-96c9-2cf73324c001.png)
97848840230926海の底有川浩9784043898022海の底有川浩インデックス - Title-All-Index海の底![[9005502642996970] スクリーンショット 2023-10-07 2.02.07](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/1822a73f-df6f-489d-a751-93cfe40d4fbd.png)
2件、タイトルで検索ができました。
グローバルセカンダリインデックスは、パーティションキーを指定して一意に決まらない唯一のインデックスなのです。
テーブルのバックアップ操作をやってみましょう。
バックアップのタブを選択します。


バックアップできました!🎉

テーブルの復元にはしばらく時間がかかりますが、テーブルが復元中かどうかの状態などを一覧から確認できます。今回のデータ量だと、5~10分程度で完了します。
復元出来ました!🎉


