复制存储桶的 s3 内容,包括所有版本

复制存储桶的 s3 内容,包括所有版本

我有几个 S3 存储桶,我想将其访问权限移交给另一个组织,就像将现有的托管客户移交给他们一样。

查看文档后,如果我不想再对存储桶负责,最简单的选择似乎是将新存储桶的内容复制到新组织控制的新存储桶中,并从现在开始让任何现有应用程序将文件写入新存储桶。

水桶不是很大:

aws s3 ls --human-readable --recursive --summarize s3://some-client-bucket

 # (snip… lots of files listed, all less than 10mb)

 # Total Objects: 22764
 # Total Size: 2.4 GiB

但有些存储桶是有版本的,而且我每天都有一些去年的文件快照,我也希望能够传输这些文件。

有没有直接的方法可以做到这一点?

我了解如何在授予我访问权限后将存储桶的当前内容复制到由另一个组织控制的新存储桶中,具体方法如下:

aws s3 sync s3://some-client-bucket s3://new-client-bucket --recursive

但是,我认为这不会在各个版本之间移动,而且我一直依赖 S3 的每个文件版本控制,而不是自己给文件添加时间戳。

我是否需要临时编写一些脚本来:

  • 下载每个版本的文件
  • 使用时间戳重命名
  • 将其上传到新存储桶

或者 S3 中是否有一些额外的巧妙功能可以自动帮我完成此操作?

答案1

这是一个老问题,但我刚好遇到了同样的要求。现在有一种相当简单的方法可以将所有文件从一个版本控制的存储桶复制到另一个存储桶。我想出了以下 PowerShell 脚本来执行此操作:

$sourceBucket = <source bucket>
$destinationBucket = <destination bucket>
$nextKeyMarker = $null
$nextVersionIdMarker = $null
do {
    $objectVersions = Get-S3Version -BucketName $sourceBucket `
                                    -KeyMarker $nextKeyMarker `
                                    -VersionIdMarker $nextVersionIdMarker
    $nextKeyMarker = $objectVersions.NextKeyMarker
    $nextVersionIdMarker = $objectVersions.NextVersionIdMarker
    $objectVersions.Versions | foreach { 
        Copy-S3Object -BucketName $sourceBucket `
                      -DestinationBucket $destinationBucket `
                      -Key $_.Key `
                      -DestinationKey $_.Key `
                      -VersionId $_.VersionId `
                      -CannedACLName bucket-owner-full-control
    }
} while ($objectVersions.IsTruncated -eq "True")
  1. 无论存储桶中的对象数量有多少,这都应该有效,因为它以 1000 个为批量复制对象版本。
  2. CannedACLName 参数用于将对象的所有权转移到目标存储桶所属的新 AWS 账户。如果没有此参数,复制对象的所有者仍将是源存储桶的账户,这使得新所有者账户无法访问所有复制的对象。如果您在同一账户内的存储桶之间复制对象,则无需指定此参数。

相关内容