

# 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/*"
        }
    ]
}
```

------