Cómo evitar que un objeto se sobrescriba con escrituras condicionales
Mediante las escrituras condicionales, puede agregar un encabezado adicional a las solicitudes WRITE
para especificar condiciones previas a la operación de Amazon S3. Para escribir objetos de forma condicional, agregue el encabezado HTTP If-None-Match
o If-Match
.
El encabezado If-None-Match
evita sobrescribir datos existentes al validar que no haya un objeto con el mismo nombre de clave ya en el bucket.
De forma alternativa, puede agregar el encabezado If-Match
para verificar la etiqueta de entidad (ETag) de un objeto antes de escribirlo. Con este encabezado, Amazon S3 compara el valor de ETag proporcionado con el valor de ETag del objeto en S3. Si los valores de ETag no coinciden, se produce un error en la operación.
Los propietarios de buckets pueden utilizar políticas de bucket para aplicar escrituras condicionales a los objetos cargados. Para obtener más información, consulte Aplicación de escrituras condicionales en buckets de Amazon S3.
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.
Temas
Cómo evitar sobrescrituras de objetos basadas en nombres de clave
Puede utilizar el encabezado condicional HTTP If-None-Match
para comprobar si un objeto ya existe en el bucket especificado en función del nombre de clave antes de crearlo. Cuando cargue un objeto en Amazon S3, especifique el nombre de clave: un identificador único que distinga entre mayúsculas y minúsculas de un objeto en un bucket. Sin el encabezado HTTP If-None-Match
, 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 convierte en la versión actual del objeto. Las escrituras condicionales con el encabezado HTTP If-None-Match
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 producirá un error. Para obtener más información sobre el uso de nombres de clave, consulte Denominación de objetos de Amazon S3.
Para realizar escrituras condicionales con el encabezado HTTP If-None-Match
, debe tener el permiso s3:PutObject
. Esto permite a la persona que llama comprobar la presencia de objetos en el bucket. El encabezado If-None-Match
espera el valor * (asterisco).
Puede utilizar el encabezado If-None-Match
con las siguientes API:
El siguiente comando put-object
de ejemplo intenta realizar una escritura condicional para un objeto con el nombre de clave dir-1/my_images.tar.bz2
.
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
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.
Cómo evitar sobrescrituras si el objeto ha cambiado
La ETag de un objeto es una cadena que es única para el objeto y refleja un cambio en el contenido del objeto. Puede utilizar el encabezado If-Match
para comparar el valor de ETag de un objeto en un bucket de Amazon S3 con uno que proporcione durante la operación WRITE
. Si los valores de ETag no coinciden, se produce un error en la operación. Para obtener más información sobre las ETag, consulte Uso de Content-MD5 y ETag para verificar los objetos cargados.
Para realizar escrituras condicionales con un encabezado HTTP If-Match
, debe tener los permisos s3:PutObject
y s3:GetObject
. Esto permite al intermediario comprobar la ETag y verificar el estado de los objetos en el bucket. El encabezado If-Match
espera el valor de la ETag en forma de cadena.
Puede utilizar el encabezado If-Match
con las siguientes API:
El siguiente comando put-object
de ejemplo intenta realizar una escritura condicional con el valor de ETag proporcionado 6805f2cfc46c0f04559748bb039d69ae
.
aws s3api put-object --bucket
amzn-s3-demo-bucket
--key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69ae
"
Para obtener más información, consulte put-object
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.
Comportamiento de escritura condicional
- Escrituras condicionales con encabezado
If-None-Match
-
Las escrituras condicionales con el encabezado
If-None-Match
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 de200 OK
. Si existe un objeto, se produce un error en la operación de escritura y se obtiene una respuesta de412 Precondition Failed
.Para los buckets con el control de versiones habilitado, 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 realiza correctamente. 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. Si se utilizan escrituras condicionales conPutObject
, es posible que las cargas se vuelvan a intentar después de recibir un error409 Conflict
. Cuando se utilizaCompleteMultipartUpload
, se debe volver a iniciar la carga multiparte completa conCreateMultipartUpload
para volver a cargar el objeto tras recibir un error409 Conflict
. - Escrituras condicionales con encabezado
If-Match
-
El encabezado
If-Match
se compara con los objetos existentes en un bucket. Si existe un objeto con el mismo nombre de clave y ETag coincidente, la operación de escritura se realiza correctamente y se obtiene una respuesta200 OK
. Si la ETag no coincide, se produce un error en la operación de escritura y se produce una respuesta412 Precondition Failed
.También puede recibir una respuesta
409 Conflict
en caso de solicitudes simultáneas.Recibirá una respuesta
404 Not Found
si una solicitud simultánea de eliminación de un objeto se realiza correctamente antes de que finalice una operación de escritura condicional en ese objeto, porque la clave del objeto ya no existe. Debe volver a cargar el objeto cuando reciba una respuesta404 Not Found
.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, se produce el error
404 Not Found
en la operación.
Escenarios de escritura condicional
Tenga en cuenta los siguientes escenarios en los que dos clientes ejecutan operaciones en el mismo bucket.
Escrituras condicionales durante las cargas multiparte
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.
nota
Este escenario dará lugar a una respuesta 412 Precondition Failed
para los encabezados If-None-Match
y If-Match
.

Eliminaciones simultáneas durante las cargas multiparte
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
o 404 Not Found
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. En esos casos, debe iniciar una nueva carga multiparte.
nota
Este escenario producirá una respuesta 409 Conflict
para un encabezado If-None-Match
y una respuesta 404 Not Found
para un encabezado If-Match
.

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.