无需S3,跨AWS账户直接迁移DynamoDB表数据项
跨AWS账户直接迁移DynamoDB表数据(跳过S3)
以下是几种无需依赖S3的直接跨账户DynamoDB数据迁移方案:
方案一:Lambda + DynamoDB Streams(支持全量+增量同步)
- 前置准备:
- 在X-Account的A-DynamoDB表开启DynamoDB Streams,选择
NEW_AND_OLD_IMAGES或ALL_IMAGES捕获模式 - 在Y-Account创建与源表结构完全一致的同名DynamoDB表(主键、GSI/LSI、读写模式需匹配)
- 在X-Account的A-DynamoDB表开启DynamoDB Streams,选择
- 权限配置:
- 为X-Account的Lambda执行角色添加权限,允许读取源DynamoDB表及其流数据
- 在Y-Account的目标表添加IAM策略,授权X-Account的Lambda角色执行写入操作
- 实现步骤:
- 编写Lambda函数,分两个阶段处理:
- 全量迁移:调用
scanAPI分页遍历源表数据,通过batch_write_item批量写入目标表(注意控制每次批量写入的条目数,避免触发吞吐量限制) - 增量同步:监听DynamoDB Streams事件,捕获源表的数据新增、修改、删除操作,同步到目标表
- 全量迁移:调用
- 全量迁移可手动触发或通过CloudWatch Events定时触发,增量同步由Streams自动触发Lambda
- 编写Lambda函数,分两个阶段处理:
方案二:AWS Glue 直接跨账户读写
- 前置准备:确认两个账户的Glue服务可跨账户访问,目标表结构与源表一致
- 权限配置:
- 给Glue作业执行角色添加权限,允许读取X-Account的源DynamoDB表,同时写入Y-Account的目标表
- 实现步骤:
- 创建Glue作业,选择Python或Scala作为脚本语言
- 在作业脚本中直接通过Glue的DynamoDB连接器读取源表数据,无需中转S3,直接写入目标表
- 运行作业完成全量迁移;若需增量同步,可结合Glue触发器与DynamoDB Streams实现
方案三:自定义SDK脚本(基于boto3等)
- 前置准备:配置可跨账户访问的IAM角色,确保该角色拥有源表读权限和目标表写权限
- 实现步骤:
- 用Python的boto3库编写迁移脚本:
- 通过
scanAPI分页遍历源表,处理LastEvaluatedKey实现全量数据读取 - 调用
batch_write_item批量写入目标表,针对UnprocessedItems添加重试逻辑,避免数据丢失 - 加入速率控制逻辑(如
time.sleep()),防止触发DynamoDB的吞吐量限流
- 通过
- 在本地或EC2实例上运行脚本完成迁移;后续增量同步可定时运行脚本或结合Streams处理
- 用Python的boto3库编写迁移脚本:
关键注意事项
- 权限核心:所有迁移执行实体(Lambda角色、Glue角色、SDK角色)必须同时拥有跨账户的读写权限,需严格配置IAM策略和信任关系
- 吞吐量控制:迁移期间可临时将源表和目标表切换为按需模式,或提高预留吞吐量,避免因限流拖慢迁移速度,完成后再调回原配置
- 数据一致性:全量迁移过程中若源表有数据变更,需结合DynamoDB Streams处理增量,保证最终数据一致
- 错误处理:迁移脚本需记录失败条目,便于后续手动重试,避免数据丢失
内容的提问来源于stack exchange,提问作者Mikias Hundie
相关产品推荐
相关产品推荐

