web-dev-qa-db-ja.com

DynamoDB変更範囲キー列

テーブル作成後にRangekey列を変更することは可能ですか?新しい列/属性の追加、テーブルのRangeKeyとしての割り当てなど。検索を試みましたが、範囲またはハッシュキーの変更に関する記事を見つけることができません

18
arvindwill

いいえ、残念ながら、DynamoDBでテーブルが作成された後でハッシュキー、範囲キー、またはインデックスを変更することはできません。 DynamoDB UpdateItem AP​​I Documentation は、インデックスを変更できないという事実について明確です。テーブルキーを変更できないことを明示的に示しているドキュメント内のどこへの参照も見つかりませんが、現在は変更できません。

DynamoDBはハッシュキーと範囲キー以外にスキーマレスであり、他の属性を問題なく新しいアイテムに追加できることに注意してください。残念ながら、ハッシュキーまたは範囲キーを変更する必要がある場合は、新しいテーブルを作成してデータを移行する必要があります。

編集(2014年1月):DynamoDBが on the flyのグローバルセカンダリインデックスをサポートするようになりました

26
rpmartz

追加のソートキーを変更または作成するには、既存のテーブルでは両方のアクションを実行できないため、新しいテーブルを作成してそこに移行する必要があります。

DynamoDBストリームにより、ダウンタイムなしでテーブルを移行できます。私はこれを非常に効果的にしました、そして私が従ったステップは次のとおりです:

  1. 目的のキー構造、LSI、GSIを使用して、新しいテーブルを作成します(これをNewTableと呼びます)。
  2. 元のテーブルでDynamoDBストリームを有効にする
  3. Lambdaをストリームに関連付け、レコードをNewTableにプッシュします。 (このLambdaはステップ5で移行フラグを削除する必要があります)
  4. [オプション]アイテムのスキャンを高速化するために、元のテーブルにGSIを作成します。このGSIに属性があることを確認してください:主キー、および移行済み(ステップ5を参照)。
  5. 前の手順で作成したGSI(またはテーブル全体)をスキャンし、次のフィルターを使用します。

    FilterExpression = "attribute_not_exists(Migrated)"

テーブル内の各アイテムを移行フラグで更新します(例:“ Migrated”:{“ S”:“ 0”})、それをDynamoDBストリームに送信します(データの損失が発生しないように、UpdateItem APIを使用します)。

[〜#〜]注[〜#〜]:更新中にテーブルの書き込み容量ユニットを増やしたい場合があります。

  1. Lambdaはすべてのアイテムを取得し、移行済みフラグを切り取り、それをNewTableにプッシュします。
  2. すべてのアイテムが移行されたら、コードを新しいテーブルに再ポイントします
  3. 元のテーブルを削除すると、Lambda関数はすべて幸せになりました。

これらの手順に従うと、データの損失やダウンタイムが発生しないことが保証されます。

私はこれを私のブログに文書化し、支援するコードを付けました: https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/

4
Abhaya Chauhan