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

3 分钟阅读
0

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

简短描述

从下面选出适合您使用案例的方法,将 DynamoDB 表迁移到其他 AWS 账户:

  • AWS Backup
  • DynamoDB 导入和导出到 Amazon Simple Storage Service(Amazon S3)
  • Amazon S3 和 AWS Glue
  • Amazon EMR

解决方法

AWS Backup

您可以使用 AWS Backup 创建跨账户 DynamoDB 备份。有关更多信息,请参阅 Creating backup copies across AWS accountsAWS Backup demo: Cross-account & cross-Region backup

在目标账户中,执行以下操作:

  1. 在 DynamoDB 所在区域的目标账户中创建 AWS Backup 保管库。
  2. 创建保管库时,请使用已配置的 AWS Key Management Service(AWS KMS)密钥。这是您已与同一组织中的源账户共享的密钥。
  3. 创建保管库后,向该保管库添加 AWS Identity and Access Management(AWS IAM)策略。您可以通过选择允许从组织访问备份保管库选项来实现。这样一来,同一组织内的其他账户即可复制到保管库中。

在源账户中,执行以下操作:

  1. 在 DynamoDB 所在的源账户中,在需要迁移表数据的区域中创建 AWS Backup 保管库。
  2. 创建保管库时,请使用已配置的 AWS KMS 密钥。这是您与组织中其他账户共享的密钥。
  3. 向保管库中添加 IAM 策略,允许组织中的其他账户复制到保管库中。可以通过选择允许从组织访问备份保管库选项来完成此操作。
  4. 创建备份计划,将源账户中 DynamoDB 表的备份生成到目标账户。
  5. 对于备份保管库,请务必选择您在源账户中创建的保管库。
  6. 然后,选择复制到其他账户的保管库选项。
  7. 对于分配资源,请务必包括您必须备份的资源。您可以选择包括特定的资源类型
  8. 对于选择特定的资源类型,选择 DynamoDB。您可以选择所有表,也可以只选择必须备份的表。

在目标账户中,执行以下操作:

  1. 在目标账户中,导航到您创建的保管库。
    可以看到恢复点与源账户中的恢复点相同。
  2. 可以在目标账户中还原 DynamoDB 表

**注意:**对于这种方法,源账户和目标账户必须位于同一个组织中。

DynamoDB 导入和导出到 Amazon S3

  1. 将表导出到目标账户中的 Amazon S3 存储桶,即可迁移 DynamoDB 表数据。确保 DynamoDB 具有对此 Amazon S3 存储桶的 s3:ListBucket 权限。确保 S3 存储桶没有任何拒绝访问导出数据的访问控制列表。
  2. 导出完成后,将 Amazon S3 存储桶中的数据导入目标账户中的新表。有关更多信息,请参阅 DynamoDB data import from Amazon S3: how it works

**注意:**导出表不会消耗表上的任何读取容量,也不会影响表的性能或可用性。此外,导入表也不会消耗任何写入容量。因此,在导入过程中不需要额外容量。

Amazon S3 和 AWS Glue

可以使用 S3 存储桶和 AWS Glue 任务将 DynamoDB 表迁移到其他 AWS 账户。

1.    将表导出到另一个账户中的 Amazon S3 存储桶,即可执行 DynamoDB 表的初始迁移。

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

2.    使用 Glue 任务从 S3 存储桶读取文件并将其写入目标 DynamoDB 表。

按照步骤 1 所述将数据导出到目标账户中的 S3 存储桶后,请在目标账户中执行以下操作:

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

使用 AWS Glue Studio 创建 ETL 任务。指定源、转换和目标后,AWS Glue Studio 会根据这些输入自动生成 PySpark 代码。对于此任务,请将 AWS Glue Data Catalog 表指定为源,将 ApplyMApplyMapping 指定为转换。不要指定目标。AWS Glue Studio 生成 PySpark 代码来从 Amazon 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.    将表导出到 S3 存储桶后,使用 DynamoDB Streams 和 AWS Lambda 将数据插入和更新从源表迁移到另一个账户中的目标表。有关更多信息,请参阅 Cross-account replication with Amazon DynamoDB

AWS Glue

AWS Glue ETL 任务支持从另一个账户的 DynamoDB 表读取数据以及将数据写入另一个账户的 DynamoDB 表。使用 dynamodb.sts.roleArn 参数在任务脚本中代入跨账户角色。代入此角色可让您获取跨账户存取 DynamoDB 时必须使用的临时凭证。有关更多信息,请参阅 Cross-account cross-Region access to DynamoDB tablesHow to export an Amazon DynamoDB table to Amazon S3 using AWS Step Functions and AWS Glue

Amazon EMR

使用 Amazon EMR 迁移 DynamoDB 表时,请根据使用案例使用以下选项之一:

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

**注意:**使用 Amazon EMR 迁移表所需的时间可能会有很大差异。这一差异取决于 DynamoDB 表的预置吞吐量、网络性能和表中存储的数据量。

要使用 Amazon EMR 迁移 DynamoDB 表,请执行以下操作:

  1. 在源账户和目标账户中启动 EMR 集群。在软件配置部分,请务必选择包含 Apache Hive 的选项。注意: 在私有子网中启动 Amazon EMR 集群是一种安全最佳实践。私有子网必须具有 Amazon S3 VPC 端点和通往 DynamoDB 的路由。有关更多信息,请参阅私有子网。如果集群必须访问互联网,则应使用位于公有子网中的 NAT 网关。有关更多信息,请参阅 VPC with public and private subnets (NAT)
  2. 确保两个账户中的 EMR_EC2_DefaultRole IAM 角色都有写入目标账户中的 S3 存储桶的权限。有关更多信息,请参阅为 Amazon EMR 配置 IAM 服务角色对 AWS 服务和资源的权限
  3. 在源帐户中,使用 SSH 连接到主节点。
  4. 在源账户中,使用 Hive 命令将 DynamoDB 表数据导出到目标账户中的 S3 存储桶。
  5. 在目标账户中,将 Amazon S3 数据导入到新的 DynamoDB 表
  6. 如果使用暂存表来捕获迁移期间发生的写入操作,请针对暂存表重复步骤 4 和 5。

相关信息

Copying data between DynamoDB and Amazon S3

AWS 官方
AWS 官方已更新 10 个月前