跨账户S3数据迁移求助:无权限改策略,拥有EC2及自有S3桶
分步指导:无权限修改策略下的S3跨账户数据迁移
没问题,我来给你一步步拆解这个迁移方案——既然你没法修改任何桶或IAM策略,那咱们就完全基于手里的凭证和EC2实例来做,全程不需要调整任何策略配置,直接用AWS CLI的同步功能搞定。
步骤1:在EC2上配置双账户凭证
你需要同时访问客户的S3桶和自己的桶,所以得在EC2上存两套合法凭证:
- 先登录到你的EC2实例(用SSH或者AWS Session Manager都行)
- 在当前用户的主目录下创建
.aws文件夹(如果还没有的话):mkdir -p ~/.aws - 创建
credentials文件,把两个账户的凭证分别放进去:
保存文件后,一定要修改权限防止其他人读取:[customer-s3] aws_access_key_id = 客户给的Access Key aws_secret_access_key = 客户给的Secret Key [my-s3] aws_access_key_id = 你自己的Access Key aws_secret_access_key = 你自己的Secret Keychmod 600 ~/.aws/credentials
步骤2:先验证两边的访问权限
别着急直接迁移,先确认凭证能正常访问两个桶:
- 测试客户的桶:
aws s3 ls s3://客户的桶名 --profile customer-s3 - 测试自己的桶:
aws s3 ls s3://你的桶名 --profile my-s3
如果都能列出桶里的文件,说明凭证没问题;要是报错,先检查凭证是否输错,或者客户给的凭证有没有至少s3:ListBucket和s3:GetObject权限(毕竟你没法改策略,客户必须给你这两个权限才能拉数据)。
步骤3:用s3 sync批量迁移数据
这是最省心的方法,AWS CLI的sync命令会自动增量同步,只传新的或改了的文件,还能保留元数据:
aws s3 sync s3://客户的桶名 s3://你的桶名 --source-profile customer-s3 --profile my-s3
--source-profile指定用客户的凭证访问源桶--profile指定用你自己的凭证访问目标桶
要是数据量很大?后台运行不中断
如果要迁移的文件特别多,别直接在SSH窗口跑,用nohup让它在后台运行,就算SSH断了也不影响:
nohup aws s3 sync s3://客户的桶名 s3://你的桶名 --source-profile customer-s3 --profile my-s3 > sync_log.txt 2>&1 &
之后想看进度的话,直接看日志:
tail -f sync_log.txt
步骤4:核对迁移结果
迁移完一定要验证,避免漏文件:
- 统计客户桶的文件数和总大小:
# 文件数 aws s3 ls s3://客户的桶名 --recursive --profile customer-s3 | wc -l # 总大小(GB) aws s3 ls s3://客户的桶名 --recursive --profile customer-s3 | awk '{sum += $3} END {print sum/1024/1024/1024 " GB"}' - 再统计你自己桶的对应数值:
aws s3 ls s3://你的桶名 --recursive --profile my-s3 | wc -l aws s3 ls s3://你的桶名 --recursive --profile my-s3 | awk '{sum += $3} END {print sum/1024/1024/1024 " GB"}'
两边数值一致,就说明迁移成功了。
几个关键注意点
- 安全第一:EC2上的凭证文件要管好,迁移完最好删掉客户的凭证段,或者直接删除
.aws/credentials文件,别留隐患。 - 提速技巧:如果EC2和客户的S3桶不在同一个区域,尽量换个同区域的EC2实例,跨区域传输速度会快很多;要是客户的桶开了Transfer Acceleration也可以用,但这个需要客户那边配置,你没法改的话就忽略。
- 加密文件处理:如果客户桶里有SSE-KMS加密的文件,那客户给的凭证必须有对应KMS密钥的解密权限,否则你拉不了这些文件,得让客户确认一下权限。
内容的提问来源于stack exchange,提问作者Raghunandan Sk
相关产品推荐
相关产品推荐

