Cómo realizar eliminaciones condicionales
Puede usar las eliminaciones condicionales para evaluar si el objeto existe o no ha cambiado antes de eliminarlo. Puede realizar eliminaciones condicionales mediante las operaciones de la API DeleteObject o DeleteObjects en los buckets de directorio y de uso general de S3. Para empezar, al realizar una solicitud de eliminación condicional, puede usar el encabezado HTTP If-Match con el valor de condición previa * para comprobar si el objeto existe o el encabezado If-Match con la ETag proporcionada para comprobar si el objeto se ha modificado.
Puede aplicar las eliminaciones condicionales por bucket de uso general mediante el bucket de S3 o las políticas de Identity and Access Management (IAM). Para obtener más información, consulte Aplicación de eliminaciones condicionales en buckets de Amazon S3.
nota
Las evaluaciones de eliminación condicional solo se aplican a la versión actual del objeto.
Temas
Cómo comprobar si el objeto se ha modificado antes de eliminarlo
Con las eliminaciones condicionales, puede proteger la aplicación de las eliminaciones accidentales de objetos. Puede utilizar el encabezado HTTP If-Match con el valor ETag para comprobar si un objeto se ha modificado. Si el valor ETag de un objeto de un bucket de S3 no coincide con la ETag que proporcionó durante la operación de eliminación, la operación produce un error. Para eliminar varios objetos de forma condicional mediante la operación DeleteObjects, debe proporcionar el valor ETag del elemento ETag del objeto en el cuerpo de la solicitud de XML. Para obtener más información, consulte Uso de Content-MD5 y ETag para verificar los objetos cargados.
nota
Para realizar eliminaciones condicionales con el encabezado If-Match con el valor ETag, debe tener los permisos s3:DeleteObject y s3:GetObject.
El encabezado If-Match con el valor ETag se compara con los objetos existentes en un bucket. Si existe un objeto con el mismo nombre de clave y coincidente con ETag, las solicitudes de DeleteObject se realizan correctamente y devuelve una respuesta 204 No content. Si ETag no coincide, se produce un error en la operación de eliminación con una respuesta 412 Precondition Failed. Si se ejecuta correctamente, la API DeleteObjects responde con un 200 OK y proporciona el estado de cada objeto en el cuerpo de la respuesta de la solicitud de eliminación por lotes. Si no se cumplen las condiciones previas de una solicitud de DeleteObjects, Amazon S3 elimina los objetos y devuelve una respuesta de error Pre-condition errónea.
También puede recibir una respuesta de error 409 Conflict en caso de solicitudes simultáneas si una solicitud de DELETE o PUT a un objeto se realiza correctamente antes de que se complete una operación de eliminación condicional en ese objeto. 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.
Puede utilizar el encabezado If-Match con el valor ETag para las API siguientes:
El siguiente comando delete-object de ejemplo intenta realizar una eliminación condicional con el valor de ETag proporcionado 6805f2cfc46c0f04559748bb039d69al.
aws s3api delete-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2--if-match "6805f2cfc46c0f04559748bb039d69al"
Para obtener más información, consulte delete-object
El siguiente comando delete-objects de ejemplo intenta realizar una eliminación condicional con el valor de ETag proporcionado 6805f2cfc46c0f04559748bb039d69al.
aws s3api delete-objects --bucketamzn-s3-demo-bucket--delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}'
Para obtener más información, consulte delete-objects
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 comprobar si el objeto existe antes de eliminarlo
Puede utilizar el encabezado If-Match con el valor * para comprobar si el objeto existe antes de intentar eliminarlo. El valor * significa que la operación solo debe continuar si el objeto existe, independientemente de si se ha modificado o no.
Los marcadores de eliminación son objetos especiales en los buckets de uso general versionados de S3 que indican que se ha eliminado un objeto. Son marcadores de posición que hacen que el objeto parezca eliminado y, al mismo tiempo, conservan las versiones anteriores. Por lo tanto, cuando se utiliza If-Match:* con una API DeleteObject, la operación solo se realizará correctamente con 204 No Content si el objeto existe. Si la versión más reciente del objeto es un marcador de eliminación, el objeto no existe y la API DeleteObject producirá un error y devolverá una respuesta 412 Precondition Failed. Para obtener más información acerca de los marcadores de eliminación, consulte Trabajar con marcadores de eliminación.
Para eliminar varios objetos de forma condicional mediante la operación DeleteObjects, puede proporcionar * en el elemento ETag del objeto en el cuerpo de la solicitud de XML. Si la condición previa se cumple, la operación DeleteObjects responde con un 200 OK y proporciona el estado de cada objeto en el cuerpo de la respuesta. Si la condición previa se cumple, la respuesta de ese objeto se capturará en el elemento <Deleted> del cuerpo de la respuesta. Si la condición previa produce un error, la respuesta de ese objeto se capturará en el elemento <Error> del cuerpo de la respuesta. Si el objeto no existe al evaluar cualquiera de las condiciones previas, S3 rechaza la solicitud y devuelve una respuesta de error Not Found.
nota
Para realizar eliminaciones condicionales con If-Match:*, debe tener permisos s3:DeleteObject.
Puede utilizar el encabezado If-Match con el valor * para las API siguientes:
El comando de ejemplo delete-object siguiente intenta realizar una eliminación condicional de un objeto con el nombre de clave que tiene un valor de my_images.tar.bz2* que representa cualquier ETag.
aws s3api delete-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2--if-match "*"
Para obtener más información, consulte delete-object
El comando de ejemplo delete-objects siguiente intenta realizar una eliminación condicional de un objeto con el nombre de clave que tiene un valor de my_images.tar.bz2* que representa cualquier ETag.
aws s3api delete-objects --bucketamzn-s3-demo-bucket--delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}'
Para obtener más información, consulte delete-objects
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.