Copie s3 conteúdos do bucket, incluindo todas as versões

5

Eu tenho alguns buckets do S3 dos quais quero entregar o acesso a outra organização, assim como estou entregando um cliente de hospedagem existente para eles.

Depois de procurar nos documentos, se eu não quiser mais ser responsável pelo intervalo, parece que a opção mais simples é copiar o conteúdo do novo intervalo para um novo grupo controlado pela nova organização e fazer qualquer um deles. os aplicativos gravam arquivos no novo bucket a partir de agora.

O balde não é muito grande:

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

Mas o intervalo é versionado e tenho instantâneos diários de alguns arquivos do último ano, que também quero poder transferir.

Existe uma maneira simples de fazer isso?

Entendo como posso copiar o conteúdo atual de um intervalo para outro controlado por outra organização depois que eles me concederem acesso usando algo como:

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

No entanto, eu não acho que isso irá se mover através das versões também, e eu estou confiando na versão do S3 por arquivo ao invés de registrar o tempo dos arquivos eu mesmo.

Eu tenho que fazer um script para:

  • faça o download de cada arquivo com versão
  • renomeie-o com um registro de data e hora
  • faça o upload para o novo intervalo

Ou há algum recurso extra bacana no S3 para fazer isso de forma automagica para mim?

    
por Chris Adams 09.01.2017 / 16:07

1 resposta

2

Este é uma pergunta antiga, mas aconteceu de eu vir contra o mesmo requisito. Hoje há uma maneira bastante fácil de copiar todos os arquivos de um intervalo de versão para outro. Eu criei o seguinte script do PowerShell para fazer isso:

$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. Isso deve funcionar, não importa o número de objetos no bloco, pois ele copia versões de objetos em volumes de 1000.
  2. O parâmetro CannedACLName é usado para transferir a propriedade dos objetos para a nova conta da AWS em que o depósito de destino pertence. Sem isso, o proprietário dos objetos copiados ainda será a conta do depósito de origem, tornando todos os objetos copiados inacessíveis pela nova conta do proprietário. Se você estiver copiando objetos entre depósitos na mesma conta, não será necessário especificar isso.
por 14.10.2018 / 00:00