如何重命名AWS S3存储桶

230

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

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

有没有什么方法可以绕过这个问题?

3个回答

359

解决方案

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

说明

S3没有重命名Bucket的功能,因为在S3中没有文件夹的概念,所以我们必须处理Bucket中的每个文件。

以上代码将会执行以下三个步骤:1.创建新Bucket,2.复制文件,3.删除旧的Bucket。就是这样。

如果您的Bucket中有大量文件,并且您担心成本问题,请继续阅读。在幕后发生的事情是,所有Bucket中的文件都会首先被复制,然后再被删除。如果您有几千个文件,则成本应该是微不足道的。否则,请查看此答案以了解其对您的影响。

示例

在下面的示例中,我们创建并填充旧的Bucket,然后将文件同步到新的Bucket。检查命令的输出以了解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

9
这个答案与被采纳的答案相同,但这篇文章提供了非常有帮助的逐步示例,告诉你如何操作。虽然这个示例可以缩短,但没有必要展示创建旧存储桶和使用后缀变量的过程。然而,这个答案的解释部分并不能满足我的要求。它说S3中没有文件夹是为什么需要这种麻烦的过程。由于原始问题没有提到文件夹,我不理解这如何解释无法重命名S3存储桶的问题。 - Mr. Lance E Sloan
2
尝试了这种方法...似乎有效...但是由于某些奇怪的原因,我无法查看任何项目(图像)。 我可以通过浏览器在s3仪表板上浏览项目...但无法通过url查看它们或下载它们。 有什么想法吗? 权限似乎是相同的。 是否有一些特殊的权限需要注意? - bmiskie
1
请注意,据我所知,在将对象从一个存储桶复制到另一个存储桶时,目前无法保留它们的历史记录。也就是说,如果在源存储桶中启用了版本控制,您无法将带有其所有版本及创建日期的对象一起复制。 - Igor Akkerman
1
@duality_ 你能否在你的回答中加入关于权限的通知,以及你可以使用--acl bucket-owner-full-control复制文件(就像这个答案中所示)? - Евгений Масленков
3
请注意,您需要指定区域,否则新的存储桶将位于美国东部(弗吉尼亚北部)。例如:aws --region ap-southeast-2 s3 mb s3://new-bucket - cobberboy
显示剩余9条评论

136

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


9
@Tashows Pavitran在询问收费(charges),而不是变化(changes)。据我所知,复制存储桶中的项目确实需要付费,每个项目需要1次GET操作和1次PUT操作的费用。 - gdvalderrama
5
实际上,S3的定价表中实际上有一项COPY操作的条目,它的费用实际上与执行PUT操作的费用相同(因此没有额外的GET费用)。 - gdvalderrama
3
请注意,您还可以使用Web控制台剪切和粘贴,以便不想通过CLI执行此操作的人使用。 - mahemoff
如果您的对象存储在冰川或深度归档中,请注意每个对象的最短时间。如果您在最短时间(90或180天)之前从旧存储桶中删除对象,则将收取整个时间段的费用。因此,如果您将对象移动到新的存储桶中,然后再删除旧的存储桶,则可能会产生更高的成本。 - Uri
奇怪的是,在名称中使用(.)可能会对传输加速和SSL解析产生影响,尽管AWS在规范中建议这样做。 - user4826347
2
您可以使用当前任意存储桶的配置创建一个新的存储桶。只需单击“创建存储桶”,为存储桶命名,然后在“从现有存储桶复制设置”部分下单击“选择存储桶”。 - Kevin G

59

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

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

我正在使用以下命令重命名存储桶:

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

14
这对我很有效。但值得注意的是,在运行该命令之前必须先创建“new-bucket”。此外,“old-bucket”将会被清空但不会被删除。如果您想在传输所有文件后删除它,请使用以下命令(不包含尖括号): aws s3api delete-bucket --bucket <old-bucket> --region <region id> - Mabyn
5
如果旧桶在任何地方都在使用中,那么复制该桶,测试新的目标,然后删除旧桶是一个显然的良好做法。 aws s3 mv 实际上会复制并删除,因此财务成本应该是相同的(我认为)。 - Flimm
2
请注意 mv 命令存在以下警告:该操作会在指定位置创建一个带有更新设置和新的最后修改日期的对象副本,并删除原始对象。丢失最后修改日期可能是相关的。 - soniaseguz
1
太棒了,工作得很顺利,谢谢你! - Tintin81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接