3
在開發過程中結構和要求發生變化。密鑰和索引設置需要更改,這可能會破壞增量表更新。所以我的解決方案到目前爲止是刪除表並從cloudformation堆棧重新創建它。如何遷移主要表更改的dynamodb數據?
但是如何用生產部署來解決這個問題?是否有可能如下自動化dynamodb部署?
- 創建新表從舊錶
- 將數據遷移到新表
- 刪除舊錶
在開發過程中結構和要求發生變化。密鑰和索引設置需要更改,這可能會破壞增量表更新。所以我的解決方案到目前爲止是刪除表並從cloudformation堆棧重新創建它。如何遷移主要表更改的dynamodb數據?
但是如何用生產部署來解決這個問題?是否有可能如下自動化dynamodb部署?
是的,這是完全有可能實現自動化這樣的部署結構。只要您有創建表的代碼,從舊錶中獲取所有數據,更改數據,然後將其全部上傳到新表,而不會在正常時間內丟失,這應該相當簡單。如果你寫什麼語言你想做這樣的事情,我可以幫助更多。
我已經完成了這項工作,我已經在下面添加了一個關於如何在Java中執行此操作的小型代碼示例。
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,然後通過該列表進行映射,將對象轉換爲新的類型,然後創建一個新類型的表,但名稱不同,將所有新對象推入,然後刪除舊錶切換您對舊錶格的任何引用到新的一個。不幸的是,這意味着消耗桌子的所有東西都需要能夠在兩個登臺桌面之間切換。
我正在使用JavaScript端點,並且有興趣深入探究此主題。這不應該是爲它提供的通用AWS解決方案的常見問題嗎? – nenTi
我不認爲有關於如何做到這一點的任何AWS文檔(特別是在JavaScript中),但我會研究它,並儘快找到你。 –