如何在主要表更改上迁移dynamodb数据?

时间:2017-05-03 22:27:09

标签: amazon-dynamodb amazon-cloudformation serverless-framework

在开发结构和需求变化期间。需要更改密钥和索引设置,这可能会破坏增量表更新。所以我到目前为止的解决方案是删除表并从cloudformation堆栈重新创建它。

但如何通过生产部署解决这个问题?是否可以按如下方式自动化dynamodb部署?

  1. 创建新表
  2. 将数据从旧表迁移到新表
  3. 删除旧表

1 个答案:

答案 0 :(得分:2)

是的,完全可以自动化这样的部署结构。只要您有创建表的代码,从旧表中获取所有数据,更改数据,然后将其全部上载到新表中,而不会导致正常运行,这应该是相当简单的。如果你想写一些你想做的语言,我可以帮助你多一点。

之前我已经完成了这项工作,并在下面添加了一个关于如何在Java中执行此操作的小型通用代码示例。

给定存储在dynamo中的对象类型的类创建表的Java方法:

 /**
 * Creates a single table with its appropriate configuration (CreateTableRequest)
 */
public void createTable(Class tableClass) {
    DynamoDBMapper mapper = createMapper(); // you'll need your own function to do this.

    ProvisionedThroughput pt = new ProvisionedThroughput(1L, 1L);
    CreateTableRequest ctr = mapper.generateCreateTableRequest(tableClass);
    ctr.withProvisionedThroughput(new ProvisionedThroughput(1L, 1L));

    // Provision throughput and configure projection for secondary indices.
    if (ctr.getGlobalSecondaryIndexes() != null) {
        for (GlobalSecondaryIndex idx : ctr.getGlobalSecondaryIndexes()) {
            if (idx != null) {
                idx.withProvisionedThroughput(pt).withProjection(new Projection().withProjectionType("ALL"));
            }
        }
    }

    TableUtils.createTableIfNotExists(client, ctr);
}

删除表的Java方法:

private static void deleteTable(String tableName) {
    AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
    DynamoDB dynamoDB = new DynamoDB(client);
    Table table = dynamoDB.getTable(tableName);
    try {
        System.out.println("Issuing DeleteTable request for " + tableName);
        table.delete();
        System.out.println("Waiting for " + tableName + " to be deleted...this may take a while...");
        table.waitForDelete();

    }
    catch (Exception e) {
        System.err.println("DeleteTable request failed for " + tableName);
        System.err.println(e.getMessage());
    }
}

我将扫描整个表并将所有内容放入List中,然后映射到该列表,将对象转换为新类型,然后创建一个具有不同名称的新表,推送所有您的新对象,然后在将旧表的任何引用切换到新表后删除旧表。不幸的是,这确实意味着消耗表的所有内容都需要能够在两个临时表之间切换。