Amazon DynamoDB

## 1.Amazon DynamoDB とは？
マネージド型のNoSQLデータベースサービスです。



## 2.NoSQLって何？
データベースを分類すると、RDBMSとNoSQLに分けることができます。
SQLを使わずにデータの操作ができるデータベースがNoSQLです。

高速かつ予測可能なパフォーマンスとシームレスな拡張性が提供されます。
NoSQLデータサービス利点の1つは、同じテーブル内の項目がさまざまな属性を持っていても構わないと言う点です。
これにより、アプリケーションの発展に応じて、柔軟に属性を追加していくことが可能です。

NoSQLはキーに対するデータ形式の格納方式の違いで様々なタイプのNoSQLが存在します。

|データ形式||
|---|---|
|キーバリューストア|キーに対してバリュー（値）を入れる単純な構造<br>高速なパフォーマンスと分散型拡張に優れている<br>データ読み込みが高速|
|ワイドカラムストア|列指向とも呼ばれ、キーを利用するがデータはレコード（行）で管理する<br>非構造データを大規模に格納することを目的にしている<br>行ごとに任意の名前のカラムを無数に格納できる|
|ドキュメントデータベース|キーに対してバリューではなく、JSONやXMLなどのデータを格納<br>複雑なデータ構造を扱うアプリで生産性高く柔軟に開発する|
|グラフデータベース|グラフ理論に基づき、データ同士の関係をグラフで総合に結びついた要素で構成される|RDBと比較して高速横断検索が可能|

DynamoDB はキーバリュー（ワイドカラム型）でデータを簡易に操作することが主要な役割です。


## 3.特徴

- 無制限に性能を拡張できます。
- SSDに保存され、シンプルなクエリ言語によって、安定した低レイテンシーのクエリパフォーマンスが実現可能です。
- 高可用性、3AZに保存されます。
- マネージド型のためメンテナンスがいりません。
- プロビジョンドスループット。テーブルごとにRead（RCU）とWrite（WCU）に必要なスループットキャパシティを割り当てることが可能です。なお、スループットキャパシティの変更は無停止で行うことが可能です。
- [新機能 – DynamoDB Transactions](https://aws.amazon.com/jp/blogs/news/new-amazon-dynamodb-transactions/)
- 更新 (または削除) しているクライアント側の項目が、Amazon DynamoDB の項目と確実に同じになるようにするための[オプティミスティックロック](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)をサポートしている。
- 条件付き書き込みが成功するのは項目の属性が 1 つ以上の想定条件を満たす場合のみとなり、それ以外はエラーを返すように、[条件付き書き込み](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.ConditionalUpdate)をサポートしている。[Conditional Updates](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html#Expressions.ConditionExpressions.SimpleComparisons)



## 4.整合性モデル
結果整合性モデルを採用している。

・Write：少なくとも２つのAZでの書き込み完了が確認とれた時点で完了
→1 つの書き込みリクエストユニットは、最大でサイズが 1 KB までの項目について 1 回の書き込みを表します。

・Read
→1 つの読み込みリクエストユニットは、最大サイズ 4 KB の項目について、1 回の強力な整合性のある読み込みリクエスト、あるいは 2 回の結果整合性のある読み込みを表します。

- 結果整合性モデル（デフォルト）：最新の書き込み結果が即時読み取り処理に反映されない可能性
- 強い整合性モデル：GetItem／Query／Scanでは強い整合性のある読み込みオプションが指定可能

※強い整合性モデルは3つのAZで完全に保存されたデータのみを読み込むため、書き込み直後のデータの読み込みを行うと、読み込みに長い時間を要して、最終的にタイムアップになる場合もあります。なお、RCUを２倍消費します。


## 5.ユースケース

- ビッグデータ
 - 大量のデータを収集・蓄積・分析するためのデータベースとして活用
 - Hadoopと連携してビッグデータ処理が可能
- アプリケーション
 - 大規模サービスでのデータ高速処理が必要なアプリケーション向けに活用
 - 多数のユーザーが一度にアクセスするようなアプリケーションのデータ処理など

要するに、ビッグデータ処理向けか大量データ処理が必要なアプリケーション向けに利用する。


## 6.基本的なテーブル設計

- テーブル→項目→属性と設計する。なので、データベースを作りましょう！ではなく、テーブルを作りましょう！から始まっていく。
- 属性はVALUE型やJSON型など不ぞろいであっても構わない。
- ハッシュキーは単独での重複を許さない。レンジキーはハッシュキーと組み合わせ、複合キーと同時に利用していく。複合キーは単独であれば重複が許される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/69656227-af3c-5e67-2dbe-e8598e1432a0.png)

プライマリキー(パーティションキー、ソートキー)については↓の記事がわかりやすい！
[DynamoDBのキー・インデックスについてまとめてみた](https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd#%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)


## 7.データを取得する方法

- クエリ：ハッシュキーとレンジキーにマッチする項目を取得。
- スキャン：テーブルを全件検索する。

後者の方法では、効率は下がる。そのため、テーブルの項目を一意に特定できるように配置しておくことが重要です。

なお、オリジナルのテーブルのパーティションキー・ソートキーだけでは不十分な場合、別のパーティションキー・ソートキーを設定することができます。

- LSI（ローカルセカンダリインデックス）
- GSI（グローバルセカンダリインデックス）

ただし、LSI,GSIはスループットやストレージ容量を追加で必要で書き込みも増大するため、多様するべきではありません。

GSI,LSIについても[DynamoDBのキー・インデックスについてまとめてみた](https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd#%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)がわかりやすいと思うので詳細はここでは書かない。

なお、LSIは、テーブルの作成前に設定して同時に作成されることに注意してください。LSIを既存のテーブルに追加したり、現在存在するLSIを削除したりすることはできません。



## 8.DynamoDB Streams

DynamoDB テーブルに保存された項目の追加・変更・削除の発生時の履歴をキャプチャできる機能です。

- データの保存
 - 24時間保存される。(24時間経過したデータは消去される)
 - データ容量はマネージド型で自動的にAWS側で管理される。

- データ保存の順番
 - 操作が実施された順番に応じてデータはそのままシリアライズされる
 - 特定のハッシュキーに基づいた変更は正しい順番で保存されるが、ハッシュキーが異なる場合は受信した順番が前後される可能性があるので絶対に実行された通りではない。

- DynamoDB Streams の使いどころ。
 - クロスリージョンレプリケーション
 - ゲームやソーシャルサイト等のユーザの集計、分析、解析のための非同期集計
 - ユーザーが新しい写真をアップロードするとすぐにサークル内のすべての友人のモバイルデバイスに自動的に通知するモバイルアプリケーションの構築等


## 9.DynamoDB Accelerator (DAX)

1DAXはDynamoDBにインメモリキャッシュ型の機能を付加し、DynamoDBにおいて高速なインメモリパフォーマンスを可能にします。
DynamoDBの間にDAXクラスターを持たせ、キャッシュする仕組み。
1秒間に数百万件のリクエストを処理できる。
[Amazon DynamoDB Accelerator (DAX) を使ってみた](https://qiita.com/mrt_tech/items/c72e4c2ce95e0cd499bb)

- 結果整合性モデル
読み込みクエリを実行した場合、DAXはキャッシュを確認し、キャッシュがあればそのままクライアントにキャッシュを返します。
キャッシュがなかった場合、DAXはDynamoDBからデータを取得し、DAXにキャッシュとして格納します。そして、クライアントにクエリに結果を返します。

- 強い整合性
読み込みクエリが実行された場合、DAXは何もせずDynamoDBにクエリを発行し、レスポンスをそのままクライアントに返します。このとき、結果はキャッシュされません。
書き込みクエリを実行した場合、DynamoDBに書き込みが行われ、書き込んだデータがDAXのキャッシュにも格納されます。

[[2021/02/15]Amazon DynamoDB Accelerator (DAX) が次世代のバースト可能な汎用 Amazon EC2 T3 インスタンスタイプのサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2021/02/amazon-dynamodb-accelerator-dax-now-supports-amazon-ec2-t3-instance-types/)

## 10.グローバルテーブル

リージョン間で同期されるマルチマスターテーブルを作成可能です。

- 世界中で複数のリージョンにエンドポイントを持つことができます。
- 読み書きのキャパシティに加えて、クロスリージョンレプリケーションのデータ転送料金が課金されます。
- オプションで実施できた強い整合性はできません。


## 11.バックアップ

- オンデマンドバックアップ：バックアップ操作を行った時点のテーブルデータ全てを保存します。保存されている間課金され続けるので、バックアップしたテーブルのサイズによって費用が違ってきますが、いつでもバックアップ取得時点のデータにリストアすることができます。
- 連続的バックアップ：有効にした時点からテーブルに対する全ての更新処理が記録されます。最大で３５日間の連続的バックアップが保存され、バックアップが保存されている期間内であれば、ポイントタイムリカバリが可能です。


## 12.Read/Writeキャパシティオンデマンド

キャパシティ設定不要でリクエストに応じた課金設定が選択可能です。

- トラフィック量の予測が困難な場合にリクエストの実績数に応じて課金される。
- オンデマンドでRead／Write処理に自動スケーリングを実施することが可能です。

|RCU|WCU|
|----------|----------|
|1 秒あたりの読み込み項目数 x 項目のサイズ (4 KB ブロック)|1 秒あたりの書き込み項目数 x 項目のサイズ (1 KB ブロック)|


## 13.スループット

|最大スループット|最小スループット|
|----------|----------|
|制限なく拡張できる<br>各テーブルのスループットレートが 10,000 WCU 10,000 RCU を超える場合は、緩和申請が必要。<br>1 アカウントから 20,000 を超えるWCUまたはRCUをプロビジョニングする場合も、緩和申請が必要。|Auto Scaling の場合でも、手動でスループットをプロビジョニングする場合でも、リクエスト可能なプロビジョンできる最小スループットは、1 WCUと 1 RCU です。<br>25 WCUと 25 RCUは無料利用範囲枠です。|


## 14.TTL

S3でいう、ライフサイクルポリシーみたいな機能。
[DynamoDBの各データを自動で削除する機能（TTL:Time to Live）を試してみた](https://dev.classmethod.jp/cloud/aws/try-dynamodb-ttl/)

**機能**
テーブルの項目の有効期限が切れ、データベースから自動的に削除できるタイミングを定義出来る

**メリット**
プロビジョニングされたスループットを使用することなく、関連性のないデータのストレージ使用量と保存コストを減らせる

**TTL属性**
TTL属性には、エポック形式を用いる。
[DynamoDB の Time to Live (TTL) を設定するにはどうすればよいですか。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ttl-dynamodb/)


## 15.課金

- 無料利用枠を超える場合は、そのスループット容量に対して 1 時間ごとに課金され、テーブルにリクエストを送信するかどうかにかかわらず、スループット容量に対して 1 時間ごとに課金される.
- データストレージに対する料金と標準のインターネットデータ転送料金も課金されます。

[Amazon DynamoDB 料金](https://aws.amazon.com/jp/dynamodb/pricing/)


## 16.項目の操作

|オペレーション |説明 |
|--- |--- |
|BatchGetItem | 1 つ以上のテーブルから最大 100 個の項目を読み取ります。|
|BatchWriteItem | 1 つ以上のテーブルから最大 25 個の項目を作成または削除します。|


## 17.DynamoDBトランザクション

２つのDynamoDBテーブルを同時に更新するか、全く更新しないデータ処理を実施するためにはDynamoDBトランザクション機能を使用することが有効です。

DynamoDB トランザクションを利用することで、DynamoDBテーブル内およびテーブル間の複数の項目を調整したり、変更しないといった、開発者のエクスペリエンスを簡素化することができます。DynamoDB トランザクション読み取り/書き込み API を使用し、1 つのオールオアナッシングオペレーションとして複数の項目の追加、更新、または削除が必要となる複雑なビジネスワークフローを管理できます。

## 18.S3→DynamoDBへのインポート

https://dev.classmethod.jp/articles/amazon-dynamodb-import-amazon-s3-data-into-a-new-table/

## 19.Demo
[Amazon DynamonDB demo](https://qiita.com/leomaro7/items/eb901e72e3c622671e35)
[Amazon DynamoDB ハンズオン](https://qiita.com/leomaro7/items/56a80eaa328c3b0844ba)
[Amazon DynamoDB 詳しく設定を見てみた](https://qiita.com/leomaro7/items/423e756f770cab5222cd)
[DynamoDB の条件付き書き込みを試してみる　- condition-expression](https://qiita.com/leomaro7/items/b8274db043e37189e59b)
[DynamoDB CLI](https://qiita.com/leomaro7/items/f35c30421ed6b92c57ec)
[DynamoDBで一部の属性のみを取得する（プロジェクション式）--projection-expression](https://qiita.com/leomaro7/items/0640fafc633e446e34a1)