如何重命名AWS S3 Bucket

在所有艰苦的迁移等工作之后,我才意识到我需要使用CNAME(例如media.abc.com)来提供内容。桶名需要以media.abc.com/S3/amazon.com开头,以确保它能够完美地工作。

我刚刚意识到S3不允许从控制台直接重命名。

有什么办法可以解决这个问题吗?

131273 次浏览

我认为唯一的方法是创建一个正确名称的新桶,然后将所有对象从旧桶复制到新桶。您可以使用Aws CLI来完成。

解决方案

aws s3 mb s3://[new-bucket]
aws s3 sync s3://[old-bucket] s3://[new-bucket]
aws s3 rb --force s3://[old-bucket]

解释

S3没有重命名存储桶功能,因为严格来说S3中没有文件夹,所以我们必须处理存储桶中的每个文件。

上面的代码将1。创建新桶2。复制文件和3。删除旧桶。就是这样。

如果您的存储桶中有很多文件,并且您担心成本,那么请继续阅读。在幕后发生的事情是首先复制桶中的所有文件,然后删除。如果您有几千个文件,那么它的成本应该是微不足道的。否则,检查这个答案,看看这将如何影响你。

例子

在下面的例子中,我们创建并填充旧桶,然后将文件同步到新桶。检查命令的输出,看看AWS是怎么做的。

> # bucket suffix so we keep it unique
> suffix="ieXiy2"  # used `pwgen -1 -6` to get this
>
> # populate old bucket
> echo "asdf" > asdf.txt
> echo "yxcv" > yxcv.txt
> aws s3 mb s3://old-bucket-$suffix
make_bucket: old-bucket-ieXiy2
> aws s3 cp asdf.txt s3://old-bucket-$suffix/asdf.txt
upload: ./asdf.txt to s3://old-bucket-ieXiy2/asdf.txt
> aws s3 cp yxcv.txt s3://old-bucket-$suffix/yxcv.txt
upload: ./yxcv.txt to s3://old-bucket-ieXiy2/yxcv.txt
>
> # "rename" to new bucket
> aws s3 mb s3://new-bucket-$suffix
make_bucket: new-bucket-ieXiy2
> aws s3 sync s3://old-bucket-$suffix s3://new-bucket-$suffix
copy: s3://old-bucket-ieXiy2/yxcv.txt to s3://new-bucket-ieXiy2/yxcv.txt
copy: s3://old-bucket-ieXiy2/asdf.txt to s3://new-bucket-ieXiy2/asdf.txt
> aws s3 rb --force s3://old-bucket-$suffix
delete: s3://old-bucket-ieXiy2/asdf.txt
delete: s3://old-bucket-ieXiy2/yxcv.txt
remove_bucket: old-bucket-ieXiy2

可能AWS CLI工具包的较晚版本提供了mv选项。

$ aws --version
aws-cli/1.15.30 Python/3.6.5 Darwin/17.6.0 botocore/1.10.30

我使用下面的命令重命名桶:

aws s3 mv s3://old-bucket s3://new-bucket --recursive