有时候我们需要将aws的s3的一个bucket的数据迁移到另一个s3的bucket的,比如从亚洲迁移到美洲,从北美迁移南美之类,那么使用如下命令即可:
aws s3 cp --recursive s3://bucket-src/2021/ s3://bucket-dst/2021/
这里看起来像是linux上的目录拷贝,但实际是基于前缀匹配的递归拷贝。拷贝过程并不涉及将数据拷贝到执行命令的机器上,再拷贝到目标s3上,而是直接从源s3到了目标s3。
假如遇到更复杂的要求:
1. 只迁移某种类型的文件,比如.csv
2. 同时需要将.csv压缩成.csv.gz
操作命令如下:
day=2020/11/10
for i in `aws s3 ls s3://bucket-src/$day/ | grep -oE '[^ ]+.csv'`; do
aws s3 cp --content-encoding gzip s3://bucket-src/$day/$i - | gzip | aws s3 cp - s3://bucket-dst/$day/$i.gz
done
因为有压缩计算,所以必然有数据先到本地机器,再上传到目标s3的过程。节省带宽所以请求使用gzip,同时命令直接使用管道,所以本地不占磁盘空间。