背景・目的
- 先日、Lambdaを定期実行するで作成したLambdaで、Qiitaの記事をデータストアに保存してみる。
- データストアには、今まであまり触ってこなかったDynamoDBを使用してみる。
- 本ページでは、まずはDynamoDBでテーブル作成、簡単なサンプルデータを登録するところまでをスコープとし、Lambdaを利用してのデータ登録等は次回以降に試す。
内容
DynamoDBの概要
DynamoDB(以降、DDBという。)とは
- フルマネージドNoSQLデータベースサービス
- 高速、予測可能なパフォーマンスとシームレスにスケールを提供する。
- ディストリビューションデータベースの運用とスケーリングに伴う管理作業をまかせることができる。
- ハードウェアのプロビジョニング、設定と構成、レプリケーション、ソフトウェアパッチ適用、クラスタースケーリングなどを自分で行う必要はない。
- 保管時の暗号化を提供し、機密データの保護に伴う複雑な運用の負担を取り除く。
高い可用性と耐久性
- 一貫性のある高速パフォーマンスを維持しながら、スループットとストレージの要件を処理できるように、テーブルのデータとトラフィックが十分な数のサーバに自動的に分散される。
- 全てのデータをSSDに保存し、リージョン内の複数AZ間で自動でレプリケートするため、高い可用性とデータ堅牢性が実現する。
- グローバルテーブルにより、DDB
- テーブルをAWSリージョン間で同期可能。
仕組み
コアコンポーネント
- テーブル、項目、属性を指す。
- テーブルは項目の集合、各項目は属性の集合。
- PKを使用してテーブルの各項目を一意に識別し、セカンダリインデックスを使用してクエリの柔軟性を高める。
プライマリーキー
- テーブル作成時には、テーブル名とPKを指定する必要がある。
- パーティションキー
- DDBはパーティションキーを内部ハッシュ関数への入力として使用する。ハッシュ関数からの出力により、項目が保存されるパーティションが決まる。
- パーティションキーとソートキー
- 複合プライマリーキー
- 2つの属性で決まり、1つめがパーティションキー。2つめがソートキー
- 2つめのソートキーでソートされて保存される。
セカンダリーインデックス
- 指定することで、プライマリーキー以外の検索に柔軟性が出る。
- 2種類ある
- グローバルセカンダリーインデックス(以降、GSIという。)
- パーティションキーおよびソートキーを持つインデックス。
- テーブルのものとは異なる。
- ローカルセカンダリーインデックス(以降、LSIという。)
- パーティションキーはテーブルのものと同じ。ソートキーが異なるインデックス。
- グローバルセカンダリーインデックス(以降、GSIという。)
- 各テーブルには、20個のGSIと5個のLSIのクォータがある。
DynamoDB Streams
-
DDBテーブルの変更イベントをキャプチャする。
-
ほぼリアルで、イベントの発生順にストリームに表示される。
-
テーブルでストリームを有効にすると、DDB Streamsは以下のイベントごとにストリーミングレコードを書き込む
- 新しい項目がテーブルに追加された場合、全てをキャプチャ
- 項目が更新された場合、更新された項目の更新前後のキャプチャ
- 削除された場合、削除前の項目全体のキャプチャ
-
24Hの有効期限を持つ。
-
DDB StreamとLambdaで、トリガーを作成できる。
実践
DynamoDBの使用開始を参考に始める。ただし、テーブル名や項目は適宜変更する。
ステップ 1: テーブルを作成する
- qiita_user_articlesというテーブル名で、以下の項目を作成する。
項目名 | キー | タイプ |
---|---|---|
user_id | パーティションキー | 文字列 |
article_id | ソートキー | 文字列 |
1.マネコンのDynamoDBコンソール>ダッシュボード>右側のテーブルの作成をクリック。
2.テーブル名と、パーティションキーを予め決めたものを入力し、設定は一旦デフォルトのままでテーブルの作成をクリック。
3.しばらくするとActivateされ、以下のように確認ができる。
ステップ 2: コンソールまたは AWS CLI を使用して、テーブルにデータを書き込む
4.「新しい属性の追加」でタイプを選ぶと新しい項目が追加される。
ステップ 3: テーブルからデータを読み込む
2.フィルタの属性に「user_id」、値に「test2」を入力し、「実行する」をクリックすると、以下のように表示される。(結果は返されない。)
ステップ 4: テーブルのデータを更新する
- 更新をしてみる。
1.検索結果のパーティションキーがリンクになっているのでクリックする。
2.titleの値を「updated test title」に変更し「変更を保存」をクリックすると、変更されたことが分かる。
ステップ 5: テーブルのデータをクエリする
- ステップ3とほぼ同様なので、省略する。
ステップ 6: グローバルセカンダリインデックスを作成する
1.テーブルを選び、「インデックス」タブをクリック後、画面右上の「インデックスの作成」をクリックする。
2.インデックスの詳細でパーティションキー「title」を指定し、その他は変更せずに「インデックスの作成」をクリックする。
キャプチャなし。
3.しばらくするとActiveになる。最大5分くらいかかるらしい。
ステップ 7: グローバルセカンダリインデックスをクエリする
- 作成したGSIでクエリしてみる。
1.アイテムのスキャン/クエリでテーブルまたはインデックスに先程作成した「title-index」が表示された。
2.title-indexに「updated test title」を指定し「実行する」をクリックする。
3.以下は、title-indexに「deleted test title」を指定し結果が帰らなかった例。
考察
- マネコン上で、テーブルの作成から、データ操作まで簡単にできる。
- DDBのキャパシティーユニットなどは、今後確認する予定。
参考