[アップデート] Amazon DynamoDB グローバルテーブルでレプリカの関連付けを解除できるようになりました
いわさです。
Amazon DynamoDB のグローバルテーブルは複数リージョンでのレプリケーションテーブルで構成されます。
これまではグローバルテーブルからあるリージョンのテーブルを外したい時は、そのリージョンのレプリカテーブルごと削除するしかありませんでした。
レプリケーションだけ止めてテーブルとデータはそのリージョンに残す/切り離すみたいなことは出来ませんでした。
先日のアップデートで、レプリカの削除だけでなく関連付けを解除できるようになりました。
これで、対象リージョンのレプリカテーブルやデータを削除せずにレプリケーションを止めて、同じテーブルをそのリージョンの単独テーブルとして使い続けることができるようになります。
今回こちらを確認してみたので紹介します。
実際に確認してみる
東京・大阪・バージニア北部の 3 リージョンで マルチリージョン結果整合性(MREC)のグローバルテーブルを用意しました。
ドキュメントによると本アップデートの対象は MREC のグローバルテーブルです。
マルチリージョン強整合性(MRSC)や旧バージョン(2017.11.29)では使えないようです。対象条件に注意しましょう。
You can disassociate replicas from same-account and multi-account global tables configured for multi-Region eventual consistency (MREC), using Global Tables version 2019.11.21 (Current). This operation is not supported for multi-Region strong consistency (MRSC) or Global Tables version 2017.11.29 (Legacy).
東京で item-1 ~ item-3 を書き込んでおき、3 リージョンに複製されている状態です。

また、関連付けの解除保護機能がありましてデフォルトで有効になっていました。コンソールでは次のように説明されています。
関連付け解除保護は、レプリカがグローバルテーブルから誤って関連付け解除されることを防止します。有効にすると、保護を無効にするまでレプリカの関連付けを解除できません。
解除する際はこれを先に無効化しておく必要があるようです。
まず、保護を外さずにそのまま解除しようとすると、拒否されました。

API で解除しようとした場合は以下のようなエラーメッセージが。
An error occurred (ValidationException) when calling the UpdateTable operation:
Cannot disassociate table hoge-gt-disassoc in region ap-northeast-3 because it has
disassociate protection enabled. Disable disassociate protection first.
そして、解除保護をオフにした後は、今度は解除出来ました。ステータスが UPDATING になりました。
ドキュメントによると、残りのレプリカが解除時点までの書き込みを受け取り終えるのを待ってから完了する、という挙動のようです。
しばらくして大阪テーブルを確認すると、ピアレプリカがなくなっており、大阪レプリカが単独のリージョンテーブルになりました。

解除したレプリカはそのリージョンの単独テーブルになり、テーブル名も ARN もそのまま引き継ぐことができるみたいです。同じテーブル名のままなのでグルーバルテーブルだと混乱しそうなので注意が必要ですね。
一方で東京側はバージニア北部とのグローバルテーブルとして残っていました。

ここは解除後にレプリカが何個残るかで結果が変わるようです。
- 2 つ以上残る場合は、解除したレプリカが単独テーブルになり、残りはグローバルテーブルとして続く
- 1 つしか残らない場合、解除すると両方とも単独テーブルになる
ドキュメントどおり、3 リージョンから 1 つ解除すると、残り 2 リージョンはグローバルテーブルのままですね。
なお、解除した大阪テーブルには、グローバルテーブル時代のデータ(item-1 ~ item-3)がそのまま残っていました。
さらに大阪テーブルへ新しいアイテムを書き込んでみたところ、大阪には増えましたが、東京側をスキャンしても増えていませんでした。外れてますねちゃんと。
aws dynamodb put-item --table-name hoge-gt-disassoc --region ap-northeast-3 \
--item '{"id":{"S":"item-osaka-only"},"note":{"S":"written-after-disassociate"}}'
aws dynamodb scan --table-name hoge-gt-disassoc --region ap-northeast-1 --query 'Items[].id.S'
[
"item-1",
"item-2",
"item-3"
]
なお、関連付けの解除は取り消せず、解除したテーブルを同じグローバルテーブルに戻すことはできません。
You cannot undo disassociation or reattach the same table to the global table it left.
同じリージョンでもう一度レプリカが欲しくなった場合は、単独テーブル側の必要な変更を残りのグローバルテーブルに反映してから、単独テーブルを削除して新しいレプリカを追加し直す形になるようです。
解除できないケースもあった
検証の途中で、解除がブロックされるパターンにもあたりました。
レプリカを追加するときのソースになったリージョンは、追加から 24 時間はそのレプリカを解除できないようです。
今回は東京をソースに大阪・バージニア北部を追加したので、東京を解除しようとすると次のエラーになりました。
An error occurred (ValidationException) when calling the UpdateTable operation:
Replica cannot be disassociated because it has acted as a source region for new
replica(s) being added to the table in the last 24 hours.
You also cannot disassociate a replica that has acted as the source for a new replica added in the last 24 hours. Wait until 24 hours have elapsed since the new replica was added.
このため今回は、ソースになっていない大阪レプリカを解除する流れで検証しました。
さいごに
本日は Amazon DynamoDB グローバルテーブルでレプリカの関連付けを解除できるようになったので確認してみました。
テーブルもデータも消さずにレプリケーションだけ止められるので、リージョンやアカウントの移行時にも使えそうです。
関連付け解除保護がデフォルトで有効なこと、追加のソースになったリージョンは 24 時間解除できないこと、解除は取り消せないことは注意しましょう。










