一般在公司运营中不涉及公司主体变更或者跟换云服务厂商的事情,一般都不会对静态资源服务做迁移,不巧我就遇到了前者,21年公司被收购其中一个尾巴工作,近期才算是处理干净,对运营了9年+公司(2015年创)的 AWS S3 中静态资源作迁移,光想想就很刺激,这里记录一下事情处理经过。

任务目标

为了确保整个流程丝滑(用户无感知)不影响用户体验,又需要保证数据不丢失,需要先完成增量数据的自动复制,资源上传至 A 账户 S3 存储桶后,自动复制到 B 账号的 S3 存储桶,等待将 A 账号 S3 存储桶下所有资源全量的迁移完成后,再将上传入口切换到新存储桶。

快速梳理一下任务目标

  1. 配置 AWS A 账号 S3 的存储桶完成,自动复制到 B 账号 S3 的存储桶
  2. 使用 AWS CLI 将 AWS A 账号下 S3 中的资源转移至 AWS B 账号下 S3
  3. 配置 AWS B 账户下 S3 新 CDN 加速,承载静态新流量的加速服务
  4. 切换静态资源上传阀门至 B 账号下 S3,并切换全站 CDN 加速地址为 B 账号的 CDN

通过查询了解到 AWS 提供 AWS CLI 工具,可以将一个账号下桶资源同步至另外一个账户,如何做到再 AWS CLI 工具同步的同时,新上传的至 AWS A 账号的资源也会自动同步至 AWS B 账号,以保资源不丢失,可以参考这个S3 Batch Replication 将一个 S3 存储桶的内容自动复制到另一个 S3 存储桶,无需任何手动干预,源存储桶和目标存储桶可以位于相同 AWS 账户 或不同区域中。

这里我们主要是记录使用 AWS CLI 完成一次性迁移任务。

配置步骤

配置前需要具备两个AWS 账号的权限,详细参考官方文档

s3 to s3

默认生成的临时凭证的过期时间为1h,再执行大量同步数据时是不够的,需要再 B账号更改会话时间,最长支持12h设定,通过参数 duration-seconds 代入,即可生成12h的临时凭证。

1
2
3
4
aws sts assume-role \
--role-arn "arn:aws:iam::<destination_account>:role/S3MigrationRole" \
--role-session-name AWSCLI-Session \
--duration-seconds 43200
1
aws s3 sync s3://source_bucket_name   s3://destination_bucket_name
  • source_bucket_name 源存储桶,即在账户 A 中创建的 S3 存储桶名称
  • destination_bucket_name 目标存储桶,即在账户 B 中创建的 S3 存储桶名称

注意事项

  • AWS CLI 提供的是迁移工具,但是迁移中产生的流量和请求次数是收费的,本次迁移费用41$,以下是我们的 AWS 迁移大约400万次的 Request
  • AWS s3 sync 命令迁移中中断后,有自动检查能力,但检查会消耗一定时间,如果文件太多,一次同步预计会超会话时间,建议指定文件夹迁移,多开两个进程窗口处理

迁移前费用 s3 sync before

迁移后费用

s3 sync after

最后迁移后的数据超过 2T