はじめに
こんにちは。もうすぐ2025年も終わりますね。
そんな2025年最後のブログは、もう完全にre:InventのS3 オブジェクト50TB対応やLambda Durable Functionで影が薄くなってしまった感がある「DynamoDBのグローバルセカンダリインデックスにおける複合キーサポート」になります。
概要
いままでグローバルセカンダリインデックス(以下「GSI」と記載)においてプライマリキー(値を一意に特定出来るキー*1)として設定できるのは、以下のパターンのみで、パーティションキーやソートキーは1つしか設定できませんでした。
それが今回の変更で、パーティションキーやソートキーをそれぞれ4つまで設定可能になりました。
確認
※GSIやプライマリーキーへキー設定はすでにあるので、今回は概要だけにとどめます
マネジメントコンソールからGSIを作成すると、確かにパーティションキーやソートキーをそれぞれ4つまで指定可能になっています。

またCloudFormationやAWS CDKもこれに対応済で、AWS CDKでGSIを作成する addGlobalSecondaryIndex メソッドの引数である GlobalSecondaryIndexPropsV2 interfaceでも、 partitionKeys および sortKeys という、 Attribute[] (=Attributeインターフェースの配列)を指定するプロパティが追加されており、ここにAttribureを複数指定することでそれらがパーティションキー&ソートキーとしてGSIに設定されます。*2
この機能が嬉しい点
複数キーを指定できるので、「#」などで値だけ区切る必要がなくなった(特にシングルテーブル設計の場合)
DynamoDBの設計パターン一つとして「シングルテーブル設計」という、「全エンティティのデータを1テーブルに集約すべき」という設計パターンがあり、以前がこれが強く推奨されていました。*3
この「シングルテーブル設計」を適用した場合、パーティションキーをエンティティ種類(=RDBで言う「テーブル名」)に割くことになるため、その結果「(情報を一意にするための)キーが足りない」という問題が発生します。
現在は「ORDER#1A2B3C」のように「#で値を区切って1つのキーに複数の値を格納する」方法がよく用いられますが、こういったことをせず「1キーに1つの値」でも情報を一意に特定しやすくなる...というメリットがあります。
プライマリキー項目の指定だけでフィルタ可能になり、コストを抑えられる
(Queryなどで)フィルタを行う際、課金対象になるのは「プライマリキーの条件でフィルタした結果、抽出されたデータ」です。
仮に「プライマリキー以外の条件でフィルタした結果、除外されるデータ」があったとしても、それらは課金対象になります。
今まではプライマリキーのキー数が少なかったため、プライマリキー項目の指定だけでそれらを除外しにくかったのですが、今回の変更でそれがやりやすくなり(=プライマリキーのキー数が増えたため)、フィルタ実行時のコストを抑えることが可能になります。
まとめ
ちょっと駆け足になりましたが「DynamoDBのグローバルセカンダリインデックス(GSI)に複数キーを指定する」について概要を説明しました。
今回諸事情であまり細かい説明を入れられなかったのですが、もし「詳細を知りたい」「内容がいまいちわからない」などあれば質問いただければ回答させていただきますので、よろしくお願いいたします。
それでは、よいお年を。