0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DynamoDB キャパシティユニット(RCU/WCU)の計算方法を具体例で理解する

Posted at

概要

DynamoDBのキャパシティユニット計算は、コスト最適化とパフォーマンス設計の要です。結果整合性読み取りと強い整合性読み取りでRCU消費量が2倍異なる理由や、WCUの計算ロジックを具体例とともに解説します。実務で使える計算式と注意点を紹介します。

目次

  1. はじめに
  2. 読み取り整合性モデルの理解
  3. RCU(Read Capacity Unit)の計算方法
  4. WCU(Write Capacity Unit)の計算方法
  5. 実践的な計算シミュレーション
  6. ベストプラクティスと注意点
  7. 終わりに
  8. 参考文献・参考サイト

1. はじめに

DynamoDBを本番環境で運用する際、キャパシティユニットの正確な計算は避けて通れません。過剰にプロビジョニングすればコストが無駄になり、不足すればスロットリングが発生してユーザー体験を損ないます。

本記事では、RCU(読み取りキャパシティユニット)とWCU(書き込みキャパシティユニット)の計算方法を、具体的な数値例を用いて解説します。特に、結果整合性読み取りと強い整合性読み取りの違いが、なぜRCU消費量に2倍の差を生むのか、その技術的背景も含めて理解を深めていきましょう。

2. 読み取り整合性モデルの理解

DynamoDBには2つの読み取り整合性モデルがあります。この違いを理解することが、RCU計算の第一歩です。

2.1 DynamoDBのデータレプリケーション

DynamoDBは同一リージョン内の3つのアベイラビリティーゾーンに自動的にデータをレプリケーションします。この仕組みにより高可用性を実現していますが、3箇所への複製には時間差が生じます。

image.png

2.2 結果整合性読み取り(Eventually Consistent Read)

結果整合性のある読み込みは、すべての読み取りオペレーションのデフォルトの読み込み整合性モデルです。最近完了した書き込みオペレーションの結果が応答に反映されない場合があります。

特徴

  • デフォルトの読み取りモード
  • 3箇所のレプリカのうち、どこから読み取るかは不定
  • 書き込み直後に読み取ると、古いデータが返る可能性がある
  • 通常1秒以内にすべてのコピーの整合性が取れます
  • RCU消費量が半分(4KB/秒・2回)

たとえるなら、3つの図書館に同じ本の最新版を配送する際、配送中は古い版が置かれている図書館があるイメージです。どの図書館で借りるかは選べないため、運が悪いと古い版を手にする可能性があります。

2.3 強い整合性読み取り(Strongly Consistent Read)

ConsistentReadをtrueに設定すると、DynamoDBは、成功した以前のすべての書き込みオペレーションからの更新を反映した、最新データを含む応答を返します。

特徴

  • オプションで指定する必要がある(ConsistentRead=True
  • 必ず最新のデータが取得できる
  • 内部的には複数のレプリカを確認して整合性を保証
  • RCU消費量が2倍(4KB/秒・1回)
  • グローバルセカンダリインデックス(GSI)では利用不可

2.4 なぜRCU消費量が2倍になるのか

DynamoDBは、書き込み時に3箇所のうち2箇所に成功した時点で書き込み完了(HTTP 200)を返します。強い整合性読み取りでは、複数のレプリカから値を読み取り、一致すればその値を、一致しなければもう1箇所の値も読んで2箇所に書き込まれている値を返します。

この複数ノードへのアクセスと検証プロセスが、RCU消費量を2倍にする理由です。データの正確性を保証するためのトレードオフと言えます。

3. RCU(Read Capacity Unit)の計算方法

3.1 RCUの基本定義

整合性モデル 4KBあたりの処理能力 RCU消費量
結果整合性読み取り 1秒間に2回 1RCU
強い整合性読み取り 1秒間に1回 2RCU(結果整合性の2倍)

3.2 計算式

結果整合性読み取りの場合

必要なRCU = ⌈アイテムサイズ / 4KB⌉ × 読み取り回数/秒 / 2

強い整合性読み取りの場合

必要なRCU = ⌈アイテムサイズ / 4KB⌉ × 読み取り回数/秒

※ ⌈ ⌉は切り上げを表します

3.3 具体的な計算例

例1:2KBのアイテムを結果整合性で100回/秒読み取る

ステップ1:アイテムサイズの単位計算
⌈2KB / 4KB⌉ = ⌈0.5⌉ = 1単位

ステップ2:RCU計算
1単位 × 100回/秒 / 2 = 50RCU

例2:8KBのアイテムを強い整合性で50回/秒読み取る

ステップ1:アイテムサイズの単位計算
⌈8KB / 4KB⌉ = 2単位

ステップ2:RCU計算
2単位 × 50回/秒 = 100RCU

例3:5KBのアイテムを結果整合性で200回/秒読み取る(端数の切り上げ)

ステップ1:アイテムサイズの単位計算
⌈5KB / 4KB⌉ = ⌈1.25⌉ = 2単位

ステップ2:RCU計算
2単位 × 200回/秒 / 2 = 200RCU

重要:4KBを1バイトでも超えると、2単位とカウントされます。これはコスト最適化の観点から非常に重要です。

例4:同じ5KBのアイテムを強い整合性で読み取る場合

ステップ1:アイテムサイズの単位計算
⌈5KB / 4KB⌉ = 2単位

ステップ2:RCU計算
2単位 × 200回/秒 = 400RCU

結果整合性(200RCU)と比較して、ちょうど2倍の400RCUが必要になります。

4. WCU(Write Capacity Unit)の計算方法

4.1 WCUの基本定義

1WCUは、最大1KBのアイテムを1秒間に1回書き込む能力を提供します。読み取りと異なり、書き込みには整合性モデルの選択肢はありません。

アイテムサイズ 書き込み回数/秒 必要なWCU
1KB以下 1回 1WCU
2KB 1回 2WCU
1KB 100回 100WCU

4.2 計算式

必要なWCU = ⌈アイテムサイズ / 1KB⌉ × 書き込み回数/秒

4.3 具体的な計算例

例1:0.5KBのアイテムを100回/秒書き込む

ステップ1:アイテムサイズの単位計算
⌈0.5KB / 1KB⌉ = 1単位

ステップ2:WCU計算
1単位 × 100回/秒 = 100WCU

1KB未満のアイテムでも1WCUとしてカウントされる点に注意が必要です。

例2:3.5KBのアイテムを50回/秒書き込む

ステップ1:アイテムサイズの単位計算
⌈3.5KB / 1KB⌉ = 4単位

ステップ2:WCU計算
4単位 × 50回/秒 = 200WCU

例3:10KBのアイテムを20回/秒書き込む

ステップ1:アイテムサイズの単位計算
⌈10KB / 1KB⌉ = 10単位

ステップ2:WCU計算
10単位 × 20回/秒 = 200WCU

5. 実践的な計算シミュレーション

5.1 ユースケース別の必要キャパシティ

以下は、典型的なアプリケーションシナリオでの計算例です。

ユースケース アイテムサイズ 読み取り 書き込み 整合性 必要RCU 必要WCU
ユーザープロフィール照会 2KB 500回/秒 10回/秒 結果整合性 250 20
在庫管理システム 1KB 100回/秒 50回/秒 強い整合性 100 50
ログ記録 5KB 10回/秒 1000回/秒 結果整合性 10 5000
リアルタイムゲームスコア 0.5KB 2000回/秒 500回/秒 強い整合性 2000 500

image.png

5.2 コスト試算(東京リージョン)

東京リージョン(ap-northeast-1)のプロビジョンドモードにおける料金は、1RCUあたり0.0001484USD/時間、1WCUあたり0.000742USD/時間です(2024年時点)。

計算例:在庫管理システム(100RCU、50WCU)

月間時間数 = 24時間 × 30.5日 = 732時間

RCUコスト = 100RCU × 0.0001484USD/時間 × 732時間 
         = 10.86USD/月

WCUコスト = 50WCU × 0.000742USD/時間 × 732時間 
         = 27.17USD/月

合計 = 38.03USD/月(約5,700円、1ドル=150円換算)

重要な注意点

  • プロビジョンドモードでは、実際の使用量に関わらず、設定したキャパシティ分の料金が発生します
  • 使用パターンが予測可能な場合、オンデマンドモードよりもコストを抑えられます
  • 毎月25RCU・25WCUまでは無料枠が適用されます(アカウント・リージョンごと)

6. ベストプラクティスと注意点

6.1 キャパシティの適切な設計

アイテムサイズの最適化

  • 4KBと5KBの境界に注意:5KBのアイテムは4KBのアイテムの2倍のRCUを消費します
  • 1KBと1.1KBの境界に注意:1.1KBのアイテムは1KBのアイテムの2倍のWCUを消費します
  • 大きなデータはS3に保存し、DynamoDBにはパスのみ格納する設計を検討しましょう

整合性モデルの使い分け

  • デフォルトは結果整合性(コスト半分)を使用
  • 以下の場合のみ強い整合性を検討:
    • 金融取引など、絶対に最新データが必要な場合
    • 書き込み直後の読み取りで整合性が必須の場合
    • 在庫数など、古いデータが業務に影響する場合

6.2 バースト対応とオートスケーリング

DynamoDBにはバーストキャパシティという仕組みがあり、短時間の急激なアクセス増に対応できます。ただし、これに頼らず、Auto Scalingの設定を推奨します。

最小キャパシティ: 予測される最低使用量
最大キャパシティ: 予測される最大使用量の1.5倍程度
目標使用率: 70%(スロットリングを避けつつコストを抑える)

6.3 コスト最適化のヒント

  1. 不要なテーブルの削除:AWS CDKでデフォルト作成されたテーブルは5RCU/5WCUが設定され、使用していなくても月額約3.2USDのコストが発生します
  2. GSIの最小化:GSIもテーブルと独立してキャパシティを消費します
  3. リザーブドキャパシティの活用:1年または3年のコミットで最大76%のコスト削減が可能
  4. CloudWatch監視:実際の消費量を定期的に確認し、過剰プロビジョニングを避ける

6.4 制限事項の理解

グローバルセカンダリインデックス(GSI)では強い整合性読み取りはサポートされていません。GSIを使用したクエリでは、必ず結果整合性読み取りになります。

また、ネットワークの遅延または停止があった場合、強い整合性読み取りではHTTP 500エラーが返される可能性があります。このため、アプリケーション側でリトライロジックを実装することが重要です。

7. 終わりに

本記事では、DynamoDBのキャパシティユニット(RCU/WCU)の計算方法を、結果整合性と強い整合性の違いを含めて解説しました。

重要なポイントのまとめ

  • 結果整合性読み取りは強い整合性の半分のコスト(4KB/秒・2回 vs 4KB/秒・1回)
  • 強い整合性は複数レプリカの確認により2倍のRCUを消費
  • 書き込みは整合性モデルの選択肢なし(1WCU = 1KB/秒・1回)
  • アイテムサイズの境界値(4KB、1KB)を意識した設計が重要
  • 実際の使用量を監視し、継続的に最適化

次のステップ

  1. CloudWatch Metricsの設定:ConsumedReadCapacityUnits / ConsumedWriteCapacityUnitsを監視
  2. Auto Scalingの導入:トラフィックパターンに応じた自動調整
  3. DynamoDB Contributorを試す:パーティションキーごとの詳細分析
  4. オンデマンドモードの検討:予測困難なワークロードの場合

DynamoDBの適切なキャパシティ設計は、パフォーマンスとコストの両立につながります。本記事の計算方法を活用し、最適な運用を実現してください。

8. 参考文献・参考サイト

AWS公式ドキュメント

参考記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?