Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos - Amazon Simple Storage Service

Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos

La carga multiparte permite cargar un solo objeto como un conjunto de partes. Cada parte es una parte contigua de los datos del objeto. Puede cargar estas partes del objeto de forma independiente y en cualquier orden. Si la transmisión de cualquier parte falla, puede retransmitir esta parte sin que las demás partes se vean afectadas. Después de cargar todas las partes del objeto, Amazon S3 las combina y crea el objeto. Por lo general, cuando el tamaño del objeto alcanza los 100 MB, deberá usar las cargas multipartes en lugar de cargar el objeto en una única operación. Para obtener más información acerca de las cargas multipartes, consulte Carga y copia de objetos con la carga multiparte. Para conocer los límites relacionados con las cargas multiparte, consulte Límites de carga multiparte de Amazon S3.

Puede utilizar sumas de verificación para comprobar que los activos no se modifican al copiarlos. La realización de una suma de comprobación consiste en utilizar un algoritmo para iterar secuencialmente cada byte de un archivo. Amazon S3 ofrece varias opciones de suma de comprobación para comprobar la integridad de los datos. Le recomendamos que realice estas comprobaciones de integridad como práctica recomendada de durabilidad y para confirmar que todos los bytes se transfieren sin alteraciones. Amazon S3 también admite los siguientes algoritmos: SHA-1, SHA-256, CRC32 y CRC32C. Amazon S3 utiliza uno o más de estos algoritmos para calcular un valor de suma de comprobación adicional y almacenarlo como parte de los metadatos del objeto. Para obtener más información acerca de las sumas de comprobación, consulte Comprobación de la integridad de objetos.

Objetivo

En este tutorial, obtendrá información sobre cómo cargar un objeto en Amazon S3 mediante una carga multiparte y una suma de comprobación SHA-256 adicional a través de la interfaz de línea de comandos de AWS (CLI de AWS). También obtendrá información sobre cómo comprobar la integridad de los datos del objeto mediante el cálculo del hash MD5 y la suma de comprobación SHA-256 del objeto cargado.

Requisitos previos

  • Antes de empezar este tutorial, asegúrese de tener acceso a un bucket de Amazon S3 en el que pueda cargar. Para obtener más información, consulte Crear un bucket.

  • Debe tener instalada y configurada la CLI de AWS. Si aún no ha instalado la CLI de AWS, consulte Instalar o actualizar la última versión de la AWS CLI en la Guía del usuario de AWS Command Line Interface.

  • De forma alternativa, puede ejecutar comandos de la CLI de AWS desde la consola mediante AWS CloudShell. AWS CloudShell es un intérprete de comandos previamente autenticado y basado en el navegador que se puede lanzar directamente desde la AWS Management Console. Para obtener más información, consulte ¿Qué es CloudShell? e Introducción a AWS CloudShell en la Guía el usuario de AWS CloudShell.

Paso 1: Creación de un archivo grande

Si ya tiene un archivo listo para cargar, puede usarlo para este tutorial. De lo contrario, cree un archivo de 15 MB siguiendo estos pasos. Para conocer los límites relacionados con las cargas multiparte, consulte Límites de carga multiparte de Amazon S3.

Creación de un archivo grande

Utilice uno de los siguientes comandos para crear el archivo, en función del sistema operativo que esté utilizando.

Linux o macOS

Para crear un archivo de 15 MB, abra el terminal local y ejecute el siguiente comando:

dd if=/dev/urandom of=census-data.bin bs=1M count=15

Este comando crea un archivo llamado census-data.bin relleno de bytes aleatorios, con un tamaño de 15 MB.

Windows

Para crear un archivo de 15 MB, abra el terminal local y ejecute el siguiente comando:

fsutil file createnew census-data.bin 15728640

Este comando crea un archivo llamado census-data.bin con un tamaño de 15 MB de datos arbitrarios (15728640 bytes).

Paso 2: División del archivo en varios archivos

Para realizar la carga multiparte, debe dividir el archivo grande en partes más pequeñas. A continuación, puede cargar las partes más pequeñas mediante el proceso de carga multiparte. En este paso se muestra cómo dividir el archivo grande creado en el Paso 1 en partes más pequeñas. En el siguiente ejemplo, se utiliza un archivo de 15 MB llamado census-data.bin.

División de un archivo grande en partes

Linux o macOS

Para dividir el archivo grande en partes de 5 MB, utilice el comando split. Abra el terminal y ejecute lo siguiente:

split -b 5M -d census-data.bin census-part

Este comando divide census-data.bin en partes de 5 MB llamadas census-part**, donde ** es un sufijo numérico que comienza desde 00.

Windows

Para dividir el archivo grande, utilice PowerShell. Abra Powershell y ejecute el siguiente script:

$inputFile = "census-data.bin" $outputFilePrefix = "census-part" $chunkSize = 5MB $fs = [System.IO.File]::OpenRead($inputFile) $buffer = New-Object byte[] $chunkSize $fileNumber = 0 while ($fs.Position -lt $fs.Length) { $bytesRead = $fs.Read($buffer, 0, $chunkSize) $outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber $fileStream = [System.IO.File]::Create($outputFile) $fileStream.Write($buffer, 0, $bytesRead) $fileStream.Close() $fileNumber++ } $fs.Close()

Este script de PowerShell lee el archivo grande en fragmentos de 5 MB y escribe cada fragmento en un archivo nuevo con un sufijo numérico.

Tras ejecutar el comando correspondiente, debería ver las partes del directorio donde ejecutó el comando. Cada parte tendrá un sufijo correspondiente a su número de pieza, por ejemplo:

census-part00 census-part01 census-part02

Paso 3: Creación de la carga multiparte con una suma de comprobación adicional

Para iniciar el proceso de carga multiparte, debe crear la solicitud de carga multiparte. Este paso implica iniciar la carga multiparte y especificar una suma de verificación adicional para la integridad de los datos. En el siguiente ejemplo, se utiliza la suma de comprobación SHA-256. Si desea proporcionar metadatos que describen el objeto que se está cargando, debe proporcionarlos en la solicitud para iniciar la carga multiparte.

nota

En este paso y en los siguientes, este tutorial utiliza el algoritmo adicional SHA-256. Otra opción, puede utilizar otra suma de comprobación adicional para estos pasos, como CRC32, CRC32C o SHA-1. Si usa un algoritmo diferente, debe usarlo a lo largo de los pasos del tutorial.

Inicio de la carga multiparte

En el terminal, use el siguiente comando create-multipart-upload para iniciar una carga multiparte para el bucket. Reemplace amzn-s3-demo-bucket1 por el nombre real de su bucket. Además, sustituya census_data_file por el nombre de archivo elegido. Este nombre de archivo se convierte en la clave del objeto cuando se completa la carga.

aws s3api create-multipart-upload --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --checksum-algorithm sha256

Si la solicitud funciona correctamente, verá una salida JSON como la siguiente:

{ "ServerSideEncryption": "AES256", "ChecksumAlgorithm": "SHA256", "Bucket": "amzn-s3-demo-bucket1", "Key": "census_data_file", "UploadId": "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" }
nota

Al enviar una solicitud para iniciar una carga multiparte, Amazon S3 devuelve una respuesta con un ID de carga, que es un identificador único para su carga multiparte. Debe incluir este ID de carga siempre que cargue partes, muestre partes, complete una carga o pare una carga. Deberá usar los valores UploadId, Key y Bucket para los pasos posteriores, así que asegúrese de guardarlos.

Además, si utiliza una carga multiparte con sumas de comprobación adicionales, los números de partes deben ser consecutivos. Si utiliza números de partes no consecutivos, la solicitud complete-multipart-upload puede generar un HTTP 500 Internal Server Error.

Paso 4: Carga de las partes de la carga multiparte

En este paso, cargará las partes de la carga multiparte en el bucket de S3. Utilice el comando upload-part para cargar cada parte de forma individual. Este proceso requiere especificar el ID de carga, el número de parte y el archivo que se va a cargar para cada parte.

Carga de las partes
  1. Al cargar una parte, además del ID de carga, debe especificar un número de parte mediante el argumento --part-number. Puede seleccionar cualquier número de parte comprendido entre 1 y 10 000. Un número de parte identifica exclusivamente una parte y su posición en el objeto que se está cargando. El número de parte que elija debe estar en una secuencia consecutiva (por ejemplo: puede ser 1, 2 o 3). Si carga una parte nueva con el mismo número que una parte ya cargada, se sobrescribirá la parte existente.

  2. Utilice el comando upload-part para cargar cada parte de la carga multiparte. El --upload-id es el mismo que estaba en la salida creada por el comando create-multipart-upload del Paso 3. Para cargar la primera parte de los datos, utilice el siguiente comando:

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 1 --body census-part00 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256

    Al completar cada comando upload-part, debería ver un resultado similar al del siguiente ejemplo:

    { "ServerSideEncryption": "AES256", "ETag": "\"e611693805e812ef37f96c9937605e69\"", "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" }
  3. Para las partes siguientes, incremente el número de parte en consecuencia:

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number <part-number> --body <file-path> --upload-id "<your-upload-id>" --checksum-algorithm SHA256

    Por ejemplo, use el siguiente comando para cargar la segunda parte:

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 2 --body census-part01 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256

    Amazon S3 devuelve una etiqueta de entidad (ETag) y sumas de comprobación adicionales para cada parte cargada como un encabezado en la respuesta.

  4. Siga utilizando el comando upload-part hasta que haya cargado todas las partes del objeto.

Paso 5: Muestra de todas las partes de la carga multiparte

Para completar la carga multiparte, necesitará una lista de todas las partes que se han cargado para esa carga multiparte específica. El resultado del comando list-parts proporciona información como el nombre del bucket, la clave, el ID de carga, el número de parte, la ETag, las sumas de verificación adicionales, etc. Resulta útil guardar este resultado en un archivo para poder utilizarlo en el siguiente paso al completar el proceso de carga multiparte. Puede crear un archivo de salida JSON llamado parts.json mediante el siguiente método.

Creación de un archivo que muestre todas las partes
  1. Para generar un archivo JSON con los detalles de todas las partes cargadas, utilice el siguiente comando list-parts. Sustituya amzn-s3-demo-bucket1 por el nombre real del bucket y <your-upload-id> por el ID de carga que recibió en el Paso 3. Para obtener más información sobre el comando list-parts, consulte list-parts en la Guía del usuario de AWS Command Line Interface.

    aws s3api list-parts --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id> --query '{Parts: Parts[*].{PartNumber: PartNumber, ETag: ETag, ChecksumSHA256: ChecksumSHA256}}' --output json > parts.json

    Se ha generado un nuevo archivo llamado parts.json. El archivo contiene la información en formato JSON de todas las partes cargadas. El archivo parts.json incluye información esencial para cada parte de la carga multiparte, como los números de parte y sus correspondientes valores de ETag, que son necesarios para completar el proceso de carga multiparte.

  2. Abra parts.json con cualquier editor de texto o a través del terminal. Este es el ejemplo de salida:

    { "Parts": [ { "PartNumber": 1, "ETag": "\"3c3097f89e2a2fece47ac54b243c9d97\"", "ChecksumSHA256": "fTPVHfyNHdv5VkR4S3EewdyioXECv7JBxN+d4FXYYTw=" }, { "PartNumber": 2, "ETag": "\"03c71cc160261b20ab74f6d2c476b450\"", "ChecksumSHA256": "VDWTa8enjOvULBAO3W2a6C+5/7ZnNjrnLApa1QVc3FE=" }, { "PartNumber": 3, "ETag": "\"81ae0937404429a97967dffa7eb4affb\"", "ChecksumSHA256": "cVVkXehUlzcwrBrXgPIM+EKQXPUvWist8mlUTCs4bg8=" } ] }

Paso 6: Completar la carga multiparte

Tras cargar todas las partes de la carga multiparte y mostrarlas, el paso final consiste en completar la carga multiparte. En este paso, se combinan todas las partes cargadas en un único objeto del bucket de S3.

nota

Puede calcular la suma de verificación del objeto antes de llamar a complete-multipart-upload al incluir --checksum-sha256 en la solicitud. Si las sumas de comprobación no coinciden, Amazon S3 produce un error en la solicitud. Para obtener más información, consulte complete-multipart-upload en la Guía del usuario de AWS Command Line Interface.

Completar la carga multiparte

Para finalizar la carga multiparte, use el comando complete-multipart-upload. Este comando requiere el archivo parts.json creado en el Paso 5, el nombre del bucket y el ID de carga. Sustituya <amzn-s3-demo-bucket1> por el nombre del bucket y <your-upload-id> por el ID de carga de parts.json.

aws s3api complete-multipart-upload --multipart-upload file://parts.json --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id>

Este es el ejemplo de salida:

{ "ServerSideEncryption": "AES256", "Location": "https://amzn-s3-demo-bucket1.s3.us-east-2.amazonaws.com/census_data_file", "Bucket": "amzn-s3-demo-bucket1", "Key": "census_data_file", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3" }
nota

No elimine todavía los archivos de partes individuales. Necesitará las partes individuales para poder realizar sumas de comprobación en ellas y comprobar la integridad del objeto fusionado.

Paso 7: Confirmación de que el objeto se ha cargado en el bucket

Tras completar la carga multiparte, puede comprobar que el objeto se ha cargado correctamente en el bucket de S3. Para mostrar los objetos del bucket y confirmar la presencia del archivo recién cargado, utilice el comando list-objects-v2

Muestra del objeto cargado

Para mostrar los objetos del bucket, utilice el comando ‎list-objects-v2. Sustituya amzn-s3-demo-bucket1 por el nombre real del bucket:

aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket1

Este comando devuelve una lista de objetos del bucket. Busque el archivo cargado (por ejemplo, census_data_file) en la lista de objetos.

Para obtener más información, consulte la sección de Ejemplos del comando list-objects-v2 en la Guía del usuario de AWS Command Line Interface.

Paso 8: Comprobación de la integridad del objeto con una suma de comprobación MD5

Al cargar un objeto, puede especificar un algoritmo de suma de comprobación para que lo utilice Amazon S3. De forma predeterminada, Amazon S3 almacena el resumen MD5 de bytes como ETag del objeto. Para cargas multiparte, la ETag no es la suma de comprobación de todo el objeto, sino más bien una combinación de sumas de comprobación para cada parte individual.

Verificación de la integridad del objeto mediante una suma de verificación MD5
  1. Para recuperar la ETag del objeto cargado, realice una solicitud head-object:

    aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file

    Este es el ejemplo de salida:

    { "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }

    Esta ETag tiene un "-3" adjunto al final. Esto indica que el objeto se cargó en tres partes mediante la carga multiparte.

  2. A continuación, calcule la suma de verificación MD5 de cada parte mediante el comando md5sum. Asegúrese de proporcionar la ruta correcta a los archivos de partes:

    md5sum census-part*

    Este es el ejemplo de salida:

    e611693805e812ef37f96c9937605e69 census-part00 63d2d5da159178785bfd6b6a5c635854 census-part01 95b87c7db852451bb38b3b44a4e6d310 census-part02
  3. Para este paso, combine manualmente los hashes MD5 en una sola cadena. A continuación, ejecute el siguiente comando para convertir la cadena en binaria y calcular la suma de comprobación MD5 del valor binario:

    echo "e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310" | xxd -r -p | md5sum

    Este es el ejemplo de salida:

    f453c6dccca969c457efdf9b1361e291 -

    Este valor hash debe coincidir con el valor hash del valor de la ETag original del Paso 1, lo que valida la integridad del objeto census_data_file.

Cuando indica a Amazon S3 que utilice sumas de comprobación adicionales, Amazon S3 calcula el valor de la suma de comprobación de cada parte y almacena los valores. Si quiere recuperar los valores de la suma de comprobación de partes individuales de las cargas multiparte que aún están en progreso, puede utilizar list-parts.

Para obtener más información sobre cómo funcionan las sumas de comprobación con objetos de carga multiparte, consulte Comprobación de la integridad de objetos.

Paso 9: Comprobación de la integridad del objeto con una suma de comprobación adicional

En este paso, este tutorial utiliza SHA-256 como suma de comprobación adicional para validar la integridad del objeto. Si ha utilizado una suma de comprobación adicional diferente, utilice ese valor de suma de comprobación en su lugar.

Verificación de la integridad del objeto con SHA256
  1. Ejecute el siguiente comando en el terminal, incluido el argumento --checksum-mode enabled, para mostrar el valor ChecksumSHA256 del objeto:

    aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file --checksum-mode enabled

    Este es el ejemplo de salida:

    { "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }
  2. Use los siguientes comandos para decodificar los valores ChecksumSHA256 de las partes individuales en base64 y guardarlos en un archivo binario llamado outfile. Estos valores se pueden encontrar en el archivo parts.json. Sustituya las cadenas base64 del ejemplo por los valores ChecksumSHA256 reales.

    echo "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" | base64 --decode >> outfile echo "xCdgs1K5Bm4jWETYw/CmGYr+m6O2DcGfpckx5NVokvE=" | base64 --decode >> outfile echo "f5wsfsa5bB+yXuwzqG1Bst91uYneqGD3CCidpb54mAo=" | base64 --decode >> outfile
  3. Ejecute el siguiente comando para calcular la suma de comprobación SHA256 de outfile:

    sha256sum outfile

    Este es el ejemplo de salida:

    688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile

    En el siguiente paso, tome el valor hash y conviértalo en un valor binario. Este valor binario debe coincidir con el valor ChecksumSHA256 del Paso 1.

  4. Convierta la suma de comprobación SHA256 del Paso 3 en binaria y, a continuación, codifíquela en base64 para comprobar que coincide con el valor ChecksumSHA256 del Paso 1:

    echo "688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9" | xxd -r -p | base64

    Este es el ejemplo de salida:

    aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=

    Esta salida debería confirmar que la salida en base64 coincide con el valor ChecksumSHA256 de la salida del comando head-object. Si la salida coincide con el valor de la suma de comprobación, el objeto es válido.

importante
  • Cuando indica a Amazon S3 que utilice sumas de comprobación adicionales, Amazon S3 calcula los valores de la suma de comprobación de cada parte y almacena estos valores.

  • Si quiere recuperar los valores de la suma de comprobación de partes individuales de las cargas multiparte que aún están en progreso, puede utilizar el comando list-parts.

Paso 10: Eliminar los recursos

Si desea limpiar los archivos creados en este tutorial, use el siguiente método. Para obtener instrucciones sobre cómo eliminar los archivos cargados en el bucket de S3, consulte Eliminación de objetos de Amazon S3.

Elimine los archivos locales creados en el Paso 1:

Para eliminar los archivos que haya creado para la carga multiparte, ejecute el siguiente comando desde el directorio de trabajo:

rm census-data.bin census-part* outfile parts.json