DynamoDB:删除具有副本的表

时间:2020-03-20 19:38:38

标签: bash amazon-web-services amazon-dynamodb aws-cli

我在弄清楚如何自动化添加和删除具有副本的表(表版本为2019.11.21)的过程中遇到的问题

场景:我在us-east-1中有一个表,并用us-west-2中的副本对其进行了更新。一段时间后,我想使用带有aws cli的自动化脚本删除这些表。

由于删除表不会删除其副本(为什么?),我需要删除副本,然后删除一次。完成后,删除原始表。

我尝试了

aws dynamodb update-table --table-name some-table --region us-east-1 --cli-input-json \
'{
  "ReplicaUpdates":
  [
    {
      "Delete": {
        "RegionName": "us-west-2"
      }
    }
  ]
}'

但是在那之后,我不确定如何继续。我不能使用“等待”,因为删除副本不会更改表的状态。我也不能只是“等待”副本表不再存在,因为在删除第二张表后,原始表通常仍会停留在更新阶段。

自动删除副本和删除表的明智方法是什么?

1 个答案:

答案 0 :(得分:0)

我也尝试自动化相同的过程,但使用的是 Java SDK 而不是 AWS CLI。我收到了这样的错误:

<块引用>

您尝试更改的资源正在使用中。 (服务:DynamoDb,状态码:400,请求 ID:E07SSSKFG0VBCEKHEV6JQC419RVV4KQNSO5AEMVJF66Q9ASUAAJG,扩展请求 ID:空)

我设法通过等待主表激活来解决这个问题。

以下是正确删除 DynamoDB 全局表及其所有副本的方法:

  1. 对于您拥有副本的每个区域,使用 update-global-table 方法从全局表中删除该副本。
  2. 使用 waiter.waitUntilTableExists() 等待主表变为活动状态
  3. 删除该区域的实际副本表
  4. 删除CURRENT_REGION中的主表(主表)

这是用于此的 Java 代码:

getReplicaRegions().stream().filter(r -> !r.equals(CURRENT_REGION)).forEach(region -> {
    getClient().updateGlobalTable(b -> b.globalTableName(table).replicaUpdates(ReplicaUpdate.
            builder().delete(d -> d.regionName(region)).build()));
        waitForActive(table, CURRENT_REGION);
    getClient(region).deleteTable(b -> b.tableName(table));
});
waitForActive(table, CURRENT_REGION);
getClient().deleteTable(b -> b.tableName(table));