在 DynamoDB 中将一个表相同地复制到一个新表的最佳方法是什么?
(我不担心原子性)。
创建备份(备份选项)并使用新表名恢复表。这会将所有数据放入新表中。注意:根据表的大小需要相当长的时间
我只是使用了 python 脚本dynamodb-copy-table,确保我的凭据位于某些环境变量(AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
)中,并且它完美地工作。它甚至为我创建了目标表。
python dynamodb-copy-table.py src_table dst_table
默认区域是,使用env 变量us-west-2
更改它。AWS_DEFAULT_REGION
AWS Pipeline 提供了一个可用于此目的的模板:“CrossRegion DynamoDB Copy”
请参阅:http ://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-crossregion-ddb-create.html
结果是一个简单的管道,如下所示:
尽管它称为 CrossRegion,但只要目标表名称不同,您就可以轻松地将其用于同一区域(请记住,每个帐户和区域的表名称都是唯一的)
这是一种将所有项目从一个表复制到另一个表的解决方案,只需使用 shell 脚本、AWS CLI和jq。适用于小桌子。
# exit on error
set -eo pipefail
# tables
TABLE_FROM=<table>
TABLE_TO=<table>
# read
aws dynamodb scan \
--table-name "$TABLE_FROM" \
--output json \
| jq "{ \"$TABLE_TO\": [ .Items[] | { PutRequest: { Item: . } } ] }" \
> "$TABLE_TO-payload.json"
# write
aws dynamodb batch-write-item --request-items file://"$TABLE_TO-payload.json"
# clean up
rm "$TABLE_TO-payload.json"
如果两个表相同,则需要先删除 TABLE_TO 中的所有项目。
2017 年 11 月 29 日,引入了全局表。根据您的用例,这可能很有用,这可能与原始问题不同。以下是博客文章中的一些片段:
全局表– 您现在可以创建跨两个或多个 AWS 区域自动复制的表,完全支持多主写入,只需单击几下。这使您能够为全球用户群构建快速、大规模扩展的应用程序,而无需管理复制过程。
...
您无需对现有代码进行任何更改。您只需将写入请求和最终一致的读取请求发送到任何指定区域中的 DynamoDB 终端节点(与强一致性读取关联的写入应该共享一个公共终端节点)。在幕后,DynamoDB 实现了多主写入,并确保对特定项目的最后一次写入占上风。当您使用全局表时,每个项目都将包含一个时间戳属性,该属性表示最近一次写入的时间。更新通过 DynamoDB Streams 异步传播到其他区域,通常在一秒钟内完成(您可以使用新的ReplicationLatency和PendingReplicationCount指标进行跟踪)。
正如之前的回复中提到的,Data Pipeline 模板不再存在。
在这个线程中尝试了其他几个提议后,我最终编写了一个 NodeJS 脚本来移动数据。也许这对你有用?如果你想尝试,我在我的博客上记录了我的方法。
使用这个节点 js 模块:copy-dynamodb-table