テック技報最新号へ →
インフラ

DynamoDB で後から直せるのはインデックス、直せないのはキー(GSI は後付け可、LSI は作成時のみ)

@dkfj · 2026-10-27
#infra#aws#dynamodb#db#設計

DynamoDB のテーブル設計でやり直しが効く部分と効かない部分を分けておくと、最初に悩むべき所がはっきりする。

直せるもの・直せないもの

対象作成後に変更・追加できるか備考
テーブルのパーティションキー / ソートキーできない変えるには新テーブルを作ってデータを移す
GSI(グローバルセカンダリインデックス)後から追加・削除できる別のパーティションキーで作れる。読み取りは結果整合のみ
LSI(ローカルセカンダリインデックス)テーブル作成時にしか作れない(後から削除もできない)パーティションキーはテーブルと同じで、ソートキーだけ別にする。強整合の読み取りが使える

設計時の判断

  1. パーティションキーとソートキーは最初に決めきる。主要なアクセスパターン(何で引くか・何で並べるか)を書き出してから作る
  2. 「同じパーティションキーで、別の並び順でも引きたい」かつ「強整合が要る」なら、LSI を 作成時に 入れておく
  3. それ以外の追加のアクセスパターンは、あとで GSI を足して対応する前提でよい

GSI の追加は既存テーブルに対して実行できる(バックフィルが走る)。

sh
aws dynamodb update-table \
  --table-name Orders \
  --attribute-definitions AttributeName=customerId,AttributeType=S \
  --global-secondary-index-updates \
    '[{"Create":{"IndexName":"byCustomer","KeySchema":[{"AttributeName":"customerId","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"}}}]'

(オンデマンドではなくプロビジョンドモードのテーブルなら ProvisionedThroughput も指定する)

注意点

  • LSI を付けたテーブルは、同じパーティションキーの項目(アイテムコレクション)が合計 10GB までという制限がかかる。LSI は「とりあえず付ける」ものではない
  • LSI は 1 テーブル 5 個まで。GSI の上限は既定で 20 個(引き上げ申請可)
  • キーを変えたくなったら、新テーブルを作り、S3 へのエクスポート / インポートや DynamoDB Streams で移行する
  • 容量の見積もりは DynamoDB: RCU は「4KB 単位に切り上げ」で数える/DAX を入れる前に強整合が要るか確かめる を参照

出典

X の元の投稿を開く