Carga y copia de objetos con la carga multiparte en Amazon S3
La carga multiparte permite cargar un solo objeto en Amazon S3 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. Para las cargas, el cliente de AWS actualizado calcula automáticamente una suma de comprobación del objeto y la envía a Amazon S3 junto con el tamaño del objeto como parte de la solicitud. Si la transmisión de cualquier parte falla, puede retransmitir esta parte sin que las demás partes se vean afectadas. Una vez cargadas todas las partes del objeto, Amazon S3 las ensambla para crear el objeto. Es una práctica recomendada utilizar la carga multiparte para objetos de 100 MB o más en lugar de cargarlos en una sola operación.
El uso de la carga multiparte proporciona las siguientes ventajas:
-
Mayor rendimiento: puede cargar las partes al mismo tiempo para aumentar el rendimiento.
-
Recuperación rápida ante cualquier problema de red: una parte de tamaño más pequeño reduce el impacto de tener que reiniciar una carga fallida debido a un error de red.
-
Detención y reanudación de cargas de objetos: puede cargar las partes del objeto con el paso del tiempo. Después de que inicia una carga multiparte, no hay fecha de caducidad, por lo tanto, debe completar o detener de forma explícita la carga multiparte.
-
Inicio de una carga antes de conocer el tamaño final del objeto: puede cargar un objeto a medida que lo crea.
Le recomendamos que use la carga multiparte de las siguientes maneras:
-
Si carga objetos grandes en una red estable de banda ancha, use la carga multiparte para aumentar al máximo el uso del ancho de banda disponible mediante la carga de los objetos en partes y en paralelo para obtener un rendimiento en varios subprocesos.
-
Si realiza la carga en una red irregular, utilice la carga multiparte para aumentar la resiliencia ante errores de red evitando reinicios de la carga. Al usar la carga multiparte, debe volver a intentar cargar solo las partes que se han interrumpido durante la carga. No necesita reiniciar la carga de su objeto desde el principio.
nota
Para obtener más información sobre el uso de la clase de almacenamiento Amazon S3 Express One Zone con buckets de directorio, consulte S3 Express One Zone y Trabajar con buckets de de directorio. Para obtener más información sobre el uso de una carga multiparte con S3 Express One Zone y buckets de directorio, consulte Uso de las cargas multiparte con buckets de directorio.
Proceso de carga multiparte
La carga multiparte es un proceso de tres pasos: inicia la carga, carga las partes del objeto y, después de haber cargado todas las partes, completa la carga multiparte. Al recibir la solicitud de carga multiparte completa, Amazon S3 crea el objeto a partir de las partes cargadas para que pueda obtener acceso al objeto como lo haría con cualquier otro objeto del bucket.
Puede mostrar todas las cargas multipartes en curso u obtener una lista de las partes que ha cargado en una carga multiparte específica. En esta sección, se explicarán cada una de estas operaciones.
Inicio de la carga multiparte
Cuando envíe una solicitud para iniciar una carga multiparte, asegúrese de especificar un tipo de suma de comprobación. Amazon S3 devolverá una respuesta con un ID de carga, que es un identificador único para la carga multiparte. Este ID de carga es necesario cuando se cargan partes, se enumeran partes, se completa una carga o se detiene una carga. Si desea proporcionar metadatos que describen el objeto que se está cargando, debe proporcionarlos en la solicitud para iniciar la carga multiparte.
Carga de partes
Al cargar una parte, debe especificar un número de parte además del ID de carga. 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 no tiene que ser necesariamente una secuencia consecutiva (por ejemplo: puede ser 1, 5 y 14). Tenga en cuenta que si carga una parte nueva con el mismo número que una parte ya cargada, se sobrescribirá la parte existente.
Cuando carga una parte, Amazon S3 devuelve el tipo de algoritmo de suma de comprobación con el valor de suma de comprobación para cada parte como encabezado en la respuesta. Para cada carga de parte, debe anotar el número de parte y el valor de ETag. Debe incluir estos valores en la solicitud posterior para completar la carga multiparte. Cada parte tendrá su propia ETag en el momento de la carga. No obstante, una vez que se completa la carga multiparte y se consolidan todas las partes, todas las partes pertenecen a una ETag como una suma de comprobación de sumas de comprobación.
importante
Después de iniciar una carga multiparte y cargar una o más partes, debe completar o parar la carga multiparte para que no le cobren por el almacenamiento de las partes cargadas. Solo después de completar o detener una carga multiparte, Amazon S3 liberará el almacenamiento de las partes y detendrá el cobro del almacenamiento de partes.
Después de detener una carga multiparte, no puede volver a cargar ninguna parte con ese ID de carga. Si las cargas de partes estuvieran en curso, todavía se pueden ejecutar correctamente o producir un error una vez detenidas. Para asegurarse de que se libera todo el espacio de almacenamiento consumido por las partes, debe parar una carga multiparte solo después de haber completado las cargas de todas las partes.
Finalización de la carga multiparte
Al completar una carga multiparte, Amazon S3 crea un objeto al concatenar las partes en orden ascendente según el número de parte. Si se proporcionaron los metadatos de algún objeto en la solicitud inicio de carga multiparte, Amazon S3 asocia estos metadatos al objeto. Después de una solicitud de completar realizada correctamente, las partes ya no existirán.
La solicitud de carga multiparte completa debe incluir el ID de carga y una lista de ambos números de parte y los valores de ETag correspondientes. La respuesta de Amazon S3 incluye una ETag que identifica de forma exclusiva los datos de objetos combinados. Esta ETag no es necesariamente un hash de MD5 de los datos del objeto.
Cuando proporciona una suma de comprobación de objeto completa durante una carga multiparte, el SDK de AWS pasa la suma de comprobación a Amazon S3 y S3 valida la integridad del objeto en el servidor y lo compara con el valor recibido. A continuación, S3 almacena el objeto si los valores coinciden. Si los dos valores no coinciden, Amazon S3 no realiza la solicitud y genera el error BadDigest
. La suma de comprobación del objeto también se almacena en los metadatos del objeto que utilizará más adelante para validar la integridad de los datos de un objeto.
Ejemplo de llamadas de carga multiparte
En este ejemplo, suponga que está generando una carga multiparte para un archivo de 100 GB. En tal caso tendría las siguientes llamadas a la API para todo el proceso. Habría un total de 1002 llamadas a la API.
-
Una llamada
CreateMultipartUpload
para iniciar el proceso. -
1000 llamadas
UploadPart
individuales y cada una carga una parte de 100 MB, con un tamaño total de 100 GB. -
Una llamada
CompleteMultipartUpload
para completar el proceso.
Listas de cargas multiparte
Puede enumerar las partes de una carga multiparte específica o todas las cargas multipartes en curso. La operación de enumeración de partes devuelve la información de las partes que ha cargado para una carga multiparte específica. Para cada solicitud de lista de partes, Amazon S3 devuelve la información de las partes para la carga multiparte específica, hasta un máximo de 1000 partes. Si hay más de 1000 partes en la carga multiparte, debe enviar una serie de solicitudes de lista de partes para recuperar todas las partes. Tenga en cuenta que la lista de partes que se devuelve no incluye las partes que no hayan terminado de cargarse. Con la operación lista de cargas multiparte, puede obtener una lista de las cargas multiparte en curso.
Una carga multiparte en curso es una carga iniciada, pero que aún no se ha completado ni parado. Cada solicitud devuelve 1 000 cargas multipartes como máximo. Si hay más de 1 000 cargas multiparte en curso, debe enviar otras solicitudes para recuperar las cargas multiparte restantes. Solo utilice la lista devuelta para fines de verificación.
importante
No utilice el resultado de esta lista al enviar una solicitud para completar la carga multiparte. En cambio, mantenga su propia lista de números de parte que especificó al cargarlas y los valores correspondientes de ETag que devuelve Amazon S3.
Sumas de comprobación con operaciones de carga multiparte
Al cargar un objeto en Amazon S3, puede especificar un algoritmo de suma de comprobación para que lo utilice Amazon S3. De forma predeterminada, el SDK de AWS y la consola de S3 utilizan un algoritmo para todas las cargas de objetos, que puede anular. Si utiliza un SDK más antiguo y el objeto cargado no tiene una suma de comprobación especificada, Amazon S3 utiliza automáticamente el algoritmo de suma de comprobación CRC-64/NVME (CRC64NVME
). (Esta también es la opción recomendada para una verificación eficiente de la integridad de los datos). Cuando se utiliza CRC-64/NVME, Amazon S3 calcula la suma de comprobación del objeto completo después de que se complete la carga multiparte o de una sola parte. El algoritmo de suma de comprobación CRC-64/NVME se utiliza para calcular una suma de comprobación directa de todo el objeto o una suma de comprobación de las sumas de comprobación de cada parte individual.
Después de cargar un objeto en S3 mediante la carga multiparte, Amazon S3 calcula el valor de suma de comprobación para cada parte, o para el objeto completo, y almacena los valores. Puede utilizar la API de S3 o el SDK de AWS para recuperar el valor de la suma de comprobación de las siguientes maneras:
-
Para partes individuales, puede utilizar
GetObject
oHeadObject
. Si quiere recuperar los valores de la suma de comprobación de partes individuales de las cargas multiparte mientras aún están en proceso, puede utilizarListParts
. -
Para todo el objeto, puede utilizar
PutObject
. Si desea realizar una carga multiparte con una suma de comprobación de objeto completo, utiliceCreateMultipartUpload
yCompleteMultipartUpload
; para ello, especifique el tipo de suma de comprobación de objeto completo. Para validar el valor de suma de comprobación del objeto completo o para confirmar qué tipo de suma de comprobación se está utilizando en la carga multiparte, utiliceListParts
.
importante
Si utiliza una carga multiparte con Sumas de comprobación, los números de parte de cada carga de parte (en la carga multiparte) deben utilizar números de parte consecutivos. Al utilizar Sumas de comprobación, si intenta completar una solicitud de carga multiparte con números de parte no consecutivos, Amazon S3 genera un error HTTP 500 Internal Server
.
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 en Amazon S3.
Para ver un procedimiento completo que muestra cómo cargar un objeto mediante la carga multiparte con una suma de comprobación adicional, consulte Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos.
Operaciones de carga multiparte simultáneas
En un entorno de desarrollo distribuido, es posible que la aplicación inicie varias actualizaciones en el mismo objeto simultáneamente. La aplicación puede iniciar varias cargas multipartes con la misma clave de objeto. Para cada una de estas cargas, la aplicación puede cargar las partes y enviar una solicitud de carga completa a Amazon S3 para crear el objeto. Cuando los buckets tienen el control de versiones de S3 habilitado, siempre se creará una nueva versión cuando se complete una carga multiparte. Al iniciar varias cargas multiparte que utilizan la misma clave de objeto en un bucket con el control de versiones habilitado, la versión actual del objeto viene determinada por la carga que se haya iniciado más recientemente (createdDate
).
Por ejemplo, inicia una solicitud CreateMultipartUpload
para un objeto a las 10:00 h. A continuación, envía una segunda solicitud CreateMultipartUpload
para el mismo objeto a las 11:00 h. Como la segunda solicitud se envió más recientemente, el objeto cargado por la solicitud de las 11:00 h es la versión actual, incluso si la primera carga se completa después de la segunda. Para los buckets que no tienen habilitado el control de versiones, es posible que cualquier otra solicitud recibida entre el momento en que se inicia la carga multiparte y cuando se completa, la otra solicitud pueda tener prioridad.
Otro ejemplo de cuándo una solicitud de carga multiparte simultánea puede tener prioridad es si otra operación elimina una clave después de que inicie una carga multiparte con esa clave. Antes de completar la operación, la respuesta de carga multiparte completa podría indicar una creación correcta del objeto sin que vea el objeto.
Impedimento para que se carguen objetos con nombres de claves idénticos durante la carga multiparte
Puede comprobar la existencia de un objeto en el bucket antes de crearlo mediante una operación condicional de escritura al cargar. Esto puede evitar que se sobrescriban los datos existentes. Las escrituras condicionales validarán que no haya ningún objeto existente con el mismo nombre de clave en el bucket al realizar la carga.
Puede usar escrituras condicionales para las solicitudes de PutObject o CompletemUltipartUpload.
Para obtener más información sobre las solicitudes condicionales, consulte Agregación de condiciones previas a operaciones de S3 con solicitudes condicionales.
Carga multiparte y precios
Después de iniciar una carga multiparte, Amazon S3 retiene todas las partes hasta que complete o detenga la carga. Durante la vida útil, se le cobrará por todo el almacenamiento, el ancho de banda y las solicitudes para esta carga multiparte y sus partes asociadas.
Estas partes se facturan según la clase de almacenamiento especificada cuando se cargaron las partes. No obstante, no se le facturarán estas partes si se cargan en S3 Glacier Flexible Retrieval o S3 Glacier Deep Archive. Las partes multiparte en curso para la solicitud PUT a la clase de almacenamiento S3 Glacier Flexible Retrieval se facturan como almacenamiento provisional S3 Glacier Flexible Retrieval a las tarifas de almacenamiento de S3 Standard hasta que se complete la carga. Además, CreateMultipartUpload
y UploadPart
se facturan según las tarifas de S3 Standard. Solo la solicitud CompleteMultipartUpload
se factura con la tarifa de S3 Glacier Flexible Retrieval. Del mismo modo, las partes multiparte en curso para PUT a la clase de almacenamiento S3 Glacier Deep Archive se facturan como almacenamiento provisional S3 Glacier Flexible Retrieval a las tarifas de almacenamiento de S3 Standard hasta que se complete la carga, con solo la solicitud CompleteMultipartUpload
cobrada según las tarifas de S3 Glacier Deep Archive.
Si detiene la carga multiparte, Amazon S3 elimina los artefactos cargados y todas las partes que haya cargado. No se le facturarán esos artefactos. No se cobran gastos de eliminación anticipada por eliminar cargas multiparte incompletas, independientemente de la clase de almacenamiento especificada. Para obtener más información acerca de los precios, consulte Precios de Amazon S3
nota
Para reducir los costos de almacenamiento, se recomienda configurar una regla del ciclo de vida para eliminar las cargas multiparte incompletas al cabo de un número específico de días mediante la acción AbortIncompleteMultipartUpload
. Para obtener más información sobre cómo crear una regla de ciclo de vida para eliminar las cargas multiparte incompletas, consulte Configuración de una política de ciclo de vida del bucket para eliminar cargas multiparte incompletas.
Compatibilidad de la API con las cargas multiparte
Las siguientes secciones de la referencia de API de Amazon Simple Storage Service describen la API de REST para la carga multiparte.
Para ver un tutorial de carga de varias partes donde se utilicen funciones de AWS Lambda, consulte Uploading large objects to Amazon S3 using multipart upload and transfer acceleration
Compatibilidad de AWS Command Line Interface con cargas multiparte
En los siguientes temas de AWS Command Line Interface, se describen las operaciones para la carga multiparte.
Compatibilidad de AWS SDK con cargas multiparte
Puede utilizar un AWS SDK para cargar un objeto en partes. Para obtener una lista de los AWS SDK compatibles con la acción de la API, consulte:
API y permisos de carga multiparte
Debe tener los permisos necesarios para utilizar las operaciones de carga multiparte. Puede utilizar listas de control de acceso (ACL), la política de bucket o la política de usuario para conceder permisos para realizar estas operaciones. En la siguiente tabla se muestran los permisos requeridos para varias operaciones de carga multiparte al utilizar las ACL, una política de bucket o una política de usuario.
Acción | Permisos necesarios |
---|---|
Crear carga multiparte |
Debe tener permiso para realizar la acción El propietario del bucket puede permitir a otros clientes realizar la acción |
Initiate Multipart Upload |
Debe tener permiso para realizar la acción El propietario del bucket puede permitir a otros clientes realizar la acción |
Initiator | Elemento contenedor que identifica quién inició la carga multiparte. Si el iniciador es una Cuenta de AWS, este elemento proporcionará la misma información que el elemento Propietario. Si el iniciador es un usuario de IAM, este elemento proporciona el ARN de usuario y el nombre para mostrar. |
Upload Part | Debe tener permiso para realizar la acción El propietario del bucket debe permitir al iniciador realizar la acción |
Upload Part (Copy) | Debe tener permiso para realizar la acción Para que el iniciador cargue una parte del objeto, el propietario del bucket debe permitir al iniciador realizar la acción |
Complete Multipart Upload | Debe tener permiso para realizar la acción El propietario del bucket debe permitir al iniciador realizar la acción |
Detener carga multiparte | Debe tener permiso para realizar la acción De forma predeterminada, el propietario del bucket y el iniciador de la carga multiparte deben tener permiso para realizar esta acción como parte de las políticas de bucket de S3 e IAM. Si el iniciador es un usuario de IAM, la Cuenta de AWS correspondiente a dicho usuario también tendrá permiso para parar esa carga multiparte. Con las políticas de punto de conexión de VPC, el iniciador de la carga multiparte no obtiene automáticamente permiso para realizar la acción Además de estas opciones predeterminadas, el propietario del bucket puede permitir a otras entidades principales realizar la acción |
List Parts | Debe tener permiso para realizar la acción De forma predeterminada, el propietario del bucket tiene permiso para mostrar las partes de cualquier carga multiparte en el bucket. El iniciador de la carga multiparte tiene permiso para mostrar las partes de la carga multiparte específica. Si el iniciador de la carga multiparte es un usuario de IAM, la Cuenta de AWS que lo controla tiene permiso para mostrar las partes de esa carga. Además de estas opciones predeterminadas, el propietario del bucket puede permitir a otras entidades principales realizar la acción |
List Multipart Uploads | Debe tener permiso para realizar la acción Además de esta opción predeterminada, el propietario del bucket puede permitir a otras entidades principales realizar la acción |
Permisos relacionados con el cifrado y descifrado de AWS KMS |
Para realizar una carga multiparte con cifrado mediante una clave de KMS de AWS Key Management Service (AWS KMS), el solicitante debe tener los siguientes permisos:
Estos permisos son necesarios, ya que Amazon S3 debe descifrar y leer datos de las partes de archivos cifrados antes de finalizar la carga multiparte. El permiso Si el usuario o rol de IAM está en la misma Cuenta de AWS que la clave de KMS, valide que tiene permisos tanto en la clave como en las políticas de IAM. Si el usuario o rol de IAM pertenecen a una cuenta distinta de la de la clave de KMS, debe tener los permisos tanto en la política de claves como en el usuario o rol de IAM. |
SSE-C (cifrado del servidor con claves de cifrado proporcionadas por el cliente) | Cuando utilice la API CompleteMultipartUpload, debe proporcionar el SSE-C (cifrado del servidor con claves de cifrado proporcionadas por el cliente); de lo contrario, el objeto se creará sin una suma de comprobación y no se devolverá ningún valor de suma de comprobación. |
Para obtener información acerca de la relación entre los permisos de la Access Control List (ACL, Lista de control de acceso) y los permisos de las políticas de acceso, consulte Mapeo de permisos de ACL y permisos de política de acceso. Para obtener información acerca de los usuarios, los roles y las prácticas recomendadas de IAM, consulte Identidades (usuarios, grupos de usuarios y roles) de IAM en la Guía del usuario de IAM.
Sumas de comprobación con operaciones de carga multiparte
Hay tres API de Amazon S3 que se utilizan para realizar la carga multiparte real: CreateMultipartUpload
, UploadPart
y CompleteMultipartUpload
. La siguiente tabla indica qué encabezados y valores de suma de comprobación deben proporcionarse para cada una de las API:
Algoritmo de suma de comprobación | Tipo de suma de comprobación | CreateMultipartUpload |
UploadPart |
CompleteMultipartUpoad |
---|---|---|---|---|
CRC-64/NVME ( |
Objeto completo | Encabezados obligatorios:
|
Encabezados opcionales:
|
Encabezados opcionales:
|
CRC-32 ( CRC 32-C ( |
Objeto completo |
Encabezados obligatorios:
|
Encabezados opcionales:
|
Encabezados opcionales:
|
CRC-32 ( CRC-32C ( SHA-1 ( SHA-256 ( |
Compuesto |
Encabezados obligatorios:
|
Encabezados obligatorios:
|
Encabezados obligatorios: Todas las sumas de comprobación en el nivel de parte deben incluirse en la solicitud Encabezados opcionales:
|