【AWS-SAA勉強記】第7回_Amazon DynamoDB編

この記事は作者本人がAWS-SAAの学習を通じて、曖昧や覚えづらい部分をサービス単位でまとめたものです。
特に、概要だけではイメージがわきづらいので、できるだけユースケースを活用して理解しやすいようにしています。
教材はSHOEISHAの[AWS教科書 AWS認定ソリューションアーキテクトアソシエイト テキスト＆問題集](https://www.amazon.co.jp/AWS%E6%95%99%E7%A7%91%E6%9B%B8-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%85%A4%E7%94%B0-%E5%BC%98%E6%B3%95/dp/4798183261/ref=sr_1_5?crid=3FF4OG65DFJ67&dib=eyJ2IjoiMSJ9.T249byXp1rsbDxkYXfxXb6fI4BUDNVOMSaquZL-1mVpPGu6oOTJAj19zZAYJR86Jon6ca0-q7sg_Ial5s1cea15f4gmNEJG8LyNQfNCbzfRWbdc3QShULjB2kryq34xDUkL-inBJMmFaiNYCb3lq0OcIRowzNObcgxFyIO96gEzEfcAYd2dxcSG6AHyl5e2DAQpdDy0xOEQZb_sRAX47vahzwyOMS8huPEScwArE3A0.zBHSxW-BjHBATnQ5vd4s6NikPxikuDNRnvEEGpF7d6A&dib_tag=se&keywords=aws+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88+%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88&qid=1724027719&s=books&sprefix=AWS%2Cstripbooks%2C195&sr=1-5)を参考にしています。

## Amazon DynamoDBに関する曖昧な部分
Amazon DynamoDB（以下、DynamoDB）は非リレーショナルデータベースのフルマネージドサービスです。
**シンプルかつ膨大なデータの高速処理や、頻繁に構造が変化するデータに対する柔軟な対応**を得意としています。

DynamoDBで曖昧になりがちな部分は以下の通りです。（あくまでも私個人が曖昧であると感じた部分です）
* プロビジョニングモードとオンデマンドモードの使い分け
* 結果整合性・強力な整合性
* DynamoDB Streams
* Amazon DynamoDB Accelerator（DAX）

## プロビジョニングモードとオンデマンドモードの使い分け
DynamoDBでは、読み取りキャパシティユニット（RCU）により、１秒間に読み取りできる回数を、書き込みキャパシティユニット（WCU）により、１秒間に書き込み出来る回数を調整できます。
**RCU、WCUにより、DynamoDBテーブルに対する読み取りと書き込みの処理性能を個別に設定することが可能**です。

### プロビジョニングモード
DynamoDBのプロビジョニングモードでは、**RCU、WCUを管理者が指定し、テーブルに対して読み取り、書き込みの処理できる量を指定**することができます。
しかし、設定値を超える大量のリクエストを受け取った場合には、エラーが発生します。

**リクエストが緩やかに増加、減少を繰り返す場合**には、**RCU、WCUに対して、Auto Scalingを設定**します。
ただし、`短時間での急激な増加となるスパイクが発生する場合には、AutoScalingでは対応できない場合があります。`

### オンデマンドモード
`短時間での急激な増加となるスパイクが発生する場合`、つまり、**読み取り、書き込みの予測が困難な場合には、オンデマンドモードを使用します。**

### プロビジョニングモードとオンデマンドモードの使い分け
継続的にリクエストが発生する場合、一般的にプロビジョニングモードの方がオンデマンドモードよりもコストを抑えられます。
- **多数のリクエストが発生する場合**
    - プロビジョニングモードを使用
- **通常リクエストは低いが、突発的に高くなるような予測が難しい場合**
    - オンデマンドモードを使用


## 結果整合性・強力な整合性
DynamoDBでは、整合性を制御するオプションを選択することができます。

### そもそも結果整合性・強力な整合性とは？
- **結果整合性 (Eventual Consistency)**
    - 変更中のデータが完了していない間も、他の人は古いデータを参照できるモデルです。
    - 一時的に古いデータが参照される可能性があるが、最終的には更新後のデータに反映されます。
    - 可用性とスケーラビリティを重視する場合に採用されます。
- **強力な整合性 (Strong Consistency)**
    - 変更中のデータが完了するまで、他の人は古いデータが参照できないモデルです。
    - 見ているデータは最新のものであることが保証されます。
    - データの信頼性が求められる場面で採用されます（例: ユーザ情報の更新）。

DynamoDBでは、データベースの整合性としてこれらのうちいずれかを選択することが可能です。

### 結果整合性と強力な整合性の選択
DynamoDBにおいて、結果整合性と強力な整合性のいずれを選択するかはユースケースによります。
- **コスト**
    - 強力な整合性の場合、2つのデータを取得および比較し、整合性のあるデータを取得します。そのため、コスト面では、**結果整合性**の方が安価にすみます。
- **データ管理の厳密性**
    - 厳密なデータの管理を行いたい場合は、**強力な整合性**が推奨されます。

上記の観点から、アプリケーションの設計要件次第で選択することが重要です。


## Amazon DynamoDB Streams
Amazon DynamoDB Streamsは、**DynamoDBテーブル内の項目レベルの変更に関するシーケンスを時間順にキャプチャし、その情報を最大24時間ログに保存する機能**です。

つまり、テーブル内のデータが作成、更新、削除されるたびに、変更された項目のプライマリキー属性を付けてストリーミングレコードを書き込みます。
**アプリケーションはこのログにアクセスし、データ項目の変更前および変更後の内容をほぼリアルタイムで参照**できます。

### 具体的なユースケース
Amazon DynamoDB Streamsの具体的なユースケースをいくつか挙げます。

- **リアルタイムなデータ同期**
DynamoDB Streamsは、テーブル内の変更をリアルタイムでキャプチャするため、複数のDynamoDBテーブル間でデータを同期する際に活用されます。
例えば、ユーザーのプロフィール情報を別のテーブルに反映させる場合などです。
- **トリガーベースの処理**
DynamoDB Streamsを使用して、特定のイベントが発生した際にLambda関数をトリガーすることができます。例えば、新しい注文がテーブルに追加されたら、通知を送信するLambda関数を実行するなどです。
- **データの変更履歴の監査**
DynamoDB Streamsは、データの変更履歴を記録するために使用されます。特定のアイテムがいつ、どのように変更されたかを追跡できます。
- **バッチ処理の最適化**
DynamoDB Streamsを使用して、バッチ処理を最適化できます。変更されたデータのみを処理することで、効率的なバッチジョブを実行できます。


## Amazon DynamoDB Accelerator（DAX）
Amazon DynamoDB Accelerator (DAX) は、**DynamoDB用に構築されたフルマネージド型で可用性の高いインメモリキャッシュサービス**です。
DAXは、**DynamoDBへのアクセスを高速化し、レスポンスタイムを低減**させることを目的としています。

### 具体的なユースケース
Amazon DynamoDB Acceleratorの具体的なユースケースをいくつか挙げます。

- **リアルタイムな応答が必要なアプリケーション**
リアルタイム入札、ソーシャルゲーム、取引アプリなど、読み取りに高速な応答時間が求められるアプリケーションに適しています。
- **特定のアイテムの頻繁な読み取り**
特定のアイテムを他よりも頻繁に読み取るアプリケーションに適しています。例えば、一日限りのセールで特定の商品の需要が急増する場合などです。
- **オーバープロビジョニングの削減**
読み取りが多いワークロードやバーストワークロードにおいて、DAXはスループットを増加させ、オペレーションコストを削減します。

## まとめ
本記事では、以下についてまとめました。
* プロビジョニングモードとオンデマンドモードの使い分け
* 結果整合性・強力な整合性
* DynamoDB Streams
* Amazon DynamoDB Accelerator（DAX）

次回は[【AWS-SAA勉強記】第8回_セキュリティ、アイデンティティ、コンプライアンス編](https://qiita.com/sknp/items/842f4dee277d1f9e3a02)です。