Cómo evitar que un objeto se sobrescriba con escrituras condicionales - Amazon Simple Storage Service

Cómo evitar que un objeto se sobrescriba con escrituras condicionales

Con las escrituras condicionales, puede agregar un encabezado adicional a la solicitud de escritura para especificar condiciones previas a la operación de S3. Esto puede evitar que se sobrescriban los datos existentes al validar que no haya ningún objeto existente con el mismo nombre de clave en el bucket. Las escrituras condicionales funcionan para la solicitud de la API en buckets de uso general y buckets de directorio.

Al cargar un objeto en Amazon S3, se especifica el nombre de la clave. El nombre de la clave es el identificador único con distinción entre mayúsculas y minúsculas de un objeto en un bucket. Si carga un objeto con un nombre de clave idéntico en un bucket sin versión o con versiones suspendidas, el objeto se sobrescribe. En un bucket con versiones, el objeto cargado más recientemente se convertirá en la versión actual del objeto.

Las escrituras condicionales comprobarán la existencia de un objeto durante la operación WRITE. Si se encuentra un nombre de clave idéntico en el bucket, la operación WRITE producirá un error. Con las escrituras condicionales, puede hacer que varios clientes escriban en el mismo bucket sin la posibilidad de sobrescribir los objetos existentes.

Para realizar escrituras condicionales, debe tener el permiso s3:PutObject. Este permiso permite al intermediario comprobar la presencia de objetos en el bucket. Puede usar escrituras condicionales con URL prefirmadas con los SDK de AWS.

nota

Para usar escrituras condicionales, debe realizar las solicitudes a través de HTTPS (TLS) o usar la versión 4 de AWS Signature para firmar la solicitud.

API compatibles:

Las siguientes API de S3 admiten el uso de escrituras condicionales:

Puede usar los siguientes encabezados para escribir un objeto en función del nombre de la clave del objeto. Para obtener información acerca de los nombres de claves de objetos, consulte Denominación de objetos de Amazon S3.

PutObject

  • If-None-Match: Cargue el objeto solo si no existe ningún objeto con el mismo nombre de clave en el bucket especificado. Debe usar el valor * (asterisco) con este parámetro.

El siguiente comando de ejemplo put-object muestra cómo se puede utilizar la AWS CLI para cargar un objeto con un encabezado de escritura condicional mediante el parámetro if-none-match.

aws s3api put-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"

Para obtener más información, consulte put-object en la Referencia de los comandos de AWS CLI.

Para obtener información sobre AWS CLI, consulte ¿Qué es AWS Command Line Interface? en la Guía del usuario de AWS Command Line Interface.

Para obtener más información sobre estos encabezados, consulte PutObject en la referencia de la API de Amazon Simple Storage Service.

CompleteMultipartUpload

  • If-None-Match: Complete la carga solo si no existe ningún objeto con el mismo nombre de clave en el bucket especificado. Debe usar el valor * (asterisco) con este parámetro.

El siguiente comando de ejemplo complete-multipart-upload muestra cómo puede utilizar la AWS CLI para completar una carga multiparte con un encabezado de escritura condicional mediante el parámetro if-none-match.

aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --upload-id uploadID --if-none-match "*"

Para obtener más información, consulte complete-multipart-upload en la Referencia de los comandos de AWS CLI.

Para obtener información sobre AWS CLI, consulte ¿Qué es AWS Command Line Interface? en la Guía del usuario de AWS Command Line Interface.

Para obtener más información sobre estos encabezados, consulte CompleteMultipartUpload en la referencia de la API de Amazon Simple Storage Service.

Comportamiento de escritura condicional

Las escrituras condicionales se comparan con los objetos existentes en un bucket. Si no existe ningún objeto con el mismo nombre de clave en el bucket, la operación de escritura se realiza correctamente y se obtiene una respuesta de 200. Si existe un objeto, se produce un error en la operación de escritura, lo que resulta en una respuesta de 412 Precondition Failed. En el caso de los buckets con el control de versiones activado, S3 comprueba la presencia de una versión actual del objeto con el mismo nombre como parte de la evaluación condicional. Si no hay ninguna versión del objeto actual con el mismo nombre o si la versión actual del objeto es un marcador de eliminación, la operación de escritura se realiza correctamente. De lo contrario, se produce un error en la operación de escritura y se produce una respuesta 412 Precondition Failed.

Si se realizan varias escrituras condicionales para el mismo nombre de objeto, la primera operación de escritura que finalice se realizará correctamente. En ese caso, Amazon S3 producirá un error en las escrituras posteriores con una respuesta 412 Precondition Failed.

También puede recibir una respuesta 409 Conflict en caso de solicitudes simultáneas, si una solicitud de eliminación de un objeto se realiza correctamente antes de que se complete una operación de escritura condicional en ese objeto. Esto se debe a que la solicitud de eliminación tiene prioridad sobre la operación de escritura condicional que se inició anteriormente. Si se utilizan escrituras condicionales con PutObject, es posible que las cargas se vuelvan a intentar después de recibir un error 409. Cuando se utiliza CompleteMultipartUpload, se debe volver a iniciar la carga multiparte con CreateMultipartUpload para volver a cargar el objeto tras recibir un error 409.

Tenga en cuenta los siguientes escenarios en los que dos clientes ejecutan operaciones en el mismo bucket.

Respuesta de condición previa con error, 412

Las escrituras condicionales no consideran ninguna solicitud de cargas multiparte en curso, ya que aún no se trata de objetos completamente escritos. Considere el siguiente ejemplo en el que el cliente 1 carga un objeto mediante la carga multiparte. Durante la carga multiparte, el cliente 2 puede escribir correctamente el mismo objeto con la operación de escritura condicional. Posteriormente, cuando el cliente 1 intenta completar la carga multiparte mediante una escritura condicional, la carga produce un error porque el objeto ya existe.

Un ejemplo de dos clientes que escriben elementos con el mismo nombre de clave. Uno con UploadPart para MPU y otro con PutObject y una escritura condicional. Se produce un error en la operación CompleteMultipartUpload, que se inicia después.
Respuesta de conflicto, 409

Si una solicitud de eliminación se realiza correctamente antes de que se complete una solicitud de escritura condicional, Amazon S3 devuelve una respuesta 409 Conflict para la operación de escritura. Esto se debe a que la solicitud de eliminación que se inició antes tiene prioridad sobre la operación de escritura condicional. Considere el siguiente ejemplo en el que un archivo puppy.txt existe en un bucket. El cliente 1 inicia una carga multiparte de otro archivo también llamado puppy.txt con la intención de completar la carga multiparte con una escritura condicional. Durante la carga, el cliente 2 elimina puppy.txt del bucket. Cuando el cliente 1 intenta usar CompleteMultipartUpload para cargar su propio archivo puppy.txt con una escritura condicional, se producirá un error con una respuesta 409 Conflict. En esos casos, debe iniciar una nueva carga multiparte.

Un ejemplo de dos clientes, uno que utiliza la carga multiparte y otro que envía una solicitud de eliminación una vez que se ha iniciado la MPU. La solicitud de eliminación finaliza antes de que comience la escritura condicional.
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.