【问题标题】:Copy S3 Bucket including versions复制 S3 存储桶,包括版本
【发布时间】:2023-03-13 07:30:01
【问题描述】:

有没有办法复制包含对象版本的 S3 存储桶?

我读到复制存储桶的一种方法是使用命令行工具

aws s3 sync s3://<source> s3://<dest>

但是,在我的源存储桶中:

当我在同步的存储桶中时:

如您所见,版本 ID 为“null”。有没有办法制作 100% 相同的副本,包括版本 ID?这对于我们的备份/开发服务器很重要,因为我们的应用程序依赖于版本 ID。 编辑:如果我在同步之前打开版本控制,我会得到与 null 不同的版本 ID。但版本 ID 与原始存储桶中的 ID 不同,目标是保留版本 ID。我还尝试了cp 命令,它产生了相同的结果。上述结果也记录在here:

如果您在目标存储桶上启用版本控制,Amazon S3 会为正在复制的对象生成一个唯一的版本 ID。此版本 ID 与源对象的版本 ID 不同。 Amazon S3 在响应的 x-amz-version-id 响应标头中返回复制对象的版本 ID。

如果您未在目标存储桶上启用版本控制或将其挂起,则 Amazon S3 生成的版本 ID 始终为空。

所以看起来 aws 没有提供保留版本 ID 的方法?如果是这样,是否有解决方法或第三方软件?

【问题讨论】:

  • 嘿,你有没有找到不使用 CRR 来制作精确副本的方法?您是否设法同步并保留版本 ID?我目前有完全相同的问题...
  • @Joze 不,很遗憾我们没有找到解决这个问题的方法

标签: amazon-web-services amazon-s3 copy version


【解决方案1】:
  1. 不,您无法获得相同的版本 ID,因为它们像存储桶名称一样是唯一的。这意味着没有第三方工具可以编辑并为您提供相同的版本 ID,即使您保留它也是如此。 AWS 分配版本 ID,不能通过 API 更改。

  2. 如果新存储桶上未启用版本控制,则对象版本 id 将报告为NULL。正如你所提到的,这是正确的。您可以做的是存储旧版本 id 和新版本 id 并将其视为别名。

这里是AWS Documentation 的解释:

您必须在存储桶上明确启用版本控制。默认情况下,版本控制被禁用。无论您是否启用了版本控制,您的存储桶中的每个对象都有一个版本 ID。如果您尚未启用版本控制,Amazon S3 会将版本 ID 的值设置为 null。如果您启用了版本控制,Amazon S3 会为该对象分配一个唯一的版本 ID 值。当您对存储桶启用版本控制时,存储桶中已存储的对象将保持不变。版本 ID(null)、内容和权限保持不变。

在存储桶级别启用和暂停版本控制。当您为存储桶启用版本控制时,添加到其中的所有对象都将具有唯一的版本 ID。唯一版本 ID 是随机生成的、Unicode、UTF-8 编码、URL 就绪、不透明的字符串,最多 1024 字节长。示例版本 ID 为 3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo。只有 Amazon S3 会生成版本 ID。它们不能被编辑。

【讨论】:

    【解决方案2】:

    没有直接的方法可以这样做。但是你可以通过 AWS Copy-Object API ref https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html

    迭代每个版本对象,捕获对象 ID 并复制到目标存储桶。

    希望对你有帮助

    【讨论】:

    • 虽然链接可能会回答问题,但最好在此处添加详细信息以获得更多理解。
    • 我不认为这是正确的。 boto3 文档说:“如果您在目标存储桶上启用版本控制,Amazon S3 会为正在复制的对象生成唯一的版本 ID。此版本 ID 与源对象的版本 ID 不同。Amazon S3 返回版本 ID在响应中的 x-amz-version-id 响应标头中复制的对象。"
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2017-11-23
    • 2018-06-18
    • 1970-01-01
    • 2022-01-07
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多