Closed38

DynamoDBを使う際の基本的なところ整理したメモ

tamaco489tamaco489

テーブル作成時

1. 属性の定義
2. インデックス設計
3. 読み込み時
4. 書き込み時
5. バッチ処理
6. 削除保護
7. 容量とコスト
8. セキュリティ
9. 運用・モニタリング
tamaco489tamaco489

🧷 1-1. パーティションキー(必須)とソートキー(任意)の選定

概要
  • パーティションキー: 必須。物理的なパーティションを決める主キーの一部。
  • ソートキー: 任意。Partition Keyが同じアイテムを並べるための「主キーの2つ目の要素」。
  • DynamoDBにおける主キーは以下2種類存在。
    • シンプルな主キー: パーティションキーのみ。
    • 複合主キー: パーティションキーとソートキーを合わせたもの。
📦 パーティションキー 選定時の観点

✅ 特徴

  • 値が一意である必要はない。
  • ハッシュ関数で内部的に分散される。
観点 詳細
🔀 均等性 偏りのない値を選ぶ(ホットパーティションを避ける)
🧱 スケーラビリティ 同時アクセスが分散されるような設計に(特定の値にアクセス集中しないように)
🔐 一意性 or 分類 UserID, OrderID, DeviceID など、アイテムを識別 or グループ化できるもの
🧩 ソートキー選定時の観点

✅ 特徴

  • 同じパーティションキーを持つアイテムを並べる順序を決める。
  • これを使って「グループ内での絞り込み・ソート」ができる。
観点 詳細
📅 時系列処理 createdAt, timestampなどで、時系列ソートが可能
🔢 範囲クエリ対応 BETWEEN, BEGINS_WITH, > などのクエリに活用できる
📊 アクセスパターン対応 特定のユーザーのデータ履歴、カテゴリ別のデータ取得などに便利


UserID (Partition Key) + CreatedAt (Sort Key) → ユーザーごとのアクティビティログ

🔍 選定ミスによるリスクと影響
誤った設計 起きる問題
パーティションキーが固定値 スループットが1パーティションに集中(スロットル)
ソートキーが未定義 or 無意味 グループ内ソートや範囲クエリができない
アクセスパターンに合わないキー設計 結局全スキャン(Scan)になる
✅ 5. 実際のユースケース例
ユースケース Partition Key Sort Key
ユーザーの注文履歴 user_id order_timestamp
IoTデバイスのログ記録 device_id log_timestamp
カテゴリ別の商品リスト category_id product_id
🧠 補足Tips
  • ソートキーは複数の属性を連結して構成することも多い。(例:Type#Timestamp)
  • 後からパーティションキーは変更不可。(テーブルの作り直しが必要)
tamaco489tamaco489

🧷 1-2. データ型(String / Number / Binary / Boolean / Null/ List / Map / Set)の制限

🔤 1. String(文字列型)
項目 内容
📏 最大サイズ 最大 400KB(409600バイト)
🔡 エンコーディング UTF-8
🧮 制限の特徴 文字数制限ではなく「バイト数」で制限される
⚠️ 注意点 日本語等のマルチバイト文字は数内文字数でも制限に達しやすい

📝 例:

  • こんにちは → 約 15 バイト(1文字 = 3バイト)
  • Hello → 5 バイト(1文字 = 1バイト)
🔢 2. Number(数値型)
項目 内容
🔣 格納形式 10進数の文字列として保存(JSON形式)
🔟 桁数制限 最大 38桁(整数部+小数部)
🧩 型制限 使用する言語の型(int, float など)に依存
🎯 精度の注意 丸め誤差や精度低下に注意。必要なら decimal の使用を検討

📝 例:

  • 12345678901234567890123456789012345678 → ✅ OK(38桁)
  • 123456789012345678901234567890123456789 → ❌ NG(39桁)
📦 3. Binary(バイナリ型)
項目 内容
📏 最大サイズ 最大 400KB(409600バイト)
🔐 格納形式 Base64エンコードされたバイト列
🗂️ 推奨用途 ファイルID、画像ハッシュ、署名などの非構造データ

📝 注意:

  • 実データサイズではなく、Base64化後のバイト数が適用される
  • 大きなファイルは S3に保存し、DynamoDBにはメタ情報だけを持たせるのが一般的
✅ 4. Boolean(真偽値)
項目 内容
🔘 値の種類 true または false
🧩 型制限 単純な真偽値(ネスト構造でも使用可)
🛠️ 利用用途 フラグ情報(例: isActive, isDeleted)などに便利
⚠️ 注意点 言語側の変換ミスに注意(特に数値や文字列との混同)

📝 補足:

  • プライマリキーには使えないが、FilterExpression での絞り込みなどに便利
🫥 5. Null(ヌル値)
項目 内容
❎ 値の意味 値が存在しないことを明示的に表す
🧩 格納形式 明示的な null 型として格納(属性は存在する)
⚠️ 注意点 属性を削除したい場合は、null ではなく Remove 操作を行うべき
🧼 表現の違い 空文字("")やゼロ値(0)とは異なる

📝 補足:

  • Null値は attribute_existsattribute_type 関数で検出可能
📚 6. List(配列型)
項目 内容
🔢 型 任意のデータ型の順序付きリスト
🧩 特徴 異なる型の要素を混在させることが可能
🗂️ 用途 タグ一覧、ログの履歴、順序付きデータなど
⚠️ 制限 各要素を含めた合計で400KB制限に含まれる

📝 例:

"tags": ["news", "event", "sale"]
"history": [ { "type": "created", "at": "2024-01-01" }, { "type": "updated", "at": "2024-01-02" } ]
🧭 7. Map(オブジェクト型)
項目 内容
🗺️ 構造 キーと値のペアの集合(オブジェクト型)
🧩 特徴 値に任意の型を使用可能。入れ子もできる
⚠️ 制限 ネストが深くなると扱いづらくなる。全体が400KBに収まる必要あり
🛠️ 用途 ユーザープロファイル、構造的な設定情報などに適する

📝 例:

"profile": { "name": "Taro", "age": 29, "prefs": { "email": true, "push": false } }
🧺 8. Set(集合型)
項目 内容
📘 種類 String Set / Number Set / Binary Set の3種類
🚫 特徴 同じ値は1つのみ(重複を許容しない)
⚠️ 注意点 List と異なり順序は保持されない。異なる型は混在不可
🧼 用途 ユーザーの所有タグ、関連ID群、重複のない要素管理などに便利

📝 例:

"tagSet": ["news", "event", "sale"]
"intSet": [1, 2, 3]

※ Pythonなど一部のSDKでは set() をそのまま扱えるが、型の指定に注意。

⚙️ 共通制限事項
項目 内容
📦 1アイテムの最大サイズ 400KB(属性名・属性値・構造すべて含む)
🧮 属性数の上限 明示的な数の上限はなし(ただしサイズ制限に含まれる)
❌ サイズ超過時の動作 ValidationException(書き込み・更新失敗)
📚 ネスト制限 List / Map などの内部構造にも同様のサイズ制限がかかる
tamaco489tamaco489

🧷 1-3. 属性数の上限(400項目まで)

ℹ️ 詳細を見る
項目 内容
🔢 上限数 1アイテムあたり最大 400属性
⚠️ 制限対象 トップレベルの属性数が対象(ネスト内は含まれない)
📦 サイズ制限との関係 合計サイズ400KB以内であっても、属性数が401以上だとNG
🧩 対応の工夫 MapList でまとめることで属性数を抑制可能

📝 補足:

  • 以下のようなアイテムは NG(401個の属性)
    {
      "attr1": "val",
      "attr2": "val",
      ...
      "attr401": "val"
    }
    
  • 以下のように Map でまとめれば 属性数としては1つ
    {
      "meta": {
        "attr1": "val",
        "attr2": "val",
        ...
        "attr500": "val"
      }
    }
    

🛠️ 推奨戦略:

  • 検索が不要な補足情報は Map にまとめる。
  • 属性が動的に増えうる場合は、構造を Map に寄せて設計する。※但しデータ量の合計サイズ400KB以内におさめなければNG
tamaco489tamaco489

🧷 1-4. 属性名の予約語・長さ制限(255バイト以内)

ℹ️ 詳細を見る
項目 内容
🧭 属性名の最大長 最大 255バイト(文字数ではなくバイト数)
🌐 エンコーディング UTF-8(マルチバイト文字は注意)
🚫 予約語の存在 size, type, name などは予約語として使用不可(Expressionでエラーになる)
🛠️ 回避策 ExpressionAttributeNames を使用して属性名をエスケープ

📝 補足:

  • バイト制限なので、日本語などを使うと早めに制限に到達することがあります。
    例: 商品名(6バイト)など
  • 以下のように #name で予約語を回避し、マッピングすることで解決できます。
input := &dynamodb.UpdateItemInput{
    ExpressionAttributeNames: map[string]*string{
        "#name": aws.String("name"),
    },
    UpdateExpression: aws.String("SET #name = :val"),
}

📚 主な予約語(抜粋):

  • ABORT, ACTION, ADD, ALL, ALTER, ANALYZE
  • SIZE, NAME, TYPE, SET, SELECT, DELETE, UPDATE など

🔗 参考: DynamoDB Reserved Words

tamaco489tamaco489

🧷 2-1. グローバルセカンダリインデックス(GSI)の数と制限

ℹ️ 概要
  • グローバルセカンダリインデックス(GSI) は、DynamoDBテーブルのデータに対して異なるパーティションキーソートキーを使ってデータを検索・クエリできる仕組み。
  • これにより、データアクセスのパターンに合わせた効率的な検索が可能。
  • GSIは 最大20個 まで作成可能で、各インデックスにはパーティションキーとソートキーを指定が可能。


📝 例:

  • 商品テーブルに対して、「カテゴリ」ごとに商品を検索するためのGSIを作成し、カテゴリをパーティションキー、価格をソートキーに指定する。
  • ユーザーが購入したアイテムを注文日別に検索する場合、UserID をパーティションキー、OrderDate をソートキーに設定するGSIを作成する。
🧠 設計時に意識すべきこと
項目 内容
🔄 アクセスパターン アプリケーションがどのようなクエリを頻繁に実行するかを考慮して、最適なインデックス設計を行うことが重要。特定のクエリが多い場合、そのクエリを効率化するためのGSI設計する。
🔑 インデックスの選定 パーティションキーソートキー の組み合わせは、検索したいデータに基づいて慎重に選定する必要がある。最も効率的なクエリパターンに合わせたキー設計をすることで、パフォーマンスが最適化される。
💰 コスト GSIを追加すると、それに伴う 読み書きキャパシティ単位 が消費される。インデックスが多くなるとコストも増加するため、予算に合わせた設計が求められる。
🛠️ 更新時の考慮 データ更新時に、関連するGSIが再作成されるため、頻繁なデータ更新がインデックスのパフォーマンスに影響を与えることがある。更新頻度が高いデータに対しては、GSI設計に注意が必要。

📝 例:

  • 定期的にデータを更新するシステムでは、GSIの数や設計を考慮して、更新処理がパフォーマンスに与える影響を最小限に抑える方法を検討する。
⚠️ 注意事項
項目 内容
⚠️ インデックス数の制限 1テーブルにつき、最大20個のGSIまでしか作成できない。GSIを追加することで読み書き性能を向上できるが、インデックス数を増やし過ぎると管理が複雑になり、パフォーマンスに影響を及ぼす可能性がある。
⚠️ 更新の遅延 データ更新時、関連するインデックスも再作成されるため、更新が多いテーブルではインデックス更新が遅延する場合がある。特に GSIが多いテーブル では注意が必要。
🚨 順序変更不可 GSIのパーティションキーやソートキーは作成時に決定され、その後変更することはできない。設計時に十分な注意が必要です。インデックスの設計ミスを避けるため、最初にアクセスパターンを分析しておく必要がある。

📝 例:

  • ユーザーの「注文履歴」をインデックスで検索する際、UserIDOrderDate をキーとして設定する場合、最初の設計でどのようにインデックスを使うかを考え、後から変更できない点を理解しておくことが重要。
📦 ユースケース例
シナリオ 解説
🛒 商品検索 商品テーブルに対して「カテゴリ別」「価格帯別」などで頻繁に検索したい場合、Category をパーティションキー、Price をソートキーとしたGSIを作成することで、高速な検索が可能。
📅 イベントフィルタリング イベント情報をテーブルに保持していて、EventDate をソートキー、Location をパーティションキーにしたGSIを作成することで、特定の日時や場所でイベントを高速に検索できる。
💼 ユーザーの注文履歴 注文テーブルに対して、「ユーザーID」をパーティションキー、「注文日」をソートキーにしたGSIを作成することで、ユーザーごとの注文履歴を簡単に取得できる。

📝 例:

  • 商品情報の管理において、GSIを使ってカテゴリごとの売上価格帯別の人気商品などを高速に抽出する場合がある。
  • イベントシステムで、特定の日時や地域に基づいて検索が行われる場合、GSIを使うことで、検索効率があがる。
💡 補足Tips
項目 内容
📊 投影の使い分け ALL はテーブルの全ての属性をインデックスに含めますが、必要な属性だけを選択的にインデックスに含めることで、より効率的な運用が可能。 INCLUDE を使用して最小限の属性のみをインデックスに投影することで、キャパシティ単位の消費を抑えることができる。
🔄 頻繁な変更 頻繁に更新が行われる属性については、GSIを作成する際にデータの整合性やパフォーマンスに与える影響を慎重に評価することが重要。例えば、更新頻度が高い属性に対してGSIを利用する際は、性能に与える影響を監視する必要がある。
🧠 スキーマの柔軟性 GSI設計時にアクセスパターンの変化に対応できる柔軟なスキーマを設計しておくことで、後々の変更に対応しやすくなる。例えば、将来的に異なるクエリに対応するために新たなインデックスを追加しやすくするために、設計時に予測できるアクセスパターンを考慮しておく。
📈 パフォーマンスの監視 GSIの使用により、読み書きキャパシティの消費が増加することがある。CloudWatch でインデックスのパフォーマンスを監視し、負荷が過度にかかっていないかの確認する機構を設けることを推奨されている。定期的なモニタリングによって、パフォーマンスの問題を早期に発見する。

📝 例:

  • 投影の選択: インデックスに含める属性を慎重に選ぶことで、キャパシティ単位を節約し、コストを最小限に抑えられる。
  • パフォーマンス監視: GSIの利用状況を監視し、アクセスパターンに変化があればインデックスを再設計することも重要。
🔗 参考リンク
tamaco489tamaco489

🧷 2-2. ローカルセカンダリインデックス(LSI)の使用可否(作成時のみ追加可能)

ℹ️ 概要
  • ローカルセカンダリインデックス(LSI) は、同じパーティションキーを持ちながら異なるソートキーでデータを検索できるインデックス。
  • GSIとは異なり、LSIはテーブル作成時にしか定義できない。
  • 最大で5個まで作成できる。

📝 例:

  • ユーザーIDが同じアイテムを「作成日」「ステータス」など、異なるソート条件で取得したい場合に使う。
🧠 設計時に意識すべきこと
項目 内容
🔑 パーティションキーの一致 LSIは元テーブルと同じパーティションキーを共有する必要がある。
📏 制限 LSIは最大5個までしか作れない。作成後に追加・削除・変更はできない。
🧱 データ構造の整理 複数のクエリ軸を持つデータ構造に対して、1パーティション内の整列クエリを効率化できる。
🧮 キャパシティと一体 テーブルとLSIは同じ読み書きキャパシティを共有する(プロビジョンド時)。

📝 例:

  • 注文履歴を「注文日」や「注文ステータス」別に取得したいが、すべて同一ユーザー内で並び替えしたいときに有効。
⚠️ 注意事項
項目 内容
🚫 後から追加不可 LSIはテーブル作成時にのみ定義可能。作成後に追加することはできない。
⚖️ 同一パーティションキー制限 元のテーブルと同じパーティションキーしか使えないため、柔軟性は低い。
💡 ストレージ影響あり LSIを利用すると、同一パーティション内に保持するアイテムが増え、1パーティションあたりのサイズ(最大10GB)に注意が必要。

📝 例:

  • 将来的にアクセスパターンが増える可能性がある場合、柔軟な対応ができるGSIの方が適している。

🧱 イメージ
たとえば、下記のようなテーブル構成があるとする。

user_id (PK) created_at (SK) message
user1 2023-01-01 "Hello"
user1 2023-01-02 "How are you?"
user2 2023-01-01 "Hi there"

このとき、created_at をソートキーにしたLSIは以下のように置き換え可能:

  • LSI1: ソートキーを priority にする → user_id = 'user1' の中で priority による並び替えが可能
  • でも user_id を created_by に変えることはできない(パーティションキーの変更は不可)
📦 ユースケース例
シナリオ 解説
📂 同一パーティション内での別ソート ユーザーIDをパーティションキーにして、「作成日時」「更新日時」「優先度」などで異なるソートクエリが必要な場合。
🧾 履歴やログ管理 一定の範囲内(例: ユーザー単位)でデータを時系列に並べて検索したいときに有効。

📝 例:

  • ユーザーが送信したメッセージを「送信時間」「既読フラグ」別でソート表示したいときにLSIを活用できる。
🔄 柔軟性の違い(LSI vs GSI)
特性 LSI GSI
パーティションキー 元テーブルと同じ 自由に設定できる
ソートキー 別のキーに変えられる 別のキーに変えられる
柔軟性 🔽 低い 🔼 高い
追加・変更 ❌ テーブル作成時のみ ✅ いつでも追加可能

🎯 point:
LSIは「同じ主軸(パーティションキー)に対して、異なる並び替え条件が必要なとき」に適していて、
「別の観点からデータを取得したい(例: 投稿者・カテゴリ・ステータスなど別のキーで取り出したい)」なら、LSIではなく GSI(グローバルセカンダリインデックス) を使う必要がある。

💡 補足Tips
項目 内容
🧰 LSIとGSIの使い分け ソート条件を切り替えたいだけならLSI。パーティションキーごと変えたいならGSI。
🧠 設計段階で決め打ち LSIは後から追加できないため、テーブル設計段階で将来のアクセスパターンを見越して定義しておく必要がある。
📊 頻繁な更新に注意 LSIは更新ごとに反映されるため、更新が多いユースケースではストレージ効率に注意。
📉 不要なら使わない 無理にLSIを使うとパフォーマンスに悪影響を与える可能性がある。アクセスパターンに合致しないなら作らない判断も必要。

📝 例:

  • 「とりあえずLSIを付けておこう」は避けたほうがよい。必要なクエリが見えているときだけ利用する。
🔗 参考リンク
tamaco489tamaco489

📈 2-3. インデックス更新のコスト

ℹ️ 概要
  • DynamoDBでは、インデックス(GSI/LSI)も自動的に更新される
  • これはテーブルの更新(PutItem / UpdateItem / DeleteItem)に応じて、インデックス側でも該当アイテムの反映処理が走る。
  • インデックスが多くなるほど、書き込みコストが増加する要因になる。

📝 例:

  • GSIが3つあるテーブルに対して1件のPutItemをすると、GSIにも最大3回の書き込みが発生する。
🧠 設計時に意識すべきこと
項目 内容
🧮 書き込みコストが乗る インデックスの数だけ、書き込みの内部処理が追加される。
⚡️ 書き込み遅延の可能性 書き込み時にインデックス更新がボトルネックになる場合がある。
💰 コストの見積もりに注意 インデックスがあると、1回の書き込みで複数の「WCUs(Write Capacity Units)」を消費する。
📊 書き込み頻度が多い場合は慎重に 更新が頻繁なテーブルでインデックスを多く持つと、パフォーマンスとコスト両面に影響する。

📝 例:

  • 通知ログのように1日に数千件追加されるデータに複数のGSIを張ると、予想外の課金が発生する可能性がある。
⚠️ 注意事項
項目 内容
🔁 UpdateItemでも反映される GSIやLSIのキー項目に変更があった場合、インデックス側でも一度削除→再登録される動作がある。
💣 書き込みスパイク時に注意 一括更新処理やバッチが走ったタイミングで一気にインデックス更新が走り、スロットリングされることがある。
🧾 請求にインデックス書き込み分も含まれる DynamoDBのコストは「テーブル + インデックスの合計WCU/RCU」で計算される。

📝 例:

  • 特定条件でしか使わないGSIを常に更新対象に含めてしまうと、使われないのにコストだけかかる。
💡 補足Tips
項目 内容
🧪 アクセスパターンに基づく定義 利用頻度の低いインデックスは定義しない方がいい。使われる見込みのあるものだけ作る。
⚖️ 読み取り vs 書き込みのバランス GSIは読み取りを効率化するが、書き込みコストが増える。トレードオフを意識して設計する。
🚧 スロットリング対策 バッチ更新などを行うときは、指数バックオフやリトライ制御を組み込むと安全。

📝 例:

  • 「あとから検索で使うかも」という理由だけでインデックスを追加するのは危険。アクセスパターンが明確に存在する場合のみ定義する。
tamaco489tamaco489

🕓 2-4. インデックスの整合性(Eventually Consistent: 結果整合性)

ℹ️ 概要
  • DynamoDBの グローバルセカンダリインデックス(GSI) は「 結果整合性(Eventually Consistent)」を持つ。
  • これは、インデックスと元データの間に一時的なズレが生じる可能性があるという意味。
  • 一方、LSI(ローカルセカンダリインデックス)は強い整合性(Strong Consistency)

📝 例:

  • データを更新してすぐにGSIで検索しても、古い値が返ることがある。
🧠 設計時に意識すべきこと
項目 内容
⏳ 一時的なラグが許容できるか GSIは更新直後、検索結果に反映されるまで時間差がある。
🔍 最新の状態に依存しない検索 検索要件が「厳密な最新状態」を求めるものではないか見極める。
⚠️ 一貫性の前提が崩れる場面 強整合性を前提にして設計すると、GSI利用時に意図しない挙動になる可能性がある。
🔄 ポーリングやリトライの活用 最終的に一致するなら、定期再取得やリトライで吸収できる設計が必要。

📝 例:

  • 通知一覧やログ閲覧など、「即時性」が求められない画面では問題にならない。
⚠️ 注意事項
項目 内容
📉 「更新→即検索」でズレる可能性 書き込み直後のGSI検索では、更新がまだ反映されていないケースがある。
🔁 一貫性のチェックが必要 GSIを利用した取得後、必要に応じて元データの再取得で整合性を担保するケースもある。
💡 アプリ側で工夫が必要 フロントやAPI側でリトライ、差分チェック、キャッシュなどで対応する設計が求められる。

📝 例:

  • フィード投稿を更新した後に「最新の投稿一覧」でGSIを使うと、反映されないまま数秒ズレることがある。
💡 補足Tips
項目 内容
✅ LSIは強整合性 ソート条件だけ変えたい用途ならLSIの方が整合性が高い。
🧠 GSIは最終的に反映される設計にする GSIで最新状態を期待しない前提で設計するとトラブルが減る。
🔁 再フェッチ戦略の実装 GSIで取得した結果をもとに、主キーで再取得して整合性を補完する方法もある。
🧪 整合性が重要な場面では検証が必要 テスト環境でGSI更新タイミングのズレを確認し、仕様許容できるか判断する。

📝 例:

  • 「支払いステータスが paid になった直後の検索」で反映されない場合、GSI結果を信用せず主キーで再取得して確認する。
tamaco489tamaco489

📊 3-1. キャパシティモード(オンデマンド vs プロビジョンド)

ℹ️ 概要
  • DynamoDBの読み書き性能(スループット)は、「キャパシティモード」 によって制御される。
  • 選べるモードは以下の2種類:
    • オンデマンドモード:アクセス量に応じて自動スケーリング。事前設定不要。
    • プロビジョンドモード:読み書き性能(RCU/WCU)を固定で設定。手動スケーリング。

📝 どちらもユースケースによって使い分ける必要がある。

🧠 設計時に意識すべきこと
項目 内容
📈 アクセスパターンが安定しているか 安定していればプロビジョンド、読めないならオンデマンドが向いている。
💸 コスト構造が異なる オンデマンドは使用量ベースの従量課金、プロビジョンドは常時課金。
🧠 スループットの予測精度が鍵 見積もり精度が高ければプロビジョンドで節約できる。誤差が大きいならオンデマンドが安心。
⏱️ レイテンシ・スロットリング要件 プロビジョンドで性能不足だと即スロットリング。オンデマンドはバーストに強いが遅延リスクあり。

📝 例:

  • ECサイトのようにセール時にスパイクするアクセスがあるならオンデマンドが向いている。
⚠️ 注意事項
項目 内容
🔄 モード変更は制限あり 一度に変更できるのは1日に1回まで。すぐ戻せない。
💰 高頻度アクセスだとオンデマンドが割高 リクエスト数が多いアプリではオンデマンドのコストが爆増する可能性あり。
📊 使用量の監視が重要 プロビジョンドは使い切るとスロットリングが発生する。CloudWatchアラームを使って監視する必要あり。

📝 例:

  • 日中アクセスが集中するアプリでプロビジョンドを使っていてスロットリングが頻発していたケースでは、オンデマンドに切り替えて解消した例もある。
💡 補足Tips
項目 内容
🔄 オンデマンド → プロビジョンドの切り替え可能 利用が安定してきたらプロビジョンドに変更してコスト削減できる。
📉 プロビジョンドでもAuto Scalingが使える 自動スケーリング設定すればアクセス量の上下に柔軟に対応できる。
💡 スロットリング対策としてバッファ設定 プロビジョンドのWCU/RCUは実際の使用量より少し多めに設定しておくと安全。
🧪 最初はオンデマンド運用から始める トラフィックが不明な段階ではオンデマンドで動かし、実データを元に移行判断するのが定石。

📝 例:

  • 検証環境やβリリース直後はオンデマンド → 本番安定後にプロビジョンドに移行、という流れが多い。
tamaco489tamaco489

🚦 3-2. 読み込みスループットの制限

ℹ️ 概要
  • DynamoDB には、1秒あたりに許容される読み込み容量(RCU) の制限がある。
  • 読み込みは以下の2種類の整合性によって消費 RCU が変わる:
    • 強整合(Strongly Consistent Read):1件 = 1RCU(4KBまで)
    • 結果整合性(Eventually Consistent Read):1件 = 0.5RCU(4KBまで)

📝 読み込み対象のサイズが 4KB を超えると、RCU の消費も倍増するので注意。

🧠 設計時に意識すべきこと
項目 内容
📐 アイテムサイズの見積もり 読み込み1件あたりのサイズが 4KB を超えると、消費RCUが増える。
🧮 1秒あたりの読取数 × アイテムサイズ スループット見積もりには「件数 × サイズ」をベースにRCUを計算する必要がある。
🔁 読み込み頻度の把握 高頻度アクセスされるアイテムにはキャッシュなどを併用してRCU消費を減らす。
⚖️ 強整合 or 最終整合の使い分け 最新状態が不要であれば最終的整合を選ぶことでコスト半分に抑えられる。

📝 例:

  • 1KB のアイテムを1秒間に100回読み込む → 強整合で100RCU、最終整合なら50RCU
⚠️ 注意事項
項目 内容
🚫 スループット超過時のスロットリング 設定以上のRCUを超える読み込みが発生すると、ProvisionedThroughputExceededException が返る。
⚠️ バースト利用にも限度がある DynamoDB には一時的な「バーストキャパシティ」があるが、常用には向かない。
📊 スループット消費の可視化が重要 CloudWatch で RCU 使用率を常に監視すること。特にピークタイム。

📝 例:

  • ユーザプロフィールを大量に取得する API で、突発的にスロットリングが多発した → 読み込み頻度を間引いたりバッチ化して対応
💡 補足Tips
項目 内容
🔁 バッチ取得で効率化 BatchGetItem を使うと、複数キーの読み込みが 1リクエストで済み、全体的な RCU 消費を抑えやすい。
🧊 キャッシュ戦略を併用する 頻出の読み込み結果は Redis や AppCache に乗せて DynamoDB の負荷を減らす。
📉 読み込み量を減らす設計 1アイテム内に不要な属性が多い場合、サイズを削って RCU 消費を軽減する設計も有効。
🧪 パフォーマンステストの実施 想定アクセスが多いテーブルは本番前に読み込み試験をして RCUs を確認するのが定石。

📝 例:

  • 一覧表示用に GSI 経由で大量データを読み込むケースで、必要な属性だけを含めるようインデックス設計を見直したことで、RCUコストが半減した。
tamaco489tamaco489

📘 3-3. 強い整合性 vs 結果整合性(Strongly Consistent Read vs Eventually Consistent Read)

ℹ️ 概要
  • DynamoDB の読み込みには 2 種類の整合性モードがある:
    • 強い整合性(Strongly Consistent Read):最新の書き込み結果が必ず反映された状態を返す。
    • 結果整合性(Eventually Consistent Read):読み込み時点での最新状態ではない可能性があるが、最終的には整合性がとれる。

📝 デフォルトは「結果整合性」。API で明示的に指定しない限り強整合にはならない。

🧠 設計時に意識すべきこと
項目 内容
📋 一貫性の要否を明確にする 常に最新の情報が必要かどうかを判断するのが第一ステップ。
💸 コストへの影響 強整合は 1RCU/4KB、結果整合は 0.5RCU/4KB。読み込みコストが2倍違う。
🕓 レイテンシと可用性のトレードオフ 結果整合の方が高速で可用性も高い。強整合は遅くなりがち。
📊 集約処理・統計表示なら結果整合でも十分 完全にリアルタイムでなくても問題ないUI/機能は結果整合で十分。

📝 例:

  • 在庫のように「正確な値」が常に必要なケース → 強整合
  • 投稿の「いいね数」のような多少のズレが許容される表示 → 結果整合
⚠️ 注意事項
項目 内容
🔁 書き込み直後の読み込みは注意 結果整合だと直前の PUT/UPDATE が読み取れない可能性がある。
❗ GSI では強整合はサポートされていない GSI経由の読み取りは必ず「結果整合」になる。
📉 一時的なズレによる表示バグに注意 例:書き込んだ直後に画面リロードしてもデータが見えない。強整合に切り替える or リトライ戦略を考慮する必要あり。

📝 例:

  • フィード投稿後に画面に反映されない → 強整合で読み直す or 再読込ボタンで補う UI が必要
💡 補足Tips
項目 内容
🧪 クライアント側のキャッシュとの連携を意識する 結果整合 + クライアントキャッシュで UX を崩さず高速化できる。
🧠 書き込み後に強整合読み込みするAPIを分離 パフォーマンス最適化のため、整合性が必要な読み込みだけ分離して強整合指定するのが定石。
🧩 GSI読み込みには強整合が使えない UIやAPI設計時に「GSIだから一貫性ないかも」という前提を組み込む必要がある。
🔄 最終的整合を前提に設計することも多い DynamoDBでは「Eventually Consistent Read を前提にする」のがパフォーマンス観点では基本方針。

📝 例:

  • 投稿の読み込みは結果整合で一覧表示 → 「自分の投稿だけ強整合で再取得」などのハイブリッド構成も可能
tamaco489tamaco489

🔍 3-4. プロジェクション(読み取り対象属性の絞り込み)

ℹ️ 概要
  • プロジェクションとは、DynamoDBで「取得対象の属性(カラム)」を明示的に指定すること。
  • 特にGSI / LSI の作成時には、どの属性をインデックスに含めるか=プロジェクションの設計が必須。

📌 読み込み対象を絞ることで、RCU消費を削減し、パフォーマンスも改善できる

🧠 設計時に意識すべきこと
項目 内容
🎯 必要最小限の属性だけ取得する 全属性を読み込むのは非効率。UIやAPIで使う項目だけを取得対象にする。
🧩 GSI/LSI設計でプロジェクションを最適化 KEYS_ONLY / INCLUDE / ALL の3種から選ぶ。用途に応じて選定する必要がある。
📉 不要属性の読み込みはコストとレイテンシ増大 特にサイズの大きな属性は、RCU消費に直結する。読み込みから除外することで効果大。
🔄 スキーマ変更時にプロジェクションも見直す UI要件の変化に合わせてプロジェクション属性も調整する。

📝 例:

  • 投稿一覧表示に titlecreated_at だけ使う → プロジェクションを INCLUDE にして他の属性を省略
⚠️ 注意事項
項目 内容
⚠️ ALL プロジェクションはコストが重い インデックス作成時にすべての属性を含めると、書き込み時も更新負荷がかかる。
❌ GSIの作成後にプロジェクションは変更できない 一度インデックスを作ったら再定義できないため、慎重に設計する必要がある。
📦 サイズの大きな属性に注意 Base64画像や大きな文字列などはプロジェクション対象にしないほうが無難。

📝 例:

  • GSIで ALL を使っていたら、更新時にGSI書き込みエラーが頻発 → INCLUDE にして軽量化した
💡 補足Tips
項目 内容
📌 KEYS_ONLY プロジェクションで最小構成 パーティションキーとソートキーのみ保持する。軽量かつ高速。
🔍 INCLUDE で必要な属性だけ追加 KEYS_ONLY に加えて、使いたい数個の属性を明示的に指定できる。
🧪 プロジェクション範囲の決定はユースケース次第 「一覧で使うか」「詳細表示で使うか」を切り分けて設計すると無駄がない。
📊 CloudWatchでRCU使用量を確認 読み込みが重いと感じたら、プロジェクション対象が多すぎないかをチェック。

📝 例:

  • 一覧では titlestatus だけ、詳細では body を取得 → 一覧用GSIは INCLUDE、詳細は本体から GetItem
tamaco489tamaco489

📑 3-5. トランザクションの利用有無(TransactWriteItems / TransactGetItems)

ℹ️ 概要
  • DynamoDBはACIDトランザクションをサポートしており、TransactWriteItemsTransactGetItems で最大25件までの操作をまとめて実行できる。
  • 書き込み系(Put/Update/Delete)と読み込み系(Get)でAPIが分かれている。

📝 単一操作で済まない一貫性の必要な処理(例:ポイント送信と残高減算)に便利。

🧠 設計時に意識すべきこと
項目 内容
🔐 アトミック性が本当に必要か見極める トランザクションを使うとコストが上がるため、必須な場面に限定する。
🪙 書き込み25件までの制限を意識する 上限を超えるとトランザクションがエラーになる。バッチ処理には不向き。
🚫 条件式を駆使してデータ整合を保つ設計もあり ConditionExpression の活用で代替できるケースもある。
💥 トランザクション失敗時の全ロールバックに注意 一部だけ成功することはない。失敗時のリトライ設計も必要。

📝 例:

  • ユーザーAからBへのポイント移動 → 残高の減算と加算を1トランザクションにまとめる
⚠️ 注意事項
項目 内容
🧱 容易にリミットを超えやすい 25件制限に加え、アイテムサイズや合計容量にも制限がある。
⏳ レイテンシ増加 通常のPutItem/UpdateItemよりも実行に時間がかかる。
🔁 リトライ可能性の考慮が必要 ネットワーク・内部失敗などで自動再試行されるケースあり。冪等性設計が重要。
❗ GSI/LSIの更新も巻き込まれる トランザクション内でGSI対象の属性を変更すると、整合性確保に追加コストがかかる。

📝 例:

  • 同時送金トランザクションがリトライによって二重処理されないよう、トークンなどで冪等化
💡 補足Tips
項目 内容
🧩 条件付き書き込みと使い分け 一意制約や単一項目の整合性だけなら ConditionExpression で代替可能。
🛠️ AWS SDK の冪等性トークンを活用 ClientRequestToken を指定するとトランザクションの再試行安全性が高まる。
🔍 書き込みと読み込みのトランザクションを分ける TransactGetItems は読み取り専用。不要な書き込みを避けて高速化できる。
📊 CloudWatch Metrics で監視 TransactionConflict, ThrottledRequests などをモニタリング対象に入れると◎

📝 例:

  • アイテム購入時に「在庫減少 + 購入履歴保存 + ポイント加算」を一括で処理
tamaco489tamaco489

📝 4-1. 書き込み単位のサイズ制限(最大400KB/アイテム)

ℹ️ 概要
  • DynamoDBでは、1アイテムあたりの書き込みサイズ上限が 400KB(= 409,600バイト) に制限されている。
  • これは「アイテム全体のJSONバイト数」を対象とするため、属性数や各属性のデータ量すべてを含む。

📌 データ構造や属性サイズの工夫が求められる設計制限。

🧠 設計時に意識すべきこと
項目 内容
📦 属性サイズを計測しながら設計 文字列・リスト・Map構造などが膨らむとすぐに上限に達する。
🔄 ユースケースに応じてデータ分割を検討 400KBを超えるようなアイテムは別テーブルに分割、またはS3へオフロードする。
🧩 非構造データは極力外出し 画像Base64・HTML・ログなどはS3保存+パス参照が基本戦略。
🛠️ 書き込み前にバイトサイズを測定する処理を組む SDKや len(json.Marshal(...)) で実測して制限回避が可能。

📝 例:

  • 投稿本文が長文+コメントリスト+タグリスト → サイズ超過でPutItemが失敗
⚠️ 注意事項
項目 内容
🚫 サイズ超過時は自動分割されない 400KBを1バイトでも超えると即座にValidationExceptionでエラーになる。
❌ 属性数制限(最大400個)と合わせて注意 属性数とサイズの両面からバランスを取る必要がある。
📚 GSI/LSIのプロジェクションも影響あり GSI側に属性を含めると、その分の書き込みサイズにもカウントされる。

📝 例:

  • 本文+画像URLリスト+カテゴリ+コメントで400KBギリギリ → 画像URLだけ外部ストレージへ移動
💡 補足Tips
項目 内容
📊 CloudWatch の ReturnedItemSize メトリクスで監視可能 サイズ増加の傾向を追える。
🧪 開発中は実データを使ってサイズチェック 想定と実データで大きな乖離が出ることが多い。
🧵 Map・List構造はメタデータ肥大化しがち フラット構造への変換や、サマリ情報のみ保持する設計も有効。
📁 S3とのハイブリッド構成が現実的 サイズの大きなデータ(HTML本文やバイナリ)はS3に逃がしてリンク参照にする。

📝 例:

  • ユーザー投稿データを「本体(タイトル+本文要約)」と「S3保存された詳細本文」で分離
tamaco489tamaco489

🚀 4-2. 書き込みスループットの制限

ℹ️ 概要
  • DynamoDBでは、テーブルの書き込み処理数にスループット制限が存在する。
  • キャパシティモード(オンデマンド or プロビジョンド)に応じて、制限の動き方が異なる。
  • 書き込み過多になると ProvisionedThroughputExceededException やスロットリング(遅延・リトライ)が発生する。

📌 「急激なトラフィック増加」や「バッチ処理」に特に注意。

🧠 設計時に意識すべきこと
項目 内容
🎛 キャパシティモードを適切に選ぶ 安定したスループット要求があるなら「プロビジョンド」、変動が大きいなら「オンデマンド」推奨。
🧮 書き込み容量(WCU)を事前計算 書き込みアイテム数 × アイテムサイズで必要スループットを計算して見積もる。
🚥 リクエストをスロットリングしないよう分散設計 特定パーティションキーに偏らないよう、キー設計・スケジューリングを工夫する。
⏳ リトライ時のバックオフ戦略を必ず入れる SDKの自動リトライに加え、指数バックオフを組み込むことで過負荷を緩和できる。

📝 例:

  • バッチ処理で1秒間に1万件書き込み → WCU不足で大量に失敗
⚠️ 注意事項
項目 内容
🔄 同一パーティションキーに集中的に書き込むとアウト DynamoDBは内部的に各パーティションに均等に分散するため、片寄ると詰まる。
⚠️ バーストキャパシティにも限界がある 一時的な超過は許容されるが、継続するとスロットリングされる。
🧱 書き込みサイズが大きいと消費WCUも増加 1KBあたり1WCUとして計算されるため、サイズが肥大するとすぐ上限に達する。
🚫 リトライだけで解決しないこともある スループット不足の根本対処が必要。単なるリトライで乗り切ろうとすると逆効果に。

📝 例:

  • 投稿APIが1KBのJSONを1秒に300回呼ばれる → 300WCU消費、WCU設定不足で失敗連発
💡 補足Tips
項目 内容
📊 CloudWatchメトリクスでスループット状況を可視化 ConsumedWriteCapacityUnits, ThrottledRequests を常時監視対象に。
🧩 ランダムなパーティションキー生成で負荷分散 曜日・UUID・シャードIDなどをキーに混ぜることで書き込みを分散できる。
🛠️ DynamoDB Accelerator (DAX) は読み込み特化 書き込みスループットには関係ないので注意。
⚙️ Auto Scaling 設定のチューニングも重要 プロビジョンドモードではスケーリングのしきい値とタイミングを調整すべき。

📝 例:

  • アクセスが特定時間に集中するEC系システム → Auto Scalingを夜間に備えて前倒し調整
tamaco489tamaco489

🧑‍💻 4-3. バルク書き込み(BatchWriteItem)の制約(最大25件/16MB)

ℹ️ 概要
  • DynamoDBのBatchWriteItem操作では、1回のリクエストで最大25件までのアイテムを一括書き込みすることができる。
  • 書き込みアイテムの合計サイズは、最大16MBまでとなっており、それを超えるとエラーとなる。

📌 バッチ処理の効率化には最適だが、サイズ制限と件数制限を常に意識する必要がある。

🧠 設計時に意識すべきこと
項目 内容
📏 件数制限(最大25件)を意識 アイテム数が25件を超えると、分割して複数回のリクエストが必要になる。
🧮 アイテムサイズ制限(最大16MB) アイテムのデータ量が大きい場合、1回で書き込める件数が減少する可能性がある。
🛠️ 大きなアイテムは分割する 1件あたり16MBを超える場合は、アイテムを分割する設計が必須。
📝 スロットリングに注意 高頻度でバッチ処理を行う場合、スロットリングが発生するリスクもある。

📝 例:

  • 1回のリクエストで25件のデータがそれぞれ1MBの場合 → 合計で25MBとなりエラーが発生。
⚠️ 注意事項
項目 内容
🚫 アイテムの合計サイズが16MBを超えるとエラー 1回で送信できるデータの総量は16MBに制限されている。
⚡ スロットリングされる可能性 大量のバッチ書き込みにより、スループット制限を超えてスロットリングされる場合がある。
🧱 25件を超える場合は分割して送信 25件以上のアイテムを一度に書き込むことはできない。複数回に分ける必要がある。
🔁 書き込み結果に注意 バッチ書き込みの各アイテムに対して、成功・失敗の情報をチェックし、失敗時はリトライを行う。

📝 例:

  • 100件のアイテムをまとめてバッチ書き込み → 4回に分けてリクエストを行う(1回あたり25件まで)。
💡 補足Tips
項目 内容
🔄 BatchWriteItemのレスポンスを活用 UnprocessedItemsに失敗したアイテムが含まれているため、リトライ処理を実装することが重要。
⏳ 大量データの書き込みは慎重に 1件あたりサイズが大きいアイテム(例:画像や動画)を一括書き込む場合、効率的に処理する工夫が必要。
🧩 結果確認とエラーハンドリングが必須 書き込み成功と失敗の結果を必ず確認し、失敗アイテムのリトライや再処理を行う。
📊 CloudWatchメトリクスでモニタリング ThrottledRequestsConsumedWriteCapacityUnitsを監視することで、過剰書き込みの防止ができる。

📝 例:

  • バッチ書き込み時にエラーが発生 → UnprocessedItems を利用して未処理のアイテムを再送信。
🔗 参考リンク
tamaco489tamaco489

🧑‍💻 4-4. 条件付き書き込みの活用(ConditionExpression)

ℹ️ 概要
  • DynamoDBでは、ConditionExpressionを使用して条件付き書き込みを行うことができる。
  • 条件を満たす場合にのみ、データの書き込みが実行される。これにより、競合状態を防いだり、書き込み前にデータの整合性をチェックすることができる。

📌 条件付き書き込みを活用することで、データの一貫性を確保し、無駄な書き込みを防ぐことができる。

🧠 設計時に意識すべきこと
項目 内容
🔑 属性値を条件に設定 ConditionExpressionに属性名と値を指定し、指定した条件が満たされる場合にのみ書き込みが実行される。
⚠️ 競合状態の回避 複数のクライアントが同じデータを更新しないように、条件を使って競合を回避する。
📊 スループットに注意 複雑な条件式を使用すると、条件評価に時間がかかり、パフォーマンスに影響が出る場合がある。
💡 attribute_not_existsattribute_existsの活用 条件式で、特定の属性が存在しない場合や存在する場合にのみ書き込むことができる。

📝 例:

  • アイテムのstatus属性がactiveの時にのみ、statusinactiveに変更する。
  • attribute_not_exists(id)を使用して、まだ存在しないIDを持つアイテムのみ追加する。
⚠️ 注意事項
項目 内容
🚫 書き込みの失敗 条件が満たされない場合、書き込みは失敗し、エラーが発生する。
⏳ スループット消費 複雑なConditionExpressionの評価がスループットに影響を与える場合がある。
🔄 リトライ処理 書き込みが失敗した場合、適切なリトライ処理を実装することが推奨される。

📝 例:

  • status = :newStatusの条件を設定しても、既存の値が異なる場合、書き込みが行われない。
💡 補足Tips
項目 内容
🔑 ConditionExpressionの使い方 ConditionExpressionでは、attribute_existsattribute_not_existsを使用して、特定の属性が存在するかどうかを条件にすることができる。
📈 シンプルな条件式を心がける 複雑な条件式がパフォーマンスに与える影響を最小限にするため、可能な限りシンプルに保つことが推奨される。
📝 他の条件式との組み合わせ ANDORBETWEENなどを使って複数の条件を組み合わせて書き込みを制限することができる。
📊 パフォーマンス監視 ConsumedWriteCapacityUnitsThrottledRequestsを監視し、条件付き書き込みのパフォーマンスへの影響をチェックする。

📝 例:

  • アイテムのstatusactiveの場合のみ、statusinactiveに更新する。
  • attribute_not_exists(id)を使って、まだ存在しないIDを持つアイテムのみ挿入する。
🔗 参考リンク
tamaco489tamaco489

🧑‍💻 4-5. TTL(Time To Live)設定

ℹ️ 概要
項目 内容
🕰️ TTLとは 指定した時刻を過ぎたアイテムを自動削除するDynamoDBの機能。
🔄 自動削除の仕組み アイテムの特定属性(UNIXタイムスタンプ)を使って、非同期的に削除される。
🧹 主な用途 セッション、ログ、キャッシュデータなど、一定期間後に不要となるデータの管理。
🧠 設計時に意識すべきこと
項目 内容
📆 TTLはUNIX秒で指定 TTL属性には秒単位のUNIXタイムスタンプを設定する必要がある。
⏳ 削除のタイミングは非同期 時刻を過ぎてもすぐには削除されず、通常は数分〜数時間、最大で48時間程度のラグがある。
📊 クエリ・スキャンに注意 削除前のデータは見えてしまうため、アプリ側でTTL判定を補完する場合もある。
⚠️ 削除対象は1次パーティション単位 TTLはアイテム単位で動作するが、削除効率のために内部的にはグルーピングされている。
⚠️ 注意事項
項目 内容
🔍 TTL対象外の属性には影響なし TTL属性を設定しないアイテムは、自動削除対象にならない。
🔁 削除はリトライされない 一度削除処理が失敗した場合、自動リトライは保証されない。
❌ TTLで削除されたデータは復元不可 誤設定によって重要データを失うリスクがあるため、十分に検証が必要。
🔐 TTL削除はトリガーされない 削除に伴うStreamsやTriggerは発火しないため、後処理が必要な場合は自前で実装する。
💡 補足Tips
項目 内容
✅ TTLの有効化はテーブル単位 DynamoDBコンソールまたはAPI経由でTTL属性名を設定して有効化する。
📉 不要データの自動クリーンアップに便利 ストレージコストの削減や、DB肥大化防止に有効。
🔍 CloudWatch連携 TTLが有効な削除が発生した場合、DynamoDB > TimeToLiveDeletedItemCount メトリクスで確認できる。
🔗 参考リンク
tamaco489tamaco489

📦 5-1. BatchWriteItem / BatchGetItem の件数・サイズ制限

ℹ️ 概要
項目 内容
📌 バッチAPIの種類 BatchWriteItem(書き込み)、BatchGetItem(読み込み) が用意されている。
🎯 一括処理のためのAPI ネットワークオーバーヘッド削減やスループット向上を目的に、まとめてリクエストできる。
📏 制限事項
項目 内容
🧮 最大件数 両APIともに1リクエストあたり最大25件まで。
💾 最大サイズ 合計サイズは16MBを上限とする(1リクエスト単位)。
⛔ 書き込みと削除の混在 BatchWriteItemPutRequestDeleteRequestを混在できるが、同一アイテムには不可。
⚠️ トランザクションではない 処理は一部成功・一部失敗の可能性があるため、完全性が必要な処理にはTransactWriteItemsを使うべき。
🧠 ユースケース・補足Tips
項目 内容
✅ 高速なデータ投入 大量のデータを素早く書き込む・取得するユースケースに向いている。
🔄 結果の確認と再送設計が重要 成功・失敗の判定と、失敗時のリトライ処理はクライアント側で制御する必要がある。
📉 書き込み時のWCU節約 一括送信により、個別リクエストより効率的にWCU(書き込みキャパシティ)を使用できる可能性がある。
tamaco489tamaco489

🔁 5-2. バッチ処理のリトライ戦略(未処理項目の再送)

ℹ️ 概要
項目 内容
📦 バッチリクエストの性質 BatchWriteItemBatchGetItem は、一部のリクエストが失敗する可能性がある
🚫 未処理項目の返却 DynamoDB はスループット制限などにより処理できなかった項目を、UnprocessedItems として返す
🔁 クライアント実装の要件 UnprocessedItems を検出し、再送処理(リトライ)をクライアント側で実装する必要がある
💡 実装ポイント
項目 内容
🔄 再送ロジック UnprocessedItems が空になるまでループして再送する
⏳ 再試行の間隔 **指数バックオフ(Exponential Backoff)+ジャイター(Jitter)**で再試行間隔を調整する
⚙️ SDKとの連携 AWS SDK の retryer はトランスポート層のエラーに対応しているが、UnprocessedItems の再送は明示的に行う必要がある
📉 最大試行制御 再送回数やタイムアウトを制限して無限ループを避ける
⚠️ 注意点・Tips
項目 内容
📋 UnprocessedItemsの構造 オブジェクト構造はリクエストと同じ形式で返ってくるため、そのまま再送に利用できる
🚫 書き込み順序 DynamoDB はバッチ内での順序を保証しないため、順序制御が必要なユースケースには注意
📈 監視 ThrottledRequests メトリクスでリトライが多発しているか確認する
🔁 トランザクションとの違い トランザクションAPIでは All or Nothing となるが、バッチAPIは部分成功・部分失敗の仕様
tamaco489tamaco489

🔀 5-3. トランザクションとの違い(部分失敗の扱い)

ℹ️ 概要
項目 内容
📦 バッチAPI BatchWriteItemBatchGetItem は、一部の処理が失敗しても他が成功する(部分成功)。
🔒 トランザクションAPI TransactWriteItemsTransactGetItems は、すべての操作が成功するか、すべて失敗するかのどちらか(オール・オア・ナッシング)。
⚠️ 利用シーンの違い データの一貫性や完全性が重要な場面では、バッチAPIでは不十分な場合がある。
🧠 設計時の選択指針
項目 内容
✅ バッチAPI向き ログの保存、分析用の一括データ投入など、一部失敗が許容される処理に適している。
✅ トランザクション向き ユーザー登録と残高更新など、すべての操作を同時に成功させたいケースに向いている。
💡 トランザクション制限 トランザクションは最大25件 / 合計4MB までという制限があるため、大規模データ処理には向かない。
⚠️ 注意点・Tips
項目 内容
🔄 再送制御の違い バッチAPIは UnprocessedItems をもとにクライアントで明示的にリトライを行う必要がある
🧪 条件失敗の挙動 トランザクションは ConditionExpression が1つでも失敗すると、すべての操作がロールバックされる
💸 コスト面の違い トランザクションAPIは、WCU(書き込みキャパシティ)の消費が高め。費用対効果も考慮する必要がある。
tamaco489tamaco489

🧭 5-4. パーティション分散への配慮(ホットパーティション対策)

ℹ️ 概要
項目 内容
🔄 パーティション分散 DynamoDBは内部的にデータを複数の「パーティション」に分散して格納・処理している。
🔥 ホットパーティション 特定のパーティションにアクセスが集中すると「ホットパーティション」が発生し、スループットの低下やスロットリングの原因になる
🎯 キー設計が鍵 均等にアクセスが分散するようなパーティションキー設計がパフォーマンス確保の鍵となる。
🧠 設計時の対策
項目 内容
🧊 均等分散キーの選定 ユーザーID、ランダムUUID、タイムスタンプなど、アクセスが集中しない特性を持つキーを使う。
🎲 プレフィックスシャーディング 例:user#0, user#1, ..., user#9 のように人工的にプレフィックスを付けてアクセス分散を行う。
⏳ 時系列データの工夫 "2024-04-19" のような日付固定のキーは避け、日付+乱数などで偏りを減らす。
⚠️ 注意点・Tips
項目 内容
⚠️ 偏ったキーは避ける 特定日時やイベント単位のキーは、アクセス集中を引き起こす原因になる。
📈 CloudWatch 監視 ThrottledRequestsConsumedReadCapacityUnits を使って、負荷状況やスロットリングの兆候を監視する。
💡 オンデマンドでも限界あり オンデマンドモードは自動スケーリングに優れるが、ホットパーティションの根本原因は解決しない
tamaco489tamaco489

🔒 6-1. テーブル削除保護(コンソールまたはAPIで設定)

ℹ️ 概要
項目 内容
🚫 削除保護機能 DynamoDBでは、テーブルごとに「削除保護」の設定ができる。
🛠️ 設定方法 AWSマネジメントコンソールまたは UpdateTable API から設定可能。
🔄 無効化しないと削除不可 削除保護が有効な場合、テーブルを削除する前に「明示的に無効化」しなければならない。
🧠 設計時の活用
項目 内容
🧪 検証環境でも活用推奨 誤操作防止のため、開発・検証環境でも削除保護を有効化しておくと安心。
🚨 本番環境では必須 重要なデータを扱うテーブルには、必ず削除保護を設定すべき
⚠️ 注意点・Tips
項目 内容
🚨 削除保護を解除するには注意 削除保護を無効化する際には十分な確認を行い、誤って削除しないように。
💡 無効化後すぐに削除操作可能 一度無効化すれば、テーブル削除は即時に行えるが、慎重に実行すること。
🔗 参考リンク
tamaco489tamaco489

🧱 6-2. アプリケーションからの誤削除防止(IAM権限制御)

ℹ️ 概要
項目 内容
🔐 IAMによる保護 DynamoDBの削除系アクション(DeleteTable, DeleteItem, BatchWriteItemなど)に対して、IAMポリシーで制限をかけられる。
🛑 誤削除リスク回避 誤ったコードやバグによって重要データを削除してしまうリスクを事前に防止できる
🧠 設計時の活用
項目 内容
👤 書き込み専用 IAM ロール 特定のアプリに「更新権限のみを許可」し、削除操作は許可しないポリシーを付与する。
🔍 実行権限を最小化 Lambda やバッチ処理など、最小限の権限でDynamoDBにアクセスさせる設計が基本。
🛡️ 管理者のみ削除許可 DeleteTable のような操作は、管理者権限を持つユーザーのみに限定する。
⚠️ 注意点・Tips
項目 内容
🔒 IAMポリシーを見直し 誤って削除権限が与えられていないか定期的にレビューする。
🧑‍💻 環境ごとに権限を分ける 本番環境と開発環境でアクセス権限を分け、誤削除を防ぐ。
🔗 参考リンク
tamaco489tamaco489

⚖️ 6-3. データの論理削除 vs 物理削除

ℹ️ 概要
項目 内容
🧹 物理削除 DeleteItem を使ってDynamoDBから完全にデータを削除する方法。
🚫 論理削除 削除フラグ(例:isDeleted: true)を使い、実体は残したまま削除扱いにする方法。
🔍 検索時の制御が必要 論理削除を採用した場合、アプリケーション側でのフィルタリング処理が必要。
🧠 設計時の選択指針
項目 内容
✅ 論理削除が向く場面 監査・復旧・一時保存など、過去データを残したいユースケース。
✅ 物理削除が向く場面 データ容量削減、明確な削除が必要なケース(例:機密情報の削除)。
🧠 TTLとの併用も検討 論理削除 + TTL(一定期間後に自動削除)という組み合わせもよく使われる。
⚠️ 注意点・Tips
項目 内容
⚠️ 論理削除後のクエリ制御 論理削除されたデータがクエリ結果に含まれないよう、フィルタ処理を必ず行うこと。
⏳ 物理削除後の復元不可 物理削除したデータは復元できないので、慎重に行う
🔗 参考リンク
tamaco489tamaco489

💰 7-1. オンデマンド vs プロビジョンドの料金体系

ℹ️ 概要
項目 内容
⏩ オンデマンドモード リクエスト数に基づいて料金が課金される。予測が難しいワークロードに適している。
📊 プロビジョンドモード 読み書きスループットを事前に設定し、そのキャパシティ分に対して料金が発生する。予測可能な負荷に適している。
💸 料金モデル オンデマンドでは、読み込み・書き込み要求ごとに課金され、プロビジョンドでは、設定したWCU(書き込みキャパシティユニット)とRCU(読み取りキャパシティユニット)に基づいて課金される。
🧠 設計時の選択指針
項目 内容
✅ オンデマンド向き トラフィックの予測が困難な場合や、アプリケーションの利用が低い場合。
✅ プロビジョンド向き 一貫したトラフィックを持つアプリケーションで、スケールの予測が可能な場合。
⚡ オンデマンドは短期間での利用に適しており、プロビジョンドは長期運用に向く。
⚠️ 注意点・Tips
項目 内容
🛠️ プロビジョンドでスケール調整 スループットの予測が難しい場合、プロビジョンドでオートスケーリングを設定してリソースを自動調整できる。
⚠️ オンデマンドは高負荷時にコストが急増 トラフィックが急激に増加すると、オンデマンドモードではコストが急上昇する可能性がある。
🔗 参考リンク
tamaco489tamaco489

📈 7-2. GSI/LSIの追加コスト

ℹ️ 概要
項目 内容
📊 GSI グローバルセカンダリインデックス(GSI)を作成することで、追加の読み取り・書き込みキャパシティが必要になるため、追加コストが発生する。
🗂️ LSI ローカルセカンダリインデックス(LSI)も、読み取りキャパシティユニット(RCU)や書き込みキャパシティユニット(WCU)の追加費用が発生する。
💸 コストの構成要素 GSI・LSIのインデックスには、プロビジョンドモードの場合、インデックス専用のスループットキャパシティが必要であり、オンデマンドの場合もインデックスのリクエストに対して課金される。
🧠 設計時の選択指針
項目 内容
⚠️ GSI追加時のコスト GSIは独自のスループットを持ち、テーブル本体のコストに加えて別途コストが発生する。
⚠️ LSIの制限 LSIは最大5個までしか作成できず、インデックス作成に伴うコストも無視できない。
🧮 インデックスの必要性を慎重に判断 インデックスを多用するとコストが高くなるため、必要なインデックスのみを作成するのがベストプラクティス。
⚠️ 注意点・Tips
項目 内容
📉 インデックス設計の見直し アクセスパターンに応じて、GSIやLSIの使用を再考し、最適化を図る。
🔄 インデックスの再作成 インデックス作成後に大量のデータ変更が行われる場合、再作成が必要となり、費用が増大する可能性がある。
🔗 参考リンク
tamaco489tamaco489

🗄️ 7-3. ストレージ使用量と課金対象(すべてのインデックス含む)

ℹ️ 概要
項目 内容
🧳 ストレージ課金対象 DynamoDBでは、テーブルおよびインデックスのデータがストレージ使用量として課金される。
📊 課金対象 ストレージは、アイテムのサイズ、GSIやLSIを含むすべてのインデックスのデータも含む。インデックスもテーブルデータと同様にストレージ容量としてカウントされる。
🔍 インデックスの影響 GSIやLSIがテーブルデータを冗長に保存するため、これらのインデックスがストレージ使用量を増加させ、コストに影響を与える。
🧠 設計時の選択指針
項目 内容
⚠️ インデックス設計に注意 GSIやLSIを必要最小限にすることで、ストレージ使用量とそれに伴うコストを抑えることができる。
📊 インデックスのストレージ計算 テーブルのストレージ使用量は、アイテムのサイズとインデックスによる冗長データを合わせて計算されるため、インデックスの数とサイズには注意が必要。
💡 定期的に不要なインデックスを削除する 使用していないインデックスはコストを無駄に増加させるため、不要なインデックスは定期的に見直し、削除することを推奨。
⚠️ 注意点・Tips
項目 内容
💡 ストレージ最適化 ストレージ使用量を減らすために、テーブルの項目数やデータサイズを可能な限り最適化することが重要。
🧮 ストレージ使用量は定期的にモニタリング CloudWatchを使用してストレージ使用量を定期的に監視し、過剰なストレージ使用を回避する。
🔗 参考リンク
tamaco489tamaco489

🌐 7-4. データ転送コスト(リージョン間通信など)

ℹ️ 概要
項目 内容
🌍 データ転送 DynamoDBはリージョン内およびリージョン間でデータを転送する際、転送量に基づいて料金が発生する。
🚚 リージョン間通信 同一リージョン内での通信は通常料金がかからないが、異なるリージョン間のデータ転送には追加コストが発生する。
💰 コストの発生 データ転送はインターネット経由やAWS内での転送においてもコストが発生するため、転送量を削減する設計が求められる。
🧠 設計時の選択指針
項目 内容
🚀 データ転送の最適化 同一リージョン内でのDynamoDB利用を選択することで、リージョン間転送コストを避けることができる。
🔄 クロスリージョンレプリケーション 必要な場合にのみ使用し、複数リージョン間でのデータ転送を最小限にする。
🛑 通信コストを抑えるための設計 データの移動を最小化し、データ転送の必要性が生じる前に、設計段階で削減策を検討することが重要。
⚠️ 注意点・Tips
項目 内容
⚠️ リージョン間通信のコスト AWSのリージョン間転送に関しては、他のAWSサービスと同様に転送量に基づいた追加費用が発生する。
📉 CloudWatchで転送量を監視 CloudWatchを使用して、データ転送量を監視し、予期しない転送が発生しないようにする。
🔗 参考リンク
tamaco489tamaco489

🔑 8-1. IAMによるアクセス制御

ℹ️ 概要
項目 内容
🛡️ IAMポリシー DynamoDBはIAM(Identity and Access Management)を用いてアクセス制御を行う。
🔒 アクセス制限 IAMポリシーで、特定のアクション(GetItemPutItemなど)に対するアクセス許可を設定可能。
🔍 制限対象 DynamoDBの操作に対して、リソース単位(テーブル、インデックス)で詳細にアクセスを制限することができる。
🧠 設計時の選択指針
項目 内容
✅ 最小権限の原則 各ユーザーやサービスには、必要最小限のアクセス権限だけを付与する。
🔒 リソースごとの権限設定 テーブルやインデックスに対して、操作ごとの制限を細かく設定できるため、具体的な要件に合わせた権限設計が重要。
📊 ロールベースのアクセス制御(RBAC) IAMポリシーをロールごとに設定することで、アクセス制御を管理しやすくする。
⚠️ 注意点・Tips
項目 内容
🧑‍💼 管理者権限の注意 管理者権限を持つユーザーには、全テーブルのアクセス権を付与しないようにする。
📉 ポリシーのテスト IAMポリシーを作成した後は、必ずテストを行い、必要なアクセス権限が適切に設定されているか確認する。
💡 権限変更の監査 ポリシー変更の履歴をCloudTrailで監査し、予期しないアクセス権限の変更がないかチェックする。
🔗 参考リンク
tamaco489tamaco489

🔓 8-2. テーブルレベル vs 項目レベルのアクセス制御

ℹ️ 概要
項目 内容
🛠️ テーブルレベル制御 テーブル全体に対するアクセス制御。IAMポリシーで指定し、特定のテーブルの操作を許可・拒否できる。
🔑 項目レベル制御 各アイテム(行)のレベルでアクセスを制御。DynamoDBは直接的な項目レベルの制御は提供していないが、アプリケーション側で制御可能。
🔐 条件付きアクセス ConditionExpression を使用して、条件に基づいたアクセス制御を行うことができる。例えば、特定のユーザーだけが特定の項目にアクセスできるように制御することが可能。
🧠 設計時の選択指針
項目 内容
✅ テーブルレベル制御向き すべてのユーザーに対してテーブル単位で制御する場合や、アプリケーション全体で共通のアクセス権限が必要な場合に適している。
✅ 項目レベル制御向き 特定の項目に対してアクセス制限を設けたい場合に有効。たとえば、ユーザーごとに異なるデータアクセスが必要な場合に使う。
📊 アプリケーション制御 項目レベルのアクセス制御は、DynamoDB自体が提供していないため、アプリケーションのロジックで制御する必要がある。
⚠️ 注意点・Tips
項目 内容
🚧 項目レベルの実装は注意 項目レベルのアクセス制御はアプリケーション側で実装する必要があり、運用が複雑になる場合がある。
⚙️ テーブル単位での制御 より簡単な運用が可能で、アクセス権限を一括で管理したい場合は、テーブルレベルで制御する方がシンプルである。
📉 権限設計のテスト 項目レベルでアクセス制御を行う場合は、十分にテストし、期待通りの動作を確認することが重要。
🔗 参考リンク
tamaco489tamaco489

🔐 8-3. 暗号化(KMSによるサーバーサイド暗号化)

ℹ️ 概要
項目 内容
🔒 KMS暗号化 DynamoDBはデータをサーバーサイドで暗号化するために、AWS Key Management Service(KMS)を使用する。
🛡️ デフォルト暗号化 デフォルトでは、DynamoDBはAWSの管理キー(AWS-managed key)を使用してデータを暗号化する。
🧑‍💻 カスタマー管理キー カスタムキー(Customer Managed Key、CMK)を使用することで、ユーザーが暗号化キーの管理と制御を行うことができる。
🧠 設計時の選択指針
項目 内容
✅ デフォルト暗号化 基本的な暗号化が求められる場合、AWSの管理するキーを使用するのが簡単で安全。
✅ カスタマー管理キー 高いセキュリティ要件がある場合や、キー管理を自社で行いたい場合、カスタマー管理キーを使用する。
🔑 KMSポリシー KMSキーの管理ポリシーやアクセス許可を慎重に設定し、必要なユーザーだけにアクセスを許可する。
⚠️ 注意点・Tips
項目 内容
🛠️ キー管理の重要性 KMSキーの権限設定は慎重に行うべきで、アクセス制御ポリシーを誤ると予期しないアクセスを許可してしまうリスクがある。
📉 パフォーマンスの影響 暗号化処理には若干のパフォーマンスオーバーヘッドが発生する場合があるが、セキュリティとのバランスを取ることが重要。
🔄 監査ログ KMSの使用に関する監査ログはCloudTrailで確認し、アクセスや操作履歴を追跡することを推奨。
🔗 参考リンク
tamaco489tamaco489

🌐 8-4. VPCエンドポイントの利用可否

ℹ️ 概要
項目 内容
🏢 VPCエンドポイント DynamoDBは、Amazon VPC内からのアクセスをセキュアにするため、VPCエンドポイントを利用できる。
🔐 安全な通信 VPCエンドポイントを使用することで、インターネットを経由せずに、VPC内のリソースからDynamoDBへのアクセスが可能となる。
🌍 グローバルアクセス VPCエンドポイントを使うことで、オンプレミスや別リージョンからのアクセスもセキュアに確立することができる。
🧠 設計時の選択指針
項目 内容
✅ VPCエンドポイント利用 セキュリティが重要な場合や、内部のネットワークでのみDynamoDBにアクセスしたい場合に有効。
🔒 安全な接続 インターネット経由のアクセスを防ぎ、オンプレミスとAWSの間でセキュアな接続を維持したい場合に利用。
🌐 公開APIとVPCエンドポイントの併用 公開されているDynamoDB APIとVPCエンドポイントを組み合わせて、用途に応じて最適な接続方法を選ぶ。
⚠️ 注意点・Tips
項目 内容
⚠️ コストの考慮 VPCエンドポイントを利用する場合、追加の料金が発生することを考慮しておく。
🔌 接続先リージョン VPCエンドポイントは対象リージョン内でのみ利用可能なため、リージョン間でのアクセス要件に注意が必要。
📊 モニタリング VPCエンドポイントの使用状況やパフォーマンスをCloudWatchでモニタリングし、異常を早期に検知できるようにする。
🔗 参考リンク
tamaco489tamaco489

📊 9-1. CloudWatchによるメトリクス監視

ℹ️ 概要
項目 内容
📊 CloudWatchメトリクス DynamoDBはCloudWatchメトリクスを通じて、テーブルのパフォーマンスと使用状況を監視できる。
🔍 主要メトリクス ConsumedReadCapacityUnits, ConsumedWriteCapacityUnits, ThrottledRequests など、スループットやエラーレートを監視する。
📅 期間のカスタマイズ メトリクスの期間(データポイントの粒度)をカスタマイズし、リアルタイムや過去のデータを追跡することが可能。
🧠 設計時の選択指針
項目 内容
✅ パフォーマンス監視 テーブルやインデックスのパフォーマンスに関するメトリクスを定期的に監視し、スロットリングやリソースの過不足を防ぐ。
✅ スループットモニタリング ConsumedReadCapacityUnitsConsumedWriteCapacityUnits を基にスループットの使用状況を把握し、必要に応じてスケーリングを行う。
💡 アラーム設定 CloudWatchアラームを使用して、特定のメトリクスがしきい値を超えた場合に通知を受け取る。
⚠️ 注意点・Tips
項目 内容
⚠️ スロットリングの警告 ThrottledRequests メトリクスは重要で、スロットリングが発生した場合はすぐに対応が必要。
⚙️ スケーリングの前提条件 Provisioned モードの場合、スケーリングの前にメトリクスを見てパフォーマンスを確認すること。
🧹 定期的なチェック CloudWatchのデータ保持期間(14日間)を考慮し、定期的にデータをバックアップまたはログに保存する。
🔗 参考リンク
tamaco489tamaco489

🔄 9-2. DynamoDB Streamsの有効化と用途

ℹ️ 概要
項目 内容
🔄 DynamoDB Streams DynamoDB Streamsは、テーブルの変更(挿入・更新・削除)をリアルタイムでキャプチャし、ストリームとして処理できる。
🛠️ イベント処理 各変更イベント(例: INSERT, MODIFY, REMOVE)がストリームに記録され、他のAWSサービスやカスタムアプリケーションで使用できる。
🚀 有効化方法 テーブル作成時または後からDynamoDB Streamsを有効化し、変更イベントをキャプチャする。
🧠 設計時の選択指針
項目 内容
✅ イベント駆動型アーキテクチャ 他のシステムと連携してリアルタイムにデータを処理したい場合(例: Lambdaで処理)に有効。
✅ 監査ログ データ変更履歴の監査やデータ同期に利用。データの変更トラッキングに役立つ。
💡 イベントフィルタリング ストリームのデータをLambdaなどで処理する際に、フィルタリングして不要なイベントを除外することができる。
⚠️ 注意点・Tips
項目 内容
⚠️ ストリームデータの保持期間 ストリームは最大24時間で保持されるため、イベントを早めに処理し、必要なデータは他のストレージに保存する。
📉 イベント処理の遅延 ストリームに格納された変更が即座に反映されない場合があり、処理の遅延を意識して設計する。
🔒 ストリームのアクセス管理 DynamoDB StreamsへのアクセスはIAMポリシーで制限することができ、適切に管理することが重要。
🔗 参考リンク
tamaco489tamaco489

⚙️ 9-3. Auto Scalingの設定

ℹ️ 概要
項目 内容
📈 Auto Scaling DynamoDBのAuto Scalingは、テーブルの読み書きキャパシティを自動的にスケーリングして、過負荷やスロットリングを回避する。
🔄 スケーリングポリシー しきい値を超えた場合に、キャパシティの増加または減少を自動的に行う。ポリシーに基づいて、設定した範囲内でスケールが調整される。
🛠️ 設定方法 DynamoDBコンソール、CLI、またはCloudFormationを使用して、テーブルのスケーリング設定を行うことができる。
🧠 設計時の選択指針
項目 内容
✅ オンデマンドモードでのキャパシティ調整が難しい場合 高トラフィックの予測が立たないアプリケーションにおいて、Auto Scalingを使用してリソースを動的に調整する。
✅ 負荷変動の大きいワークロード 定期的に負荷が大きくなる時間帯が予測できる場合、Auto Scalingを設定して効率的にキャパシティを調整する。
💡 スケーリングの最適化 必要以上にスケールしないよう、最大キャパシティやしきい値の設定を最適化する。
⚠️ 注意点・Tips
項目 内容
⚠️ 過剰スケーリングのリスク スケーリングポリシーの設定が適切でないと、無駄にスケーリングしてコストが増加する可能性がある。
🧮 スケーリング対象のキャパシティの設定 プロビジョンドキャパシティの場合、しきい値やスケーリングの範囲を適切に設定することが重要。
📈 CloudWatchと連携 Auto Scalingの効果を最大化するために、CloudWatchでのメトリクス監視を行い、スケーリングポリシーのパラメータを最適化する。
🔗 参考リンク
tamaco489tamaco489

🔍 9-4. アクセスパターンのモニタリングと最適化

ℹ️ 概要
項目 内容
🕵️‍♂️ アクセスパターン分析 DynamoDBでは、アクセスパターンに基づいた設計がパフォーマンスに大きな影響を与える。定期的にアクセスパターンをモニタリングし、最適化を図る。
📊 CloudWatchとログ CloudWatchメトリクスやDynamoDB Streamsを利用して、読み書きの頻度やデータの利用状況を把握することができる。
🔄 最適化手法 アクセスの頻度が高い属性をインデックスで管理する、またはアクセス集中を防ぐためにパーティションキー設計を変更する。
🧠 設計時の選択指針
項目 内容
✅ 高頻度のアクセス対象設計 よく使われるデータに対してインデックスを追加するか、アクセスが分散するパーティションキーを選定する。
✅ インデックス利用の見直し 使用頻度の低いインデックスは削除する、または必要に応じてスキャン型のアクセス方法に切り替えることが有効。
💡 設計変更後のパフォーマンス測定 パフォーマンスが向上したかを測定するために、変更前後のアクセスパターンをCloudWatchで比較する。
⚠️ 注意点・Tips
項目 内容
⚠️ インデックスの過剰利用 過剰にインデックスを作成すると、書き込み時のパフォーマンスが低下する可能性がある。インデックスは本当に必要なものだけを作成する。
⚠️ パーティションキーの偏り アクセスが偏るパーティションキーを使用すると、ホットパーティションを避けられず、パフォーマンス低下の原因となる。
📈 定期的なパフォーマンスチェック アクセスパターンに変化がないか、定期的にチェックし、最適化が必要な場合は設計を見直す。
🔗 参考リンク
このスクラップは5ヶ月前にクローズされました