Amazon dynamodb 如何在主表更改时迁移dynamodb数据?

Amazon dynamodb 如何在主表更改时迁移dynamodb数据?,amazon-dynamodb,amazon-cloudformation,serverless-framework,Amazon Dynamodb,Amazon Cloudformation,Serverless Framework,在开发过程中,结构和需求会发生变化。需要更改键和索引设置,这可能会中断增量表更新。到目前为止,我的解决方案是删除表并从cloudformation堆栈中重新创建它 但是如何通过生产部署来解决这个问题呢?是否可以按如下方式自动化dynamodb部署 创建新表 将数据从旧表迁移到新表 删除旧表 是的,完全可以自动化这样的部署结构。只要您有代码来创建一个表,那么从一个旧表中获取所有数据、更改数据,然后将所有数据上传到一个新表中,而不需要任何延迟,应该是相当简单的。如果你想用什么语言写这样的事情,我可以

在开发过程中,结构和需求会发生变化。需要更改键和索引设置,这可能会中断增量表更新。到目前为止,我的解决方案是删除表并从cloudformation堆栈中重新创建它

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

  • 创建新表
  • 将数据从旧表迁移到新表
  • 删除旧表

  • 是的,完全可以自动化这样的部署结构。只要您有代码来创建一个表,那么从一个旧表中获取所有数据、更改数据,然后将所有数据上传到一个新表中,而不需要任何延迟,应该是相当简单的。如果你想用什么语言写这样的事情,我可以帮你多一点

    我以前做过这件事,我在下面添加了一个小的通用代码示例,介绍如何在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());
        }
    }
    

    我会扫描整个表格,将所有内容放到一个列表中,然后映射到该列表中,将对象转换为新类型,然后创建一个该类型的新表格,但使用不同的名称,推送所有新对象,然后在将旧表的所有引用切换到新表后删除旧表。不幸的是,这意味着使用表的所有内容都需要能够在两个暂存表之间切换

    我正在使用javascript端点,并对深入研究这个主题感兴趣。这难道不是一个常见的问题吗?我不认为有任何AWS文档说明如何做到这一点(特别是javascript),但我会研究一下,并尝试尽快回复您。