Como copiar todos os objetos de um bucket do Amazon S3 para outro bucket?

Última atualização: 2021-05-19

Quero copiar ou mover todos os meus objetos de um bucket do Amazon Simple Storage Service (Amazon S3) para outro. Como posso migrar objetos entre meus buckets do S3?

Descrição breve

Para copiar objetos de um bucket do S3 para outro, siga estas etapas:

1.    Crie um novo bucket do S3.

2.    Instale e configure a AWS Command Line Interface (AWS CLI).

3.    Copie os objetos entre os buckets do S3.

Observação: usar os comandos aws s3 ls ou aws s3 sync em buckets grandes (com 10 milhões de objetos ou mais) pode ser caro, resultando em um tempo limite. Se você se deparar com tempos limite devido a um bucket grande, considere usar métricas do Amazon CloudWatch para calcular o tamanho e o número de objetos em um bucket. Além disso, considere usar o S3 Batch Operations para copiar os objetos.

4.    Verifique se os objetos foram copiados.

5.    Atualize as chamadas de API existentes para o nome do bucket de destino.

Antes de começar, considere o seguinte:

Resolução

Criar um novo bucket do S3

1.    Abra o console do Amazon S3.

2.    Selecione Create bucket (Criar bucket).

3.    Escolha um nome compatível com DNS para o novo bucket.

4.    Selecione sua Região da AWS.

Dica: para evitar problemas de performance causados pelo tráfego entre regiões, crie o bucket de destino na mesma região que o bucket de origem.

5.    Opcionalmente, escolha Copy settings from an existing bucket (Copiar configurações de um bucket existente) para espelhar a configuração do bucket de origem.

Instalar e configurar a AWS CLI

1.    Instale a CLI da AWS.

2.    Configure a AWS CLI executando o seguinte comando:

aws configure

Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de estar usando a versão mais recente da AWS CLI.

3.    Insira suas chaves de acesso (ID da chave de acesso e chave de acesso secreta).

4.    Pressione Enter para ignorar a região padrão e as opções de saída padrão. Para obter mais informações sobre os parâmetros da região do Amazon S3, consulte endpoints de serviços da AWS.

Observação: as saídas da AWS CLI são JSON, texto ou tabela, mas nem todos os comandos oferecem suporte para cada tipo de saída. Para obter mais informações, consulte Controlar a saída de comandos da AWS CLI.

Copiar os objetos entre os buckets do S3

1.    Se você arquivou objetos do S3 na classe de armazenamento Amazon Simple Storage Service Glacier, restaure esses objetos.

2.    Copie os objetos entre os buckets de origem e de destino executando o seguinte comando sync na AWS CLI:

aws s3 sync s3://DOC-EXAMPLE-BUCKET-SOURCE s3://DOC-EXAMPLE-BUCKET-TARGET

Observação: atualize o comando sync para incluir os nomes dos buckets de origem e destino.

O comando sync usa as APIs CopyObject para copiar objetos entre buckets do S3. O comando sync lista os buckets de origem e destino para identificar objetos que estão no bucket de origem, mas que não estão no bucket de destino. O comando também identifica objetos no bucket de origem que têm datas LastModified diferentes dos objetos que estão no bucket de destino. Quando você usa o comando sync em um bucket versionado, somente a versão atual do objeto é copiada: as versões anteriores não são copiadas. Por padrão, esse comportamento preserva os metadados dos objetos, embora as listas de controle de acesso (ACLs) estejam definidas como FULL_CONTROL para a sua conta da AWS, o que remove quaisquer ACLs adicionais. Se a operação falhar, você poderá executar o comando sync novamente sem duplicar objetos copiados anteriormente. Para solucionar problemas com a operação de sync, consulte Por que não consigo copiar um objeto entre dois buckets do Amazon S3?

3.    (Opcional) Se você se deparar com um tempo limite, use o comando cloudwatch get-metric-statistics para calcular o número de objetos no seu bucket:

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=AllStorageTypes --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 600 --statistic Average --output json

4.    (Opcional) Se você se deparar com um tempo limite, use o comando cloudwatch get-metric-statistics para recuperar o tamanho do bucket:

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=StandardStorage --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 3600 --statistics Average --unit Bytes --output json
Observação: chamadas de listas podem ser muito caras, resultando no tempo limite do comando. Para buckets grandes, considere usar métricas do Amazon CloudWatch para calcular o tamanho do bucket e o número total de objetos. No entanto, como as métricas do Amazon CloudWatch são extraídas apenas uma vez por dia, a contagem de objetos relatados e o tamanho do bucket podem ser diferentes dos resultados do comando list.

Verificar se os objetos foram copiados

1.    Verifique o conteúdo dos buckets de origem e de destino executando os seguintes comandos:

aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-SOURCE --summarize > bucket-contents-source.txt
        
aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-TARGET --summarize > bucket-contents-target.txt

Observação: atualize o comando list para incluir os nomes dos buckets de origem e destino.

2.    Compare os objetos que estão nos buckets de origem e de destino usando as saídas que são salvas em arquivos no diretório da AWS CLI. Veja o seguinte exemplo de saída:

$ aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET --summarize
2017-11-20 21:17:39      15362 s3logo.png

  Total Objects: 1        Total Size: 15362

Atualizar chamadas de API existentes para o nome do bucket de destino

Atualize todas as aplicações e workloads existentes para que elas usem o nome do bucket de destino. Talvez seja necessário executar comandos sync para solucionar discrepâncias entre intervalos de origem e destino se você tiver gravações frequentes.