AWS DVA対策メモ(DynamoDB)

## Amazon DynamoDBのアーキテクチャ、データ配置、結果整合性

Amazon DynamoDBの基本的なアーキテクチャ、データの配置方法、および結果整合性について解説します。

---

### **1. DynamoDBのアーキテクチャ**

- **分散型NoSQLデータベース**:
  - DynamoDBは分散型の設計で、データの高可用性と高スループットを提供します。
- **基本構造**:
  - **テーブル**: データを格納する基本単位。
  - **アイテム**: テーブル内の1行に相当。
  - **属性**: アイテム内のフィールド。

---

### **2. データ配置**

#### **パーティションの仕組み**
- DynamoDBはデータを複数のパーティションに分散して保存します。
- **パーティションキー**（主キーの一部）を使用して、データを均等に分散。

#### **パーティション設計のポイント**
- 一意性を保つキーを選択することで、データとトラフィックを均等に分散。
  - 適切な例: ユーザーID、日付の組み合わせ。
  - 不適切な例: 固定値や偏りのある値。

#### **パーティションの利点**
- **スケーラビリティ**: 各パーティションが独立して処理を行うため、大量のデータを効率的に処理。
- **コスト効率**: データアクセスパターンに基づいた設計で無駄なコストを削減。

---

### **3. 結果整合性**

#### **読み取り整合性のタイプ**
1. **結果整合性 (Eventually Consistent Reads)**:
   - デフォルトの読み取り整合性。
   - データ変更後、数ミリ秒の遅延で最新データが反映。
   - 高スループットと低コストを実現。

2. **強整合性 (Strongly Consistent Reads)**:
   - 最新データを即座に返す。
   - パフォーマンスよりもデータの正確性が重要な場合に使用。

3. **トランザクション読み取り (Transactional Reads)**:
   - 複数アイテムを一貫性を保って操作。
   - ACID特性をサポート。

#### **整合性の選択ポイント**
- **結果整合性**:
  - 高トラフィックで一時的なデータ遅延が許容される場合に適応。
- **強整合性**:
  - 正確なデータが必要なシステム（例: 金融や注文処理）で使用。
- **トランザクション読み取り**:
  - 複数アイテムを確実に更新・取得したい場合に最適。

---

### **まとめ表**

| 特徴                   | 説明                                                                                   | 主な用途                                     |
|------------------------|---------------------------------------------------------------------------------------|--------------------------------------------|
| **アーキテクチャ**     | 分散型NoSQLデータベース。テーブル、アイテム、属性で構成。                                 | 高可用性と高スループットが必要なアプリケーション |
| **データ配置**         | パーティションキーに基づきデータを分散。                                                 | 均等なデータ分散とスケーラビリティの向上。     |
| **結果整合性**         | デフォルトの整合性モデル。更新後すぐには反映されない場合があるが、高スループットを提供。         | データ遅延を許容するアプリケーション。         |
| **強整合性**           | 最新データを即座に読み取るモデル。                                                       | データ正確性が重要な場合。                   |
| **トランザクション整合性**| 複数アイテムの一貫性を保証。ACID特性を提供。                                             | 複雑な操作や安全性が求められる場合。           |

---

### **ユースケース例**
- **結果整合性**:
  - ソーシャルメディアのフィード。
  - ユーザーランキングのリアルタイム更新。
- **強整合性**:
  - 金融取引や注文処理。
  - インベントリ管理。
- **トランザクション整合性**:
  - 複数テーブルをまたがる注文更新。
  - バッチ処理。

---
## Amazon DynamoDBのキー属性とインデックス

Amazon DynamoDBでは、効率的なデータ管理とクエリ実行のためにキー属性とインデックスを利用します。

---

### **1. キー属性**

#### **1.1 主キー（Primary Key）**
- DynamoDBテーブルでアイテムを一意に識別するための属性。
- **主キーの種類**:
  1. **単一キー (Simple Primary Key)**:
     - パーティションキー（Partition Key）のみを使用。
     - 各アイテムは一意のパーティションキーを持つ。
     - 例: ユーザーID。
  2. **複合キー (Composite Primary Key)**:
     - パーティションキーとソートキー（Sort Key）の組み合わせ。
     - パーティションキーが同じでも、異なるソートキーを持つことで一意性を保つ。
     - 例: 注文テーブルで、ユーザーID（パーティションキー）と注文日（ソートキー）。

#### **1.2 主キー設計のポイント**
- **パーティションキーの選択**:
  - 均等にデータを分散する値を選ぶ。
  - 偏りがあると特定のパーティションが過負荷になる。
- **ソートキーの活用**:
  - 時系列データや範囲クエリを活用する場合に便利。

---

### **2. インデックス**

#### **2.1 グローバルセカンダリインデックス（GSI: Global Secondary Index）**
- **特徴**:
  - パーティションキーとソートキーを独立して指定可能。
  - テーブルの主キーとは異なる組み合わせでクエリを実行。
- **用途**:
  - 異なる属性で柔軟な検索を実現。
  - 例: メールアドレスをキーとしてユーザーを検索。

#### **2.2 ローカルセカンダリインデックス（LSI: Local Secondary Index）**
- **特徴**:
  - テーブルのパーティションキーを共有し、異なるソートキーを指定。
  - テーブル作成時にのみ設定可能（後から追加不可）。
- **用途**:
  - 同じパーティションキー内で異なる属性でソートする場合。
  - 例: ユーザーIDで検索し、ソートキーを日付順に並べる。

#### **2.3 インデックス設計のポイント**
1. **GSI**:
   - 柔軟なクエリが可能。
   - 読み取り/書き込みキャパシティを個別に設定可能。
2. **LSI**:
   - パーティションキー依存の範囲クエリに最適。
   - テーブルのデザイン段階で慎重に設定が必要。

---

### **3. 主キーとインデックスの比較表**

| 種類                      | 特徴                                                                                       | 主な用途                                       |
|---------------------------|-------------------------------------------------------------------------------------------|----------------------------------------------|
| **単一キー**              | パーティションキーのみでアイテムを識別。                                                     | ユニークIDでデータを一意に管理。               |
| **複合キー**              | パーティションキーとソートキーの組み合わせでアイテムを識別。                                   | 時系列データや特定の属性でのクエリ。           |
| **グローバルセカンダリインデックス (GSI)** | 主キーとは異なるパーティションキーとソートキーを設定可能。                                   | 柔軟な検索パターンを実現。                     |
| **ローカルセカンダリインデックス (LSI)**  | 主キーのパーティションキーを共有し、異なるソートキーでクエリ可能。                           | 同じパーティションキー内で異なる属性でのソート。 |

---

### **4. ユースケース例**
- **単一キー**:
  - ユーザー情報をユーザーIDで検索。
- **複合キー**:
  - ユーザーIDと日付を組み合わせて注文履歴を検索。
- **GSI**:
  - メールアドレスやその他のユニーク属性で検索。
- **LSI**:
  - ユーザーIDごとのイベント履歴を日付順にソート。

---
## Amazon DynamoDBのキャパシティユニット

Amazon DynamoDBでは、データの読み取りおよび書き込みのパフォーマンスを設定するためにキャパシティユニットを使用します。

---

### **1. キャパシティモード**

DynamoDBでは、2種類のキャパシティモードを提供しています。

#### **1.1 オンデマンドキャパシティモード**
- **特徴**:
  - 自動スケーリングでトラフィックに応じて必要なキャパシティを調整。
  - 使用したリクエスト数に応じて料金が発生。
- **適したユースケース**:
  - トラフィックが予測困難なアプリケーション。
  - 開発環境や小規模アプリケーション。

#### **1.2 プロビジョンドキャパシティモード**
- **特徴**:
  - 読み取りおよび書き込みキャパシティを手動で設定。
  - ステーブルなトラフィックを持つアプリケーションに最適。
- **スケーリング方法**:
  - 自動スケーリング機能を使用してキャパシティを調整可能。
- **適したユースケース**:
  - トラフィックが一定で予測可能なアプリケーション。

---

### **2. キャパシティユニットの種類**

#### **2.1 読み取りキャパシティユニット (RCU: Read Capacity Unit)**
- **1 RCUの定義**:
  - 1秒間に最大4KBのデータを1回の**結果整合性読み取り**で処理可能。
  - **強整合性読み取り**では2倍のRCUが必要。
  - **トランザクション読み取り**では4倍のRCUが必要。

#### **2.2 書き込みキャパシティユニット (WCU: Write Capacity Unit)**
- **1 WCUの定義**:
  - 1秒間に最大1KBのデータを1回の書き込みで処理可能。
  - **トランザクション書き込み**では2倍のWCUが必要。

---

### **3. キャパシティの最適化**

#### **3.1 アクセスパターンの分析**
- アプリケーションの読み取り/書き込み頻度を把握し、適切なキャパシティモードを選択。

#### **3.2 キャッシュの活用**
- DynamoDB Accelerator (DAX) を使用して、高速でキャッシュされた読み取りを実現。

#### **3.3 パーティション設計**
- パーティションキーを適切に設計して、負荷を均等に分散。

---

### **4. 主なユースケース**

| キャパシティモード         | 特徴                                                                                       | 主な用途                                     |
|--------------------------|-------------------------------------------------------------------------------------------|--------------------------------------------|
| **オンデマンドキャパシティ** | 自動スケーリングで柔軟な対応が可能。                                                       | 不規則なトラフィック、開発環境、小規模アプリ。 |
| **プロビジョンドキャパシティ**| 手動でキャパシティを設定し、予測可能なトラフィックに対応。                                   | 一定のトラフィックを持つアプリケーション。     |

---

## Amazon DynamoDBのAPIと主要パラメータ

DynamoDBの主要APIとそのパラメータを以下にまとめます。

| API名                | 説明                                                                                 | 主なパラメータ                                                                                             |
|----------------------|---------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| **PutItem**          | テーブルにデータを追加または更新。                                                      | `TableName`, `Item`, `ConditionExpression`, `ReturnValues`                                               |
| **GetItem**          | 主キーを指定してデータを取得。                                                         | `TableName`, `Key`, `ProjectionExpression`, `ConsistentRead`                                             |
| **Query**            | パーティションキーを基準に条件を満たすアイテムを取得。                                   | `TableName`, `KeyConditionExpression`, `ExpressionAttributeValues`, `ProjectionExpression`, `ScanIndexForward` |
| **Scan**             | テーブル全体をスキャンして条件を満たすアイテムを取得。                                   | `TableName`, `FilterExpression`, `ExpressionAttributeValues`, `ProjectionExpression`, `Limit`            |
| **UpdateItem**       | 既存のアイテムを更新。                                                                 | `TableName`, `Key`, `UpdateExpression`, `ExpressionAttributeNames`, `ExpressionAttributeValues`, `ReturnValues` |
| **DeleteItem**       | 主キーを指定してアイテムを削除。                                                        | `TableName`, `Key`, `ConditionExpression`, `ReturnValues`                                                |
| **BatchWriteItem**   | 複数のアイテムを一括で書き込みまたは削除。                                               | `RequestItems`, `ReturnConsumedCapacity`                                                                 |
| **BatchGetItem**     | 複数のアイテムを一括で取得。                                                            | `RequestItems`, `ProjectionExpression`, `ConsistentRead`                                                 |
| **CreateTable**      | 新しいテーブルを作成。                                                                 | `TableName`, `AttributeDefinitions`, `KeySchema`, `ProvisionedThroughput`                                |

---

### **API活用のポイント**
- **条件式を活用**:
  - `ConditionExpression` を使用して、データ競合や誤った更新を防止。
- **効率的なデータ取得**:
  - `ProjectionExpression` を活用して必要な属性のみ取得し、コストを最適化。
- **バッチ操作**:
  - 一括操作（BatchWriteItem, BatchGetItem）を活用して効率化。

---
# その他機能

| 機能名               | 概要                                                                                       | 主なユースケース                                                                 |
|----------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|
| **TTL (Time to Live)** | アイテムに有効期限を設定し、自動で削除する機能。                                             | セッションデータ、キャッシュの自動クリア。                                       |
| **DAX**              | DynamoDB専用のインメモリキャッシュで読み取り操作を高速化。                                    | 高頻度の読み取り操作、ランキングや商品カタログの表示。                           |
| **DynamoDB Streams** | テーブルのデータ変更をリアルタイムでキャプチャ。                                               | データ変更ログの監視、レプリケーション、リアルタイム通知。                       |
| **Triggers**         | DynamoDB StreamsとLambdaを組み合わせてデータ変更イベントを処理。                               | リアルタイム通知、変更データの同期や集計処理。                                   |
| **グローバルテーブル** | マルチリージョン間でデータを同期し、低レイテンシと高可用性を提供。                              | グローバルアプリケーション、リージョン障害のフェイルオーバー対策。               |