¿Cómo puedo copiar todos los objetos desde un bucket de Amazon S3 a otro bucket?

Última actualización: 19-05-2021

Quiero copiar o mover todos mis objetos desde un bucket de Amazon Simple Storage Service (Amazon S3) a otro bucket. ¿Cómo puedo migrar objetos entre mis buckets de S3?

Descripción corta

Para copiar objetos desde un bucket de S3 a otro, siga los siguientes pasos:

1.    Cree un nuevo bucket de S3.

2.    Instale y configure AWS Command Line Interface (AWS CLI).

3.    Copie los objetos entre los buckets de S3.

Nota: Utilizar los comandos aws s3 ls o aws s3 sync en buckets de gran tamaño (con 10 millones de objetos o más) puede ser caro y dar lugar a tiempo de espera. Si se producen tiempos de espera debido a un bucket grande, considere utilizar métricas de Amazon CloudWatch para calcular el tamaño y el número de objetos de un bucket. Además, plantéese utilizar operaciones por lote de S3 para copiar los objetos.

4.    Verifique que se han copiado los objetos.

5.    Actualice las llamadas a la API existentes al nombre del bucket de destino.

Antes de comenzar, tenga en cuenta lo siguiente:

Resolución

Crear un nuevo bucket de S3

1.    Abra la consola de Amazon S3.

2.    Elija Create bucket (Crear bucket).

3.    Elija un nombre conforme con DNS para su nuevo bucket.

4.    Seleccione su región de AWS.

Consejo: Para evitar errores de rendimiento causados por el tráfico entre regiones, cree el bucket de destino en la misma región que el bucket de la fuente.

5.    De manera opcional, elija Copy settings from an existing bucket (Copiar configuración de un bucket existente) para reflejar la configuración del bucket de la fuente.

Instalar y configurar AWS CLI

1.    Instale AWS CLI.

2.    Ejecute el siguiente comando para configurar AWS CLI:

aws configure

Nota: Si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que está utilizando la versión más reciente de AWS CLI.

3.    Ingrese sus claves de acceso (ID de clave de acceso y clave de acceso secreta).

4.    Presione Enter para omitir las opciones de región predeterminada y salida predeterminada. Para obtener más información sobre los parámetros de región de Amazon S3, consulte Puntos de enlace de servicio de AWS.

Nota: Las salidas de AWS CLI son JSON, texto o tablas, pero no todos los comandos admiten todos los tipos de salida. Para obtener más información, consulte Control de salidas de comandos desde AWS CLI.

Copiar los objetos entre buckets de S3

1.    Si ha archivado objetos de S3 en la clase de almacenamiento Amazon Simple Storage Service Glacier, restaure los objetos.

2.    Copie los objetos entre los buckets de fuente y destino mediante la ejecución del siguiente comando de sincronización a través de AWS CLI:

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

Nota: Actualice el comando sync para incluir los nombres del bucket de fuente y destino.

El comando sync utiliza las API CopyObject para copiar objetos entre buckets de S3. El comando sync enumera los buckets de fuente y destino para identificar objetos que se encuentren en el bucket de fuente, pero no en el de destino. El comando también identifica objetos en el bucket de fuente con fechas de LastModified diferentes a las de los objetos del bucket de destino. Cuando utiliza el comando sync en un bucket con versiones, solo se copia la versión actual del objeto y no las versiones anteriores. De manera predeterminada, este comportamiento preserva los metadatos de los objetos, aunque las listas de control de acceso (ACL) tienen la configuración FULL_CONTROL para su cuenta de AWS, lo cual elimina cualquier ACL adicional. Si la operación da error, puede ejecutar de nuevo el comando sync sin duplicar los objetos copiados previamente. Para solucionar problemas con la operación del comando sync, consulte ¿Por qué no puedo copiar un objeto entre dos buckets de Amazon S3?

3.    (Opcional) En caso de tiempo de espera, utilice el comando cloudwatch get-metric-statistics para calcular el número de objetos del 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) En caso de tiempo de espera, utilice el comando cloudwatch get-metric-statistics para obtener el tamaño del 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
Nota: Las listcalls pueden ser muy caras, lo que hace que el comando cause tiempo de espera. Para buckets grandes, considere utilizar métricas de Amazon CloudWatch para calcular el tamaño del bucket y el número total de objetos que contiene. Sin embargo, dado que las métricas de Amazon CloudWatch solo se extraen una vez al día, el recuento de objetos y el tamaño del bucket que muestren pueden diferir de los resultados del comando list.

Verificar que se han copiado los objetos

1.    Verifique los contenidos de los buckets de fuente y destino mediante la ejecución de los siguientes 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

Nota: Actualice el comando list para incluir los nombres del bucket de fuente y destino.

2.    Compare objetos en los buckets de fuente y destino mediante los resultados que están guardados en archivos ubicados en el directorio de AWS CLI. Observe la siguiente salida de ejemplo:

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

  Total Objects: 1        Total Size: 15362

Actualizar las llamadas a la API existentes al nombre del bucket de destino

Actualice cualquier aplicación o carga de trabajo existente de modo que utilicen el nombre del bucket de destino. Es posible que sea necesario ejecutar comandos sync para abordar las discrepancias entre los buckets de fuente y destino si se realizan escrituras con frecuencia.