ChatGPT解决这个技术问题 Extra ChatGPT

如何重命名 AWS S3 存储桶

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

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

有没有办法解决这个问题?


d
duality_

解决方案

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. 删除旧的存储桶。而已。

如果您的存储桶中有很多文件并且您担心成本,请继续阅读。在幕后发生的是存储桶中的所有文件首先被复制然后被删除。如果您有几千个文件,它应该花费微不足道的数量。否则,请检查 this answer 以了解这会对您产生什么影响。

例子

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

这个答案与接受的答案相同,除了这个帖子提供了一个非常有用的分步示例,说明如何做到这一点。 (不过,这个例子应该被缩短。没有必要展示一个示例旧存储桶的创建和使用后缀变量。)这个答案的解释部分并不让我满意。它说 S3 中缺少文件夹是需要这个尴尬过程的原因。由于最初的问题没有提到文件夹,我不明白这如何解释无法重命名 S3 存储桶。
尝试了这种方法...似乎可以工作...但是由于某些奇怪的原因,我无法查看任何项目(图像)。我可以通过浏览器浏览 s3 仪表板上的项目...但无法通过 url 查看或下载它们。任何想法为什么?权限似乎相同。是否有一些特殊权限需要注意?
请注意,据我所知,将对象从一个存储桶复制到另一个存储桶时,目前无法保留它们的历史记录。也就是说,如果在源存储桶中启用了版本控制,您无法复制对象及其所有版本及其创建日期。
@duality_ 您能否在回答通知中添加有关权限的内容以及您可以使用 --acl bucket-owner-full-control 复制文件(例如在那个 answer 中)
请注意,您还需要指定区域,否则您的新存储桶将位于美国东部(北弗吉尼亚)。例如aws --region ap-southeast-2 s3 mb s3://new-bucket
l
liferacer

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


@Tashows pavitran 询问的是费用,而不是更改。据我所知,复制存储桶项目确实需要收费,我相信每个项目的 1 GET 和 1 PUT 操作成本。
@Tashows 实际上,pricing table for S3 上实际上有一个 COPY 操作条目,它实际上与执行 PUT 的成本相同(因此没有额外的 GET 成本)。
请注意,对于不想通过 CLI 执行此操作的人,您也可以使用 Web 控制台进行剪切和粘贴。
@pavitran 如果您在冰川或深度存档中有对象,请注意每个对象的最短时间,如果您在最短时间(90 或 180 天)之前从旧存储桶中删除对象,您将需要为全程。因此,如果将对象移动到新存储桶然后删除旧存储桶,可能会花费更多。
您使用任何当前存储桶的配置副本创建一个新存储桶。只需单击“创建存储桶”,命名存储桶,然后单击“从现有存储桶复制设置”部分下的“选择存储桶”。
R
Richard A Quadling

可能更高版本的 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

这对我有用。但是,请务必注意,必须先创建 new-bucket,然后再运行该命令。此外,old-bucket 将是空的,但不会被删除。如果要在传输所有文件后将其删除,请使用以下命令(不带尖括号):aws s3api delete-bucket --bucket <old-bucket> --region <region id>
如果旧存储桶在任何地方都在使用,那么复制存储桶,使用新目的地进行测试,然后才删除旧存储桶,这显然是一种好习惯。 aws s3 mv实际上是复制和删除,所以财务成本应该是一样的(我认为)。
请注意,mv 命令有以下警告:This action creates a copy of the object with updated settings and a new last-modified date in the specified location, and then deletes the original object。丢失最后修改日期可能是相关的。