复制bucket的s3内容,包括所有版本

Chr*_*ams 7 backup amazon-s3 amazon-web-services

我有几个 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
Run Code Online (Sandbox Code Playgroud)

但是有些存储桶是版本化的,我有一些文件的每日快照,可以追溯到去年,我也希望能够传输这些文件。

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

我了解在他们使用以下内容授予我访问权限后,如何将存储桶的当前内容复制到由另一个组织控制的新存储桶:

aws s3 sync s3://some-client-bucket s3://new-client-bucket --recursive
Run Code Online (Sandbox Code Playgroud)

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

我是否必须对一些脚本进行 jerry-rig 以:

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

或者 S3 中是否有一些漂亮的额外功能可以为我自动执行此操作?

小智 4

这是一个老问题,但我碰巧遇到了同样的要求。如今,有一种相当简单的方法可以将所有文件从一个版本存储桶复制到另一个版本存储桶。我想出了以下 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")
Run Code Online (Sandbox Code Playgroud)
  1. 无论存储桶中的对象数量有多少,这都应该有效,因为它会批量复制 1000 个对象版本。
  2. CannedACLName 参数用于将对象的所有权转移到目标存储桶所属的新 AWS 账户。否则,复制对象的所有者仍将是源存储桶的帐户,从而使新所有者帐户无法访问所有复制的对象。如果您要在同一账户内的存储桶之间复制对象,则无需指定此项。