【问题标题】:How to rename AWS S3 Bucket如何重命名 AWS S3 存储桶
【发布时间】:2017-05-21 12:44:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: amazon-web-services amazon-s3 cname


    【解决方案1】:

    解决方案

    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
    • 如果您启用了版本控制,则需要使用生命周期管理来使版本过期......显然:docs.aws.amazon.com/AmazonS3/latest/dev/…
    【解决方案2】:

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

    【讨论】:

    • @Tashows pavitran 询问的是费用,而不是费用。据我所知,复制存储桶项目确实需要收费,我相信每个项目的 1 GET 和 1 PUT 操作成本。
    • @Tashows 实际上在pricing table for S3 上有一个 COPY 操作的入口,它实际上与执行 PUT 的成本相同(因此没有额外的 GET 成本)。
    • 请注意,对于不想通过 CLI 执行此操作的人,您也可以使用 Web 控制台进行剪切和粘贴。
    • @pavitran 如果您在冰川或深度存档中有对象,请注意每个对象的最短时间,并且如果您在最短时间(90 或 180 天)之前从旧存储桶中删除对象),您将一直被收取费用。因此,如果将对象移动到新存储桶然后删除旧存储桶,可能会花费更多。
    • 奇怪,但在名称中使用 (.) 可能会在传输加速和 SSL 解析方面产生影响,尽管 AWS 在约定中推荐它。
    【解决方案3】:

    可能更高版本的 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实际上是复制和删除,所以财务成本应该是一样的(我认为)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2019-04-24
    相关资源
    最近更新 更多