[アップデート] Amazon DynamoDB で GSI の複合キーがサポートされました

[アップデート] Amazon DynamoDB で GSI の複合キーがサポートされました

2025.11.22

こんにちは、製造ビジネステクノロジー部の若槻です。

Amazon DynamoDB で、グローバルセカンダリインデックス(GSI)に複数属性を組み合わせた複合キーを設定できるようになりました。

https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-dynamodb-multi-attribute-composite-keys-global-secondary-indexes/

今までは DynamoDB で複合キーを使いたい場合は ORDER#PENDING#2025-11-04 のように属性結合(Attribute Concatenation)と呼ばれる手法を用いる必要がありました。

しかし今後は、複合キーを使いたい場合でもアプリケーション側での属性の分解や結合のロジックを実装する必要も無くなり、よりシンプルに DynamoDB を利用可能になりそうです。

やってみた

以下の記事のサンプルに倣いつつ、GSI の複合キーを実際に試してみました。

https://aws.amazon.com/jp/blogs/database/multi-key-support-for-global-secondary-index-in-amazon-dynamodb/

以降、テーブルおよび GSI のパーティションキーを PK、ソートキーを SK と略記します。

準備

まずは準備として、PK order_id を持つベーステーブルを作成し、データを投入します。

詳細はこちら

ベーステーブルの作成(AWS CDK)

import * as cdk from "aws-cdk-lib";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import { Construct } from "constructs";

export class SampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new dynamodb.Table(this, "OrdersTable", {
      tableName: "orders-table",
      partitionKey: {
        name: "order_id",
        type: dynamodb.AttributeType.STRING,
      },
      removalPolicy: cdk.RemovalPolicy.DESTROY, // 検証簡易化のため、論理削除時にテーブルを削除する設定
    });
  }
}

データの投入(AWS CLI)

aws dynamodb batch-write-item --request-items '{
  "orders-table": [
    {
      "PutRequest": {
        "Item": {
          "order_id": {"S": "KSUID1"},
          "customer_id": {"S": "C#1A2B3C"},
          "order_date": {"S": "2025-11-04"},
          "amount": {"N": "200"},
          "status": {"S": "ACTIVE"},
          "acc_type": {"S": "A"},
          "org_id": {"S": "OMEGA"}
        }
      }
    },
    {
      "PutRequest": {
        "Item": {
          "order_id": {"S": "KSUID2"},
          "customer_id": {"S": "C#1A2B3C"},
          "order_date": {"S": "2025-11-04"},
          "amount": {"N": "145"},
          "status": {"S": "PENDING"},
          "acc_type": {"S": "A"},
          "org_id": {"S": "OMEGA"}
        }
      }
    },
    {
      "PutRequest": {
        "Item": {
          "order_id": {"S": "KSUID3"},
          "customer_id": {"S": "C#1A2B3C"},
          "order_date": {"S": "2025-11-04"},
          "amount": {"N": "110"},
          "status": {"S": "PENDING"},
          "acc_type": {"S": "B"},
          "org_id": {"S": "BRAVO"}
        }
      }
    }
  ]
}'

GSI の作成

作成したテーブルの [インデックスの作成] メニューを見ると、PK および SK をそれぞれ最大 4 属性まで指定できるようになっています。

PK に customer_id、SK に status (SK1) と order_date (SK2) と amount (SK3) を指定します。

GSI が作成されました。

ちなみに、今回のように複数属性を用いて PK / SK を構成した場合、クエリ時に以下の仕様が適用されます。

  • PK(複合)に指定した属性は、すべて = 条件が必須
    • 例: PK1 と PK2 のうち PK1 だけ一致条件、は不可
  • SK は上から順に条件を指定可能
    • 例: SK1 のみ、SK1 と SK2 まで、SK1~SK3 まで、など
  • 範囲条件(>, >=, BETWEEN など)は、最後の SK のみ
    • 今回の例では amount が該当
  • SK 属性を飛ばして指定することはできない
    • 例:SK1 と SK3 のみ、などは不可

キー設計時には意識しておくようにしましょう。

複合キーでクエリを実行してみる

作成した GSI で複合キーを指定してクエリを実行してみます。

マネジメントコンソールのクエリ画面では、複合キーを持つインデックスを選択すると、SK の場合は複合キーの属性がオプションで追加可能となっています。

PK および SK1 を指定してクエリを実行した結果が以下です。3 件ヒットしました。

そして PK および SK1~SK3 を指定してクエリを実行した結果が以下です。追加の SK 条件により、2 件に絞り込まれました。

ちなみにクエリ時の SK の属性追加は、マネジメントコンソール上だと予め指定された順番でしか追加できないようになっています。

おわりに

Amazon DynamoDB で、グローバルセカンダリインデックス(GSI)に複数属性を組み合わせた複合キーを設定できるようになったので共有しました。

今後 DyynamoDB のデザインパターンが大きく変わることになりそうなアップデートでした。早速公式プラクティスとして下記の AWS ドキュメントにも反映されていますので、ぜひ参考にしてみてください。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.DesignPattern.MultiAttributeKeys.html

また、AWS CDK での GSI 複合キーの L2 コンストラクトでのサポートも早速リリースされています。爆速の対応は素晴らしいですね。

https://github.com/aws/aws-cdk/releases/tag/v2.226.0

以上

この記事をシェアする

FacebookHatena blogX

関連記事