Назад | Перейти на главную страницу

Скопируйте содержимое корзины 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 есть отличная дополнительная функция, которая сделает это за меня автоматически?

Это старый вопрос, но я столкнулся с тем же требованием. Сегодня существует довольно простой способ скопировать все файлы из одной версии ведра в другую. Для этого я придумал следующий сценарий 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, которой принадлежит целевой сегмент. Без этого владельцем скопированных объектов по-прежнему будет учетная запись исходного сегмента, что сделает все скопированные объекты недоступными для новой учетной записи владельца. Если вы копируете объекты между сегментами в пределах одной учетной записи, вам не нужно указывать это.