如何将我的 DynamoDB 表从一个 AWS 账户迁移到另一个账户?

上次更新日期:2022 年 5 月 17 日

我想执行跨账户 Amazon DynamoDB 表迁移。

简短描述

您可以通过以下操作将 DynamoDB 表迁移到其他 AWS 账户:

  1. 将 DynamoDB 表数据导出到其他账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶中。
  2. 使用 AWS Glue 任务导入数据。
  3. 使用 AWS Glue ETL 任务从您的 DynamoDB 表中读取数据,然后将数据写入另一个账户的 DynamoDB 表。
    注意:AWS Glue ETL 任务支持跨区域和跨账户访问 DynamoDB 表。

您还可以使用 AWS Data Pipeline 或 Amazon EMR 将 DynamoDB 表移动到另一个 AWS 账户。Data Pipeline 是移动表格的最简单方法,但提供的自定义选项较少。对于拥有更高的技术专业知识并希望更好地控制流程的用户,Amazon EMR 是更好的选择。

解决方法

Amazon S3 和 AWS Glue

您可以使用 S3 存储桶和 AWS Glue 任务将 DynamoDB 表迁移到不同的 AWS 账户。

1.    您可以将表导出到其他账户中的 Amazon S3 存储桶,从而执行 DynamoDB 表的初始迁移。有关更多信息,请参阅将 DynamoDB 表数据导出到 Amazon S3

当您将表从账户 A 导出到账户 B 中的 S3 存储桶时,这些对象仍归账户 A 所有。默认情况下,账户 B 中的 AWS Identify Access Management (IAM) 用户将无权访问这些对象。导出功能不会在写入数据时附加 bucket-owner-full-control 访问控制列表 (ACL)。要解决此对象所有权问题,请在导出完成后为所有导出的对象添加 PutObjectAcl 权限。此解决方法会向账户 B 中的存储桶拥有者赋予对所有导出对象的访问权限。有关更多信息,请参阅为何我无法访问由另一个 AWS 账户上载到我的 Amazon S3 存储桶的对象?

2.    使用 Glue 任务从 S3 存储桶读取文件并将其写入目标 DynamoDB 表。按照步骤 1 所述将数据导出到目标账户中的 S3 存储桶后,请在目标账户中执行以下操作:

在 Amazon S3 中的数据上运行 AWS Glue 爬网程序。爬网程序推断架构并使用该架构定义创建一个 AWS Glue 数据目录表。

使用 AWS Glue Studio 创建 ETL 任务。指定源、转换和目标后,AWS Glue Studio 会根据这些输入自动生成 PySpark 代码。对于此任务,请将 AWS Glue 数据目录表指定为源,将 ApplyMapping 指定为转换。不要指定目标。AWS Glue Studio 生成 PySpark 代码来从 S3 创建 DynamicFrame。

请确保 AWS Glue Studio 所生成代码的密钥名称和数据类型映射正确。如果映射不正确,则修改代码并更正映射。由于您在创建 AWS Glue 任务时未指定目标,因此请添加一个与本示例中的以下内容类似的接收器操作。添加此操作可使任务直接写入目标 DynamoDB 表:

glueContext.write_dynamic_frame_from_options ( frame = Mapped, connection_type = "dynamodb", connection_options = { "dynamodb.region": "", "dynamodb.output.tableName": "", "dynamodb.throughput.write.percent": "1.0" } )

要将数据加载到目标表,请从 AWS Glue Studio 或 AWS Glue 控制台上的任务页面运行任务。

3.    将表导出到 Amazon S3 存储桶后,使用 DynamoDB 流和 AWS Lambda 将源表中的数据插入和更新迁移到另一个账户中的目标表。有关更多信息,请参阅使用 Amazon DynamoDB 进行跨账户复制

使用 AWS Glue 跨账户访问 DynamoDB 表

AWS Glue ETL 任务支持从另一个账户的 DynamoDB 表读取数据以及将数据写入另一个账户的 DynamoDB 表。使用 dynamodb.sts.roleArn 参数在任务脚本中代入跨账户角色。代入此角色可让您获取跨账户访问 DynamoDB 时必须使用的临时凭证。有关更多信息,请参阅跨账户跨区域访问 DynamoDB 表

Data Pipeline

要使用 Data Pipeline 将 DynamoDB 表移动到其他账户,请参阅如何使用 Data Pipeline 将 DynamoDB 表备份到位于不同账户中的 S3 存储桶?

注意:目标账户无法访问 S3 存储桶中的 DynamoDB 数据。要使用这些数据,请将其还原到 DynamoDB 表。

Amazon EMR

当您使用 Amazon EMR 迁移 DynamoDB 表时,有两个选项可用,具体取决于您的使用案例:

  • 如果您可以承受迁移过程中的停机时间,请停止对源表的写入操作,以确保目标表与源表保持同步。
  • 如果无法承受停机时间,则必须将迁移期间发生的所有事务存储在暂存表中。在将原始表迁移到其他 AWS 账户后,可将新交易从暂存表推送到目标表。

注意:使用 Amazon EMR 迁移表所需的时间可能会有很大差异,具体取决于网络性能、DynamoDB 表的预配置吞吐量、表中存储的数据量以及其他因素。

使用 Amazon EMR 迁移 DynamoDB 表:

  1. 在源账户和目标账户中启动 EMR 集群。在 Software configuration(软件配置)部分中,确保您选择了包含 Apache Hive 的选项。
    注意:为确保安全性,最佳实践是在私有子网中启动 Amazon EMR 集群。私有子网必须具有 Amazon S3 VPC 终端节点和指向 DynamoDB 的路由。有关更多信息,请参阅私有子网。如果集群需要访问互联网,则请使用位于公有子网中的 NAT 网关。有关更多信息,请参阅带有公有子网和私有子网 (NAT) 的 VPC
  2. 确保两个账户中的 EMR_EC2_DefaultRole IAM 角色都有写入目标账户中的 S3 存储桶的权限。有关更多信息,请参阅为 IAM 服务角色配置访问 AWS 服务和资源所需的 Amazon EMR 权限
  3. 在源账户中,使用 SSH 连接到主节点
  4. 在源账户中,使用 Hive 命令将 DynamoDB 表数据导出到目标账户中的 S3 存储桶。
  5. 在目标账户中,将 Amazon S3 数据导入到新 DynamoDB 表
  6. 如果您使用暂存表捕获在迁移过程中发生的写入,请在暂存表上重复步骤 4 和 5。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?