

# Agregación de condiciones previas a operaciones de S3 con solicitudes condicionales
<a name="conditional-requests"></a>

Puede usar solicitudes condicionales para agregar condiciones previas a las operaciones de S3. Para usar solicitudes condicionales, se agrega un encabezado adicional a la operación de la API de Amazon S3. Este encabezado especifica una condición que, si no se cumple, provocará un error en la operación de S3.

Se admiten lecturas condicionales para solicitudes `GET`, `HEAD` y `COPY`. Puede agregar condiciones previas para devolver o copiar un objeto en función de su etiqueta de entidad (ETag) o de la fecha de la última modificación. Esto puede limitar una operación de S3 a los objetos actualizados desde una fecha específica. También puede limitar una operación de S3 a una ETag específica. Esto podría garantizar que solo devuelva o copie una versión de objeto específica. Para obtener más información acerca de los metadatos del objeto, consulte [Trabajar con metadatos de objeto](UsingMetadata.md).

Las escrituras condicionales pueden garantizar que no haya ningún objeto existente con el mismo nombre de clave en el bucket durante las operaciones `PUT`. Esto evita que se sobrescriban los objetos existentes con nombres de clave idénticos. Del mismo modo, puede utilizar escrituras condicionales para comprobar si la ETag de un objeto no ha cambiado antes de actualizarlo. Esto evita sobrescrituras involuntarias en un objeto sin conocer el estado del contenido. Puede usar escrituras condicionales para las solicitudes de [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html), [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) o [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html). Para obtener más información sobre nombres de clave, consulte [Denominación de objetos de Amazon S3](object-keys.md).

Las eliminaciones condicionales evalúan si el objeto existe o no ha cambiado antes de eliminarlo. Puede realizar eliminaciones condicionales mediante las API `DeleteObject` o `DeleteObjects` en los buckets de directorio y de uso general. Para obtener más información sobre las eliminaciones condicionales, consulte [Cómo realizar eliminaciones condicionales](conditional-deletes.md). No hay cargos adicionales para las lecturas, escrituras o eliminaciones condicionales. Solo se le cobrarán las tarifas existentes para las solicitudes aplicables, incluidas las solicitudes erróneas. Para obtener información sobre las características y precios de Amazon S3, consulte [Precios de Amazon S3](https://aws.amazon.com/s3/pricing).

**Topics**
+ [Cómo recuperar o copiar objetos en función de metadatos con lecturas condicionales](conditional-reads.md)
+ [Cómo evitar que un objeto se sobrescriba con escrituras condicionales](conditional-writes.md)
+ [Cómo realizar eliminaciones condicionales](conditional-deletes.md)

# Cómo recuperar o copiar objetos en función de metadatos con lecturas condicionales
<a name="conditional-reads"></a>

Con las lecturas condicionales, puede agregar un encabezado adicional a la solicitud de lectura para agregar condiciones previas a la operación de S3. Si no se cumplen estas condiciones previas, la solicitud de lectura producirá un error.

Puede utilizar lecturas condicionales en solicitudes `GET`, `HEAD` y `COPY` para devolver solo un objeto en función de sus metadatos.

Cuando carga un objeto, Amazon S3 crea metadatos controlados por el sistema que solo S3 puede modificar. Las etiquetas de entidad (ETags) y última modificación son ejemplos de metadatos controlados por el sistema. La ETag de un objeto es una cadena que representa una versión específica de un objeto. La fecha de última modificación son los metadatos que representan la fecha de creación de un objeto o la última fecha de modificación, si esta última fecha es posterior a la primera.

Con las lecturas condicionales, puede devolver un objeto en función de la ETag o de la fecha de última modificación de un objeto. Puede especificar un valor de ETag con la solicitud y devolver el objeto solo si el valor de ETag coincide. Esto podría garantizar que solo devuelva o copie una versión específica de un objeto. Puede especificar un valor de última modificación en la solicitud de lectura y devolver un objeto solo si ese objeto se ha modificado desde la fecha que proporcione. 

## API compatibles:
<a name="conditional-read-apis"></a>

Las siguientes API de S3 admiten el uso de lecturas condicionales:
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

Puede usar los siguientes encabezados para devolver un objeto que dependa de la etiqueta de entidad (ETag) o de la fecha de la última modificación. Para obtener más información acerca de los metadatos de objetos, como ETag y última modificación, consulte [Metadatos de objetos definidos por el sistema](UsingMetadata.md#SysMetadata).

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)**  

+ `If-Match`: Devuelva el objeto solo si su ETag coincide con la proporcionada. 
+ `If-Modified-Since`: Devuelva el objeto solo si se ha modificado desde el tiempo especificado.
+ `If-None-Match`: Devuelva el objeto solo si su ETag no coincide con la proporcionada.
+ `If-Unmodified-Since`: Devuelva el objeto solo si no se ha modificado desde el tiempo especificado.

Para obtener más información acerca de estos encabezados, los errores devueltos y el orden en que S3 gestiona varios encabezados condicionales en una sola solicitud, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) en la referencia de la API de Amazon Simple Storage Service.

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)**  

+ `If-Match`: Devuelva el objeto solo si su ETag coincide con la proporcionada. 
+ `If-Modified-Since`: Devuelva el objeto solo si se ha modificado desde el tiempo especificado.
+ `If-None-Match`: Devuelva el objeto solo si su ETag no coincide con la proporcionada.
+ `If-Unmodified-Since`: Devuelva el objeto solo si no se ha modificado desde el tiempo especificado.

Para obtener más información acerca de estos encabezados, los errores devueltos y el orden en que S3 gestiona varios encabezados condicionales en una sola solicitud, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) en la referencia de la API de Amazon Simple Storage Service.

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)**  

+ `x-amz-copy-source-if-match`: Copia el objeto de origen solo si su ETag coincide con la proporcionada. 
+ `x-amz-copy-source-if-modified-since`: Copia el objeto de origen solo si se ha modificado desde el tiempo especificado.
+ `x-amz-copy-source-if-none-match`: Copia el objeto de origen solo si su ETag no coincide con la proporcionada.
+ `x-amz-copy-source-if-unmodified-since`: Copia el objeto de origen solo si no se ha modificado desde el tiempo especificado.
+ `If-Match`: copia el objeto solo si su ETag coincide con la proporcionada. `If-Match` espera el valor de la ETag en forma de cadena.
+ `If-None-Match`: copia el objeto solo si su ETag no coincide con la proporcionada. `If-None-Match`espera el carácter '\$1' (asterisco).

Para obtener más información acerca de estos encabezados, los errores devueltos y el orden en que S3 gestiona varios encabezados condicionales en una sola solicitud, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) en la referencia de la API de Amazon Simple Storage Service.

# Cómo evitar que un objeto se sobrescriba con escrituras condicionales
<a name="conditional-writes"></a>

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](conditional-writes-enforce.md).

**nota**  
Si desea utilizar escrituras condicionales, debe utilizar la versión 4 de AWS Signature para firmar la solicitud.

**Topics**
+ [Cómo evitar sobrescrituras de objetos basadas en nombres de clave](#conditional-write-key-names)
+ [Cómo evitar sobrescrituras si el objeto ha cambiado](#conditional-write-etags)
+ [Comportamiento de escritura condicional](#conditional-error-response)
+ [Escenarios de escritura condicional](#conditional-write-scenarios)
+ [Aplicación de escrituras condicionales en buckets de Amazon S3](conditional-writes-enforce.md)

## Cómo evitar sobrescrituras de objetos basadas en nombres de clave
<a name="conditional-write-key-names"></a>

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 o copiarlo en el bucket de destino.

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. Sin el encabezado HTTP `If-None-Match`, si carga o copia un objeto con un nombre de clave idéntico en un bucket sin versión o con versiones suspendidas, el objeto se sobrescribe. Para obtener más información sobre el uso de nombres de clave, consulte [Denominación de objetos de Amazon S3](object-keys.md).

**nota**  
El encabezado `If-None-Match` HTTP solo se aplica a la versión actual de un objeto en un bucket de versiones.

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 \$1 (asterisco).

Puede utilizar el encabezado `If-None-Match` con las siguientes API:
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

### Colocación condicional mediante la AWS CLI
<a name="conditional-writes-putobject-CLI-key-names"></a>

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 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

### Copia condicional mediante la AWS CLI
<a name="conditional-writes-copyobject-CLI-key-names"></a>

El comando de ejemplo `copy-object` intenta copiar un objeto en un bucket de destino con una escritura condicional para un objeto con el nombre de clave `dir-1/my_images.tar.bz2`.

```
aws s3api copy-object --copy-source amzn-s3-demo-bucket/key --key dir-1/my_images.tar.bz2 --bucket amzn-s3-demo-bucket2 --if-none-match "*"            
```

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

### Carga condicional de multiparte mediante la AWS CLI
<a name="conditional-writes-mpu-complete-CLI-key-names"></a>

El comando de ejemplo `complete-multipart-upload` intenta completar una carga multiparte con una escritura condicional para un objeto con el nombre de clave `dir-1/my_images.tar.bz2`. En este ejemplo, el prefijo file:// se usa para cargar la estructura JSON desde un archivo de la carpeta local denominada `mpustruct` que muestra todas las partes que se han cargado para esta carga multiparte específica.

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

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

## Cómo evitar sobrescrituras si el objeto ha cambiado
<a name="conditional-write-etags"></a>

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](checking-object-integrity-upload.md#checking-object-integrity-etag-and-md5).

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:
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

### Colocación condicional mediante la AWS CLI
<a name="conditional-writes-putobject-CLI-etags"></a>

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 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

### Copia condicional mediante la AWS CLI
<a name="conditional-writes-copyobject-CLI-etags"></a>

El siguiente comando `copy-object` de ejemplo intenta realizar una escritura condicional con el valor de ETag proporcionado `6805f2cfc46c0f04559748bb039d69ae`.

```
aws s3api copy-object --copy-source amzn-s3-demo-bucket/key --key dir-1/my_images.tar.bz2 --bucket amzn-s3-demo-bucket2 --if-match "6805f2cfc46c0f04559748bb039d69ae"             
```

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

### Carga condicional de multiparte mediante la AWS CLI
<a name="conditional-writes-mpu-complete-CLI-etags"></a>

El comando de ejemplo `complete-multipart-upload` intenta completar una carga multiparte con una escritura condicional con el valor de ETag `6805f2cfc46c0f04559748bb039d69ae` proporcionado. En este ejemplo, el prefijo file:// se usa para cargar la estructura JSON desde un archivo de la carpeta local denominada `mpustruct` que muestra todas las partes que se han cargado para esta carga multiparte específica.

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

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/complete-multipart-upload.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

## Comportamiento de escritura condicional
<a name="conditional-error-response"></a>

**Copias de 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 de `200 OK`. Si existe un objeto, se produce un error en la operación de escritura y se obtiene una respuesta de `412 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 o copias 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 con `PutObject`, es posible que las cargas se vuelvan a intentar después de recibir un error `409 Conflict`. Cuando se utiliza `CompleteMultipartUpload`, se debe volver a iniciar la carga multiparte completa con `CreateMultipartUpload` para volver a cargar el objeto tras recibir un error `409 Conflict`.

**Escrituras o copias 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 respuesta `200 OK`. Si la ETag no coincide, se produce un error en la operación de escritura y se produce una respuesta `412 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 respuesta `404 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
<a name="conditional-write-scenarios"></a>

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`.

![\[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.\]](http://docs.aws.amazon.com/es_es/AmazonS3/latest/userguide/images/conwrite_put_mpu.png)


**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`.

![\[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.\]](http://docs.aws.amazon.com/es_es/AmazonS3/latest/userguide/images/conwrite_delete_mpu.png)


**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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html).

# Aplicación de escrituras condicionales en buckets de Amazon S3
<a name="conditional-writes-enforce"></a>

Mediante el uso de las políticas de bucket de Amazon S3, puede aplicar escrituras condicionales para cargas de objetos en los buckets de uso general.

Una política de bucket está basada en recursos que puede utilizar para conceder permisos de acceso al bucket de Amazon S3 y a los objetos que contiene. Solo el propietario del bucket puede asociar una política a un bucket. Para obtener más información acerca de las políticas de bucket, consulte [Políticas de buckets para Amazon S3](bucket-policies.md).

Puede utilizar las claves de condición `s3:if-match` o `s3:if-none-match` como el elemento `Condition` opcional o bloque `Condition` para especificar cuándo está en vigor una política. Para cargas multiparte, debe especificar la clave de condición `s3:ObjectCreationOperation` para eximir las operaciones `CreateMultipartUpload`, `UploadPart` y `UploadPartCopy`, ya que estas API no aceptan encabezados condicionales. Para obtener más información sobre el uso de condiciones en las políticas de bucket, consulte [Ejemplos de políticas de bucket que utilizan claves de condición](amazon-s3-policy-keys.md).

**nota**  
Si utiliza una política de bucket para aplicar escrituras condicionales, no puede realizar operaciones de copia en el bucket o prefijo especificado en la política de bucket. Las solicitudes `CopyObject` sin un encabezado HTTP `If-None-Match` o `If-Match` producen un error `403 Access Denied`. Las solicitudes `CopyObject` realizadas con esos encabezados HTTP generan un error con una respuesta `501 Not Implemented`.

En los siguientes ejemplos se muestra cómo utilizar condiciones en una política de bucket para que los clientes utilicen el encabezado HTTP `If-None-Match` o `If-Match`.

**Topics**
+ [Ejemplo 1: permitir solo cargas de objetos mediante solicitudes `PutObject` y `CompleteMultipartUpload` que incluyan el encabezado `if-none-match`](#conditional-writes-enforce-ex1)
+ [Ejemplo 2: permitir solo cargas de objetos mediante solicitudes `PutObject` y `CompleteMultipartUpload` que incluyan el encabezado `if-match`](#conditional-writes-enforce-ex2)
+ [Ejemplo 3: permitir solo solicitudes de carga de objeto que incluyan el encabezado `if-none-match` o `if-match`](#conditional-writes-enforce-ex3)

## Ejemplo 1: permitir solo cargas de objetos mediante solicitudes `PutObject` y `CompleteMultipartUpload` que incluyan el encabezado `if-none-match`
<a name="conditional-writes-enforce-ex1"></a>

Esta política permite a la cuenta 111122223333, usuaria Alice, escribir en el bucket *amzn-s3-demo-bucket1* si la solicitud incluye el encabezado `if-none-match`, lo que garantiza que la clave de objeto no exista ya en el bucket. Todas las solicitudes `PutObject` y `CompleteMultipartUpload` al bucket especificado deben incluir el encabezado `if-none-match` para que se realicen correctamente. Mediante este encabezado, los clientes pueden escribir en este bucket solo si la clave de objeto no existe en el bucket.

**nota**  
Esta política también establece la clave de condición `s3:ObjectCreationOperation` que permite cargas multiparte mediante las API `CreateMultipartUpload`, `UploadPart` y `UploadPartCopy`.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalPut",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-none-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalPutwithMPUs",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Bool": {
                    "s3:ObjectCreationOperation": "false"
                }
            }
        }
    ]
}
```

------

## Ejemplo 2: permitir solo cargas de objetos mediante solicitudes `PutObject` y `CompleteMultipartUpload` que incluyan el encabezado `if-match`
<a name="conditional-writes-enforce-ex2"></a>

Esta política permite que la cuenta 111122223333, usuaria Alice, escriba en *amzn-s3-demo-bucket1* solo si la solicitud incluye el encabezado `if-match`. Este encabezado compara el valor de ETag de un objeto en S3 con uno que proporcione durante la operación `WRITE`. Si los valores se ETag no coinciden, se produce un error en la operación. Todas las solicitudes `PutObject` y `CompleteMultipartUpload` al bucket especificado deben incluir el encabezado `if-match` para que se realicen correctamente. 

**nota**  
Esta política también establece la clave de condición `s3:ObjectCreationOperation` que permite cargas multiparte mediante las API `CreateMultipartUpload`, `UploadPart` y `UploadPartCopy`.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowPutObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
        },
        {
            "Sid": "BlockNonConditionalObjectCreation",
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "true"
                },
                "Bool": {
                    "s3:ObjectCreationOperation": "true"
                }
            }
        },
        {
            "Sid": "AllowGetObjectBecauseConditionalPutIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

## Ejemplo 3: permitir solo solicitudes de carga de objeto que incluyan el encabezado `if-none-match` o `if-match`
<a name="conditional-writes-enforce-ex3"></a>

Esta política permite que la cuenta 111122223333, usuaria Alice, escriba en *amzn-s3-demo-bucket1* si las solicitudes incluyen el encabezado `if-none-match` o `if-match`. Esto permite a Alice cargar un objeto si el nombre de clave no existe en el bucket o, si el nombre de la clave existe, Alice puede sobrescribir el objeto si la ETag del objeto coincide con la ETag proporcionada en la solicitud `PUT`. 

**nota**  
Esta política también establece la clave de condición `s3:ObjectCreationOperation` que permite cargas multiparte mediante las API `CreateMultipartUpload`, `UploadPart` y `UploadPartCopy`.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": " AllowConditionalPutifAbsent",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-none-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalPutIfMatchEtag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalObjectCreation",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Bool": {
                    "s3:ObjectCreationOperation": "false"
                }
            }
        },
        {
            "Sid": " AllowGetObjectBecauseConditionalPutIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

------

# Cómo realizar eliminaciones condicionales
<a name="conditional-deletes"></a>

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](conditional-delete-enforce.md). 

**nota**  
Las evaluaciones de eliminación condicional solo se aplican a la versión actual del objeto. 

**Topics**
+ [Cómo comprobar si el objeto se ha modificado antes de eliminarlo](#conditional-deletes-etags)
+ [Cómo comprobar si el objeto existe antes de eliminarlo](#conditional-delete)
+ [Aplicación de eliminaciones condicionales en buckets de Amazon S3](conditional-delete-enforce.md)

## Cómo comprobar si el objeto se ha modificado antes de eliminarlo
<a name="conditional-deletes-etags"></a>

 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](checking-object-integrity-upload.md#checking-object-integrity-etag-and-md5). 

**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`. Para eliminar varios objetos de forma condicional mediante la operación `DeleteObjects`, puede proporcionar el valor `ETag` en el elemento `ETag` del objeto en el cuerpo de la solicitud de XML. Si la solicitud tiene éxito, 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.

 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:
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

### Uso de AWS CLI
<a name="conditional-deletes-deleteobject-CLI-etags"></a>

El siguiente comando `delete-object` de ejemplo intenta realizar una eliminación condicional con el valor de ETag proporcionado `6805f2cfc46c0f04559748bb039d69al`.

```
aws s3api delete-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69al"       
```

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html) en la *Referencia de comandos de la AWS CLI*. 

El siguiente comando `delete-objects` de ejemplo intenta realizar una eliminación condicional con el valor de ETag proporcionado `6805f2cfc46c0f04559748bb039d69al`.

```
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}' 
```

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html) en la *Referencia de comandos de la AWS CLI*. 

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

## Cómo comprobar si el objeto existe antes de eliminarlo
<a name="conditional-delete"></a>

 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](DeleteMarker.md).

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:
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

### Uso de AWS CLI
<a name="conditional-deleteobject-CLI-etags"></a>

El comando de ejemplo `delete-object` siguiente intenta realizar una eliminación condicional de un objeto con el nombre de clave `my_images.tar.bz2` que tiene un valor de `*` que representa cualquier ETag. 

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

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html) en la *Referencia de comandos de la AWS CLI*.

El comando de ejemplo `delete-objects` siguiente intenta realizar una eliminación condicional de un objeto con el nombre de clave `my_images.tar.bz2` que tiene un valor de `*` que representa cualquier ETag. 

```
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}' 
```

Para obtener más información, consulte [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html) en la *Referencia de comandos de la AWS CLI*.

Para obtener información sobre AWS CLI, consulte [¿Qué es AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) en la *Guía del usuario de AWS Command Line Interface*. 

# Aplicación de eliminaciones condicionales en buckets de Amazon S3
<a name="conditional-delete-enforce"></a>

 Mediante el uso de las políticas de bucket de Amazon S3, puede aplicar el encabezado `If-Match` con eliminaciones condicionales para objetos en los buckets de uso general. Si el encabezado `If-Match` no existe, la solicitud se rechazará con un `403 Access Denied`. Una política de bucket está basada en recursos que puede utilizar para conceder permisos de acceso al bucket y a los objetos que contiene. Solo el propietario del bucket puede asociar una política a un bucket. Para obtener más información acerca de las políticas de bucket, consulte [Políticas de buckets para Amazon S3](bucket-policies.md). 

En los ejemplos siguientes, se muestra cómo utilizar condiciones en una política de bucket para que los clientes utilicen el encabezado HTTP `If-Match`.

**Topics**
+ [Ejemplo 1: Permitir solo eliminaciones condicionales mediante el encabezado `If-Match` con el valor `ETag`](#conditional-writes-enforce-ex1)
+ [Ejemplo 2: Permitir solo eliminaciones condicionales mediante el encabezado `If-Match` con el valor `*`](#conditional-deletes-enforce-ex2)

## Ejemplo 1: Permitir solo eliminaciones condicionales mediante el encabezado `If-Match` con el valor `ETag`
<a name="conditional-writes-enforce-ex1"></a>

Puede usar esta política de bucket para permitir solo las eliminaciones condicionales mediante las solicitudes de `DeleteObject` y `DeleteObjects` que incluyen el encabezado `If-Match` con el valor `ETag`. Se rechazarían todas las eliminaciones no condicionales y se aprobarían las eliminaciones condicionales. 

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalDeletes",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        },
         {
            "Sid": "AllowGetObjectBecauseConditionalDeleteIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

## Ejemplo 2: Permitir solo eliminaciones condicionales mediante el encabezado `If-Match` con el valor `*`
<a name="conditional-deletes-enforce-ex2"></a>

Puede usar esta política de bucket para permitir solo las eliminaciones condicionales mediante las solicitudes de `DeleteObject` y `DeleteObjects` que incluyen el encabezado `If-Match` con el valor `*`. Se rechazarían todas las eliminaciones no condicionales y se aprobarían las eliminaciones condicionales. 

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalDeletes",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        }
    ]
}
```