AWS CLI を使用した DynamoDBでのグローバルセカンダリインデックスの操作
AWS CLI を使用して、1 つ以上のグローバルセカンダリインデックスを含む Amazon DynamoDB テーブルを作成し、テーブルのインデックスを記述し、インデックスを使用してクエリを実行できます。
トピック
グローバルセカンダリインデックスを持つテーブルを作成します
グローバルセカンダリインデックスは、テーブルの作成と同時に作成できます。 これを行うには、create-table
パラメータを使用し、1 つ以上のグローバルセカンダリインデックスの仕様を指定します。次の例では、GameTitleIndex
と呼ばれるグローバルセカンダリインデックスを含む GameScores
という名前のテーブルを作成します。ベーステーブルには、パーティションキー UserId
とソートキー GameTitle
があり、特定のゲームの個々のユーザーのベストスコアを効率的に見つけることができます。一方、GSI にはパーティションキー GameTitle
とソートキー TopScore
があり、特定のゲームの全体的な最高スコアをすばやく見つけることができます。
aws dynamodb create-table \ --table-name GameScores \ --attribute-definitions AttributeName=UserId,AttributeType=S \ AttributeName=GameTitle,AttributeType=S \ AttributeName=TopScore,AttributeType=N \ --key-schema AttributeName=UserId,KeyType=HASH \ AttributeName=GameTitle,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 \ --global-secondary-indexes \ "[ { \"IndexName\": \"GameTitleIndex\", \"KeySchema\": [{\"AttributeName\":\"GameTitle\",\"KeyType\":\"HASH\"}, {\"AttributeName\":\"TopScore\",\"KeyType\":\"RANGE\"}], \"Projection\":{ \"ProjectionType\":\"INCLUDE\", \"NonKeyAttributes\":[\"UserId\"] }, \"ProvisionedThroughput\": { \"ReadCapacityUnits\": 10, \"WriteCapacityUnits\": 5 } } ]"
DynamoDB がテーブルを作成し、テーブルのステータスを ACTIVE
に設定するまで待機する必要があります。その後、テーブルへのデータ項目の入力を開始できます。describe-table を使用して、テーブル作成のステータスを判断できます。
グローバルセカンダリインデックスを既存のテーブルに追加します
グローバルセカンダリインデックスは、テーブルの作成後に追加したり変更したりすることもできます。これを行うには、update-table
パラメータを使用し、1 つ以上のグローバルセカンダリインデックスの仕様を指定します。次の例では、前の例と同じスキーマを使用していますが、テーブルが既に作成されており、後で GSI を追加する場合を想定しています。
aws dynamodb update-table \ --table-name GameScores \ --attribute-definitions AttributeName=TopScore,AttributeType=N \ --global-secondary-index-updates \ "[ { \"Create\": { \"IndexName\": \"GameTitleIndex\", \"KeySchema\": [{\"AttributeName\":\"GameTitle\",\"KeyType\":\"HASH\"}, {\"AttributeName\":\"TopScore\",\"KeyType\":\"RANGE\"}], \"Projection\":{ \"ProjectionType\":\"INCLUDE\", \"NonKeyAttributes\":[\"UserId\"] } } } ]"
グローバルセカンダリインデックスを持つテーブルの説明
テーブルのグローバルセカンダリインデックスに関する情報を取得するには、describe-table
パラメータを使用します。インデックスごとに、名前、キースキーマ、および射影された属性にアクセスできます。
aws dynamodb describe-table --table-name GameScores
グローバルセカンダリインデックスのクエリ
テーブルに query
を実行するのとほぼ同じ方法で、グローバルセカンダリインデックスに対する query
オペレーションを使用することができます。インデックス名、インデックスソートキーのクエリ条件、および返す属性を指定する必要があります。この例では、インデックスは GameTitleIndex
、インデックスソートキーは GameTitle
です。
返される属性は、インデックスに射影された属性だけです。このクエリを変更して非キー属性を選択することもできますが、これには比較的コストのかかるテーブルフェッチアクティビティが必要です。テーブルのフェッチの詳細については、「属性の射影」を参照してください。
aws dynamodb query --table-name GameScores\ --index-name GameTitleIndex \ --key-condition-expression "GameTitle = :v_game" \ --expression-attribute-values '{":v_game":{"S":"Alien Adventure"} }'