如何将远程DynamoDB表数据同步到本地Amplify实例
方案可行性结论
这个需求完全可以实现,你之前的判断没错:Amplify DataSync是面向前端客户端的实时同步能力,不适用全量存量数据的离线迁移场景。Amplify+DynamoDB栈有和MongoDB、PostgreSQL完全对等的dump/restore操作流,全程通过命令行即可完成,不需要依赖额外付费服务。
具体操作流程
整个流程逻辑和你熟悉的数据库导出导入完全一致:先拉取云端全量数据生成dump文件,再写入本地Amplify mock托管的DynamoDB实例即可。
- 提前确认本地环境参数
本地执行amplify mock api启动模拟环境后,Amplify会自动在本地启动DynamoDB模拟实例,默认端点为http://localhost:62224,区域固定为us-fake-1,鉴权参数填任意非空值即可通过校验,不需要真实AWS密钥。启动后可以在控制台输出的日志里确认端点是否正确。 - 导出staging环境全量数据
配置好拥有staging环境DynamoDB读权限的AWS CLI凭证后,先拉取环境下所有DynamoDB表名:aws dynamodb list-tables --region <staging环境所在AWS区域> --query 'TableNames' --output text
针对每张表执行扫描导出,生成JSON格式的dump文件存到本地目录:aws dynamodb scan --table-name <目标表名> --region <staging环境所在AWS区域> --page-size 1000 --output json > ./dynamo-dump/<目标表名>.json
小提示:单表数据量在10GB以内用scan导出足够稳定,如果单表数据量更大,可以用DynamoDB原生的S3导出能力先导出全量快照到S3再下载到本地,速度比逐页扫描更快。 - 导入数据到本地Amplify实例
确保Amplify mock已经根据你的GraphQL Schema自动创建了和云端同名的空表后,把之前导出的dump文件做简单格式转换(把scan返回结果里的Items数组封装成batch-write要求的PutRequest结构),再执行批量写入命令即可:aws dynamodb batch-write-item --request-items file://./dynamo-dump/<目标表名>-converted.json --endpoint-url http://localhost:62224 --region us-fake-1 --aws-access-key-id fake --aws-secret-access-key fake
如果不想手动写格式转换脚本,直接用开源的DynamoDB批量导入导出小工具遍历所有dump文件自动完成格式转换和写入即可,不需要逐表手动执行命令。
注意事项
- 本地DynamoDB的所有数据会持久化存储在项目根目录的
.amplify/mock-data/dynamodb路径下,只要不手动删除这个目录、不执行amplify mock --clean清空模拟数据,下次启动mock不需要重复导入数据。 - 不要尝试用AppSync接口做全量数据拉取,会碰到API限流、权限校验、嵌套关联数据拉取不全的问题,直接走DynamoDB原生的导出导入路径是最稳定的。
- 如果你的表配置了GSI/LSI,Amplify mock会在启动时自动创建对应的索引,导入数据后索引会自动生效,不需要额外手动配置。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

