从Digital Ocean Space迁移至Amazon AWS的技术问题求助
从Digital Ocean Spaces迁移到AWS S3的可行方案(适配36GB大规模图片)
我刚好处理过类似的跨云存储大规模迁移需求,给你几个实用的方案,覆盖从简单CLI工具到自定义脚本的场景,完美适配你数千张图片的迁移需求:
方案1:用rclone(最省心的跨存储同步工具)
rclone是专门针对云存储同步的工具,支持所有S3兼容存储(包括DO Spaces和AWS S3),操作简单且效率高,适合非编程用户。
步骤:
- 安装rclone:根据你的系统选择安装方式(比如Linux用
apt install rclone,macOS用brew install rclone,Windows直接下载安装包) - 配置远程存储:
- 运行
rclone config,选择n新建远程 - 先配置Digital Ocean Spaces:
- 类型选
S3,供应商选DigitalOcean - 输入你的DO Spaces Access Key和Secret Key
- 输入对应区域的endpoint(比如
nyc3.digitaloceanspaces.com,根据你的Space所在地调整) - 完成后命名为
do-space
- 类型选
- 再配置AWS S3:
- 同样选
S3,供应商选AWS - 可以选择用本地已有的AWS凭证(比如
~/.aws/credentials)或者直接输入Access Key和Secret Key - 完成后命名为
aws-s3
- 同样选
- 运行
- 开始同步:
运行同步命令,把DO Space的内容完整同步到AWS S3:rclone sync do-space:your-do-bucket-name aws-s3:your-aws-bucket-name --progress --transfers 32 --retries 5--progress:显示实时迁移进度,方便你跟踪状态--transfers:调整并发上传/下载数(默认是4,32适合大规模文件迁移,可根据你的网络带宽微调)--retries:设置失败重试次数,避免网络波动导致迁移中断
方案2:用s5cmd(针对S3兼容存储的高速批量工具)
s5cmd是比AWS CLI更快的批量操作工具,天生支持S3兼容API,适合需要极致迁移速度的场景。
步骤:
- 安装s5cmd:下载对应系统的二进制包(比如Linux用
curl -LO https://github.com/peak/s5cmd/releases/latest/download/s5cmd_$(uname -s)_$(uname -m).tar.gz,解压后即可使用) - 配置双端凭证:
- 创建一个
credentials.ini文件,同时包含DO和AWS的凭证:[default] aws_access_key_id = YOUR_DO_ACCESS_KEY aws_secret_access_key = YOUR_DO_SECRET_KEY [aws-profile] aws_access_key_id = YOUR_AWS_ACCESS_KEY aws_secret_access_key = YOUR_AWS_SECRET_KEY
- 创建一个
- 执行批量复制:
直接从DO Space复制到AWS S3,指定DO的endpoint和AWS凭证:s5cmd --endpoint-url https://nyc3.digitaloceanspaces.com --credentials-file ./credentials.ini cp s3://your-do-bucket-name/* s3://your-aws-bucket-name/ --profile aws-profile --numworkers 32 --retry 3--endpoint-url:指定DO Spaces的区域endpoint--profile aws-profile:使用配置文件里的AWS凭证--numworkers:设置并发处理的worker数,大幅提升批量文件迁移速度
方案3:Python自定义脚本(适合需要自定义逻辑的场景)
如果你需要对迁移过程做个性化处理(比如过滤特定尺寸的图片、修改文件名前缀等),可以用Python脚本实现——因为DO Spaces完全兼容S3 API,所以用boto3就能同时连接DO和AWS两端。
示例脚本(流式传输,无需本地存储):
import boto3 from botocore.config import Config from concurrent.futures import ThreadPoolExecutor # 配置Digital Ocean Spaces客户端 do_config = Config( region_name='nyc3', # 替换为你的Space区域 signature_version='s3v4', ) do_s3 = boto3.client( 's3', endpoint_url='https://nyc3.digitaloceanspaces.com', aws_access_key_id='YOUR_DO_ACCESS_KEY', aws_secret_access_key='YOUR_DO_SECRET_KEY', config=do_config ) # 配置AWS S3客户端(自动读取本地~/.aws/credentials,也可手动输入密钥) aws_s3 = boto3.client('s3') DO_BUCKET = 'your-do-bucket-name' AWS_BUCKET = 'your-aws-bucket-name' MAX_WORKERS = 16 # 并发数,根据机器性能调整 def transfer_single_object(key): try: # 从DO Space流式获取对象,无需下载到本地 do_obj = do_s3.get_object(Bucket=DO_BUCKET, Key=key) # 直接流式上传到AWS S3,保留原文件的Content-Type aws_s3.put_object( Bucket=AWS_BUCKET, Key=key, Body=do_obj['Body'], ContentType=do_obj['ContentType'] ) print(f✅ 成功迁移:{key}") except Exception as e: print(f❌ 迁移失败 {key}:{str(e)}") def main(): # 分页列出DO Space里的所有对象(避免一次性加载过多数据) paginator = do_s3.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=DO_BUCKET): if 'Contents' not in page: continue # 提取所有对象的Key object_keys = [obj['Key'] for obj in page['Contents']] # 用线程池并发处理,提升迁移效率 with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: executor.map(transfer_single_object, object_keys) if __name__ == "__main__": main()
迁移关键注意事项
- 先做小批量测试:先挑选10-20个文件测试迁移,确认权限、路径和文件完整性都没问题后再跑全量
- 权限验证:确保DO的Access Key拥有Space的读取权限,AWS的Access Key拥有S3桶的写入权限
- 断点续传支持:rclone和s5cmd都自带断点续传功能,如果迁移中途中断,重新运行命令即可继续未完成的部分
- 成本预估:DO的出口流量和AWS的入口流量可能产生费用,建议先查看双方的定价文档,提前预估成本
内容的提问来源于stack exchange,提问作者Marcelo Agimóvel
相关产品推荐
相关产品推荐

