Saltar al contenido

¿Cómo puedo utilizar la AWS CLI para cargar un archivo grande en varias partes en Amazon S3?

7 minutos de lectura
0

Quiero copiar un archivo grande en un bucket de Amazon Simple Storage Service (Amazon S3) en varias partes o utilizar la carga multiparte. Quiero usar la interfaz de la línea de comandos de AWS (AWS CLI) para cargar el archivo.

Descripción corta

Utiliza la AWS CLI, que tiene comandos aws s3 de alto nivel o comandos aws s3api de bajo nivel para cargar archivos de gran tamaño en Amazon S3. Para obtener más información sobre estos dos niveles de comandos, consulta Uso de Amazon S3 en la AWS CLI.

Importante: Se recomienda usar los comandos aws s3, como aws s3 cp, para cargas y descargas multiparte. Esto se debe a que los comandos aws s3 cargan y descargan automáticamente varias partes en función del tamaño del archivo. Utiliza los comandos aws s3api, como aws s3api create-multipart-upload, solo cuando los comandos aws s3 no admitan una carga específica. Por ejemplo, la carga multiparte implica varios servidores, o puedes detener manualmente una carga multiparte y reanudarla más adelante. O bien, el comando aws s3 no admite un parámetro de solicitud obligatorio.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores de la AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Antes de cargar el archivo, calcula el valor de la suma de comprobación MD5 del archivo como referencia para las comprobaciones de integridad tras la carga.

Uso de los comandos aws s3

Para usar un comando aws s3 de alto nivel para la carga multiparte, ejecuta el siguiente comando cp:

aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/

Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre del bucket.

En el ejemplo anterior, se usa el comando aws s3 cp para realizar automáticamente una carga multiparte cuando el objeto es grande. También puedes usar otros comandos aws s3 para cargar objetos en un bucket de S3. Por ejemplo, usa aws s3 sync o aws s3 mv.

Los objetos que cargas en varias partes a Amazon S3 tienen un formato ETag diferente al de los objetos que cargas con una solicitud PUT. Para almacenar el valor de la suma de comprobación MD5 del archivo de origen como referencia, carga el archivo que tiene el valor de la suma de comprobación como metadatos personalizados. Para agregar el valor de la suma de comprobación MD5 como metadatos personalizados, incluye el parámetro opcional --metadata en el comando de carga, tal como se muestra en el siguiente ejemplo:

aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/ --metadata md5="examplemd5value1234"

Nota: Sustituye large_test_file por el nombre del archivo que vas a cargar, sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket y sustituye examplemd5value1234 por tu valor MD5.

Para utilizar más ancho de banda y recursos del host, aumenta la cantidad máxima de solicitudes simultáneas que se establecen en la configuración de la AWS CLI S3. De forma predeterminada, la AWS CLI utiliza un máximo de 10 solicitudes simultáneas. Ejecuta el siguiente comando configure para establecer el número máximo de solicitudes simultáneas en 20:

aws configure set default.s3.max_concurrent_requests 20

Uso de los comandos aws s3api

  1. Divide el archivo que deseas cargar en varias partes.
    Consejo: Si utilizas un sistema operativo Linux, utiliza el comando split.

  2. Para iniciar una carga multiparte y recuperar el ID de carga asociado, ejecuta el siguiente comando create-multipart-upload:

    aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file

    Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket y sustituye large_test_file por el nombre del archivo que vas a cargar.

    El comando devuelve una respuesta que contiene el UploadID.

  3. Copia el valor de UploadID como referencia para los pasos posteriores.

  4. Para cargar la primera parte del archivo, ejecuta el siguiente comando upload-part:

    aws s3api upload-part --bucket DOC-EXAMPLE-BUCKET --key large_test_file --part-number 1 --body large_test_file.001 --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 exampleaAmjr+4sRXUwf0w==
    

    Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket y sustituye large_test_file por el nombre del archivo que vas a cargar. Sustituye el valor upload-id por el valor del resultado del comando create-multipart-upload. 

    El comando devuelve una respuesta que contiene un valor de ETag para la parte del archivo que has cargado.

  5. Copia el valor de la ETag como referencia para los pasos posteriores.

  6. Repite los pasos 4 y 5 para cada parte del archivo. Asegúrate de aumentar el número de partes que tiene cada parte nueva que cargues.

  7. Después de cargar todas las partes del archivo, ejecuta el siguiente comando list-parts para enumerar las partes cargadas y confirmar que la lista está completa:

    aws s3api list-parts --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
    

    Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket y sustituye large_test_file por el nombre del archivo que vas a cargar. Sustituye el valor upload-id por el valor del resultado del comando create-multipart-upload.

  8. Compila los valores de ETag para cada parte del archivo que hayas cargado en un archivo con formato JSON.
    Archivo JSON de ejemplo:

    {
        "Parts": [{
            "ETag": "example8be9a0268ebfb8b115d4c1fd3",
            "PartNumber":1
        },
    
        ....
    
        {
            "ETag": "example246e31ab807da6f62802c1ae8",
            "PartNumber":4
        }]
    }
  9. Asigna al archivo el nombre fileparts.json.

  10. Para completar la carga multiparte, ejecuta el siguiente comando complete-multipart-upload:

aws s3api complete-multipart-upload --multipart-upload file://fileparts.json --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

Nota: Sustituye el valor de --multipart-upload con la ruta al archivo con formato JSON que contiene las ETags que has creado. Sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket y sustituye large_test_file por el nombre del archivo que vas a cargar. Sustituye el valor upload-id por el valor del resultado del comando list-multipart-uploads.

  1. Si el comando anterior se ejecuta correctamente, recibirás una respuesta similar a la siguiente:
{
    "ETag": "\\"exampleae01633ff0af167d925cad279-2\\"",
    "Bucket": "DOC-EXAMPLE-BUCKET",
    "Location": "https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/large_test_file",

    "Key": "large_test_file"
}

Resolución de errores de carga

Si utilizas los comandos aws s3 de alto nivel para una carga multiparte y la carga falla, debes iniciar una nueva carga multiparte. Los errores de carga multiparte se producen debido a un tiempo de espera o a una cancelación manual. En la mayoría de los casos, la AWS CLI cancela automáticamente la carga multiparte y, a continuación, elimina los archivos multiparte que hayas creado. Este proceso puede tardar varios minutos. Si usas los comandos aws s3api y el proceso se interrumpe, elimina las partes incompletas de la carga y vuelve a cargarlas.

Para eliminar las partes incompletas, utiliza la acción del ciclo de vida AbortIncompleteMultipartUpload. O bien, utiliza los comandos aws s3api para eliminar las partes incompletas.

  1. Para enumerar las cargas de archivos multiparte incompletas, ejecuta el siguiente comando list-multipart-uploads:

    aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET
    

    Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre del bucket.

  2. El comando devuelve un mensaje con cualquier parte del archivo que no se haya procesado, como en el ejemplo siguiente:

    {
        "Uploads": [
            {
    
        "Initiator": {
                    "DisplayName": "multipartmessage",
                    "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        "
                },
                "Initiated": "2016-03-31T06:13:15.000Z",
    
        "UploadId": "examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-",
                "StorageClass": "STANDARD",
    
        "Key": "",
                "Owner": {
                    "DisplayName": "multipartmessage",
    
        "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
                }
            }
       ]
    }
  3. Para eliminar las partes incompletas, ejecuta el siguiente comando abort-multipart-upload:

    aws s3api abort-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB

    Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket y sustituye large_test_file por el nombre del archivo que vas a cargar. Sustituye el valor upload-id por el valor del resultado del comando list-multipart-uploads.

Información relacionada

Carga y copia de objetos mediante la carga multiparte en Amazon S3