亚马逊AWS官方博客

使用 Dynamodump 简化 Amazon DynamoDB 跨账号迁移

Amazon DynamoDB 是亚马逊云科技提供的全托管 NoSQL 数据库服务,提供快速且可预测性能,能够实现无缝扩展。全球上万 AWS 的客户使用 Amazon DynamoDB 来承载他们的关节业务负载。在某些情况下,比如公司之间的收购或者为了满足合规要求,客户需要将在一个账户下面的多个 Amazon DynamoDB 的表格搬迁到另外一个账户。

在另一篇“如何将 Amazon DynamoDB 表从一个 AWS 账户迁移到另一 AWS 账户?”的博客中提到了使用 AWS Backup,Amazon DynamoDB 出导入,Amazon Glue 和 Amazon EMR 等几种方式。但是使用这些方式都要满足同一个前提:在目标账号下的 Amazon DynamoDB 里面手动创建目标表格和元数据,然后才能使用博客里面提到的工具将数据导入。当客户有成百上千张表格需要搬迁的时候,手动创建目标表格不但费时费力,还容易出现错误。如果源表里面还有二级索引,将会给搬迁造成更大的困难。

Dynamodump 是由 Benny Chew 和其他贡献者开发的一款开源工具。截止本文发表,这个工具的源代码还在持续更新和维护。本文将演示如何使用这个工具将 Amazon DynamoDB 表格的元数据(attributes/secondary index)轻松搬迁。

1. 先决条件

  • 两个不同账号(一个源账号,一个目标账号)下拥有 AmazonDynamoDBFullAccess 权限[1]的 IAM 用户和访问密钥。在以下的范例中,我们将使用 xxxx-xxxx-3710 这个账号作为源账号,使用 xxxx-xxxx-6589 这个账号作为目标账号。
  • 源账号下的 Amazon DynamoDB 的表和数据。在这个范例中,我在源账号中有 3 张 Amazon DynamoDB 的表:demo1 的表使用分区键作为主键;demo2 的表使用分区键和排序键作为主键,并且设置了全局二级索引;demo3 使用分区键和排序键作为主键,并且设置了本地二级索引。



  • 一台可以远程登录的 EC2 虚机。这台 EC2 必须可以通过互联网或者终端节点访问两个不同账号下的 DynamoDB 服务。

2. 安装 Dynamodump 工具

在 EC2 运行 pip install dynamodump 命令,通过 PyPI 来安装 dynamodump 工具。确认安装版本是 1.8.0 或以上,并在安装成功后运行 dynamodump -h 来确认 dynamodump 的命令可以使用。请阅读帮助信息来了解命令和参数的使用方式。

这个工具也发布了 Docker 版本,详情请参考 Github 项目的说明。

3. 配置源账号 IAM 用户凭据

Dynamodump 工具是使用 AWS SDK for Python(boto3)开发的,所以它支持标准的 AWS 凭据提供商链来查找 IAM 用户凭据。你也可以通过使用命令行参数的方式来指定工具运行时所使用的 IAM 用户凭据。在这个范例中,我是通过配置操作系统的环境变量来提供源账号的 IAM 用户凭据。

4. 在源账户中备份 DynamoDB 表

使用源账号的 IAM 用户运行 dynamodump -m backup -r ap-southeast-1 -s "*" 来备份源账号下在 ap-southeast-1 这个区域所有 DynamoDB 的表。你也可以通过使用命令行参数来指定符合前缀,标签或者名字的表格进行有选择性的备份。详细使用方式可以参考帮助信息。

默认情况下,工具会将表格的元数据和数据备份到名为 dump 的子文目录下,你也可以使用命令行参数,比如 --schemaOnly--dataOnly—dumpPath,来选择只备份元数据或者数据以及备份的目录。

5. 配置目标账号 IAM 用户凭据

在还原源表和数据之前,先要把环境变量中的用户凭证改为目标账号的 IAM 用户凭证。

6. 在目标账号下还原表格元数据

在这个范例中,你可以看到我在目标账号下 ap-northeast-1 地区的 DynamoDB 里面没有任何表。

运行 dynamodump -m restore -r ap-northeast-1 -s "*" –schemaOnly 将本地 dump 目录下的备份的 DynamoDB 表的元数据还原到目标账号。


7. 在目标账号下还原数据

工具的局限性

  • Dynamodump 工具目前还不支持将源表的读/写容量配置还原。默认情况下,目标账号的新表读/写容量会被预制为 25。你可以通过使用--readCapacity--writeCapacity 参数来更改预制的容量,或者使用 --billingMode PAY_PER_REQUEST 参数将预制容量改成按需容量模式。
  • 使用 --billingMode PAY_PER_REQUEST 按需容量模式的时候,不支持配置了全局二级索引的表。如果遇到此类问题,需要先使用默认的预制容量,还原后手动改为按需容量模式。

截止本文发布,以上局限性还存在于 dynamodump 的最新版本 1.8.0 中。后续版本发布可能会进行改进。

[1] 在实际生产环境中,建议根据需要的资源创建更严格的权限策略。

本篇作者

谭继聪

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,并专注于数据库和数据分析技术方向。

黄家曦

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云计算方案咨询和设计。曾就职于思科、中国电信,在网络以及运营商骨干网有丰富经验,热衷于大数据领域,熟悉 EMR、Kinesis、Athena、Glue 等数据分析服务与方案设计。