

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Escribe reglas de Guard para evaluar los recursos de Guard Hooks
<a name="guard-hooks-write-rules"></a>

AWS CloudFormation Guard es un lenguaje específico de dominio (DSL) de código abierto y de uso general que puede utilizar como autor. policy-as-code En este tema se explica cómo usar Guard para crear reglas de ejemplo que se pueden ejecutar en Guard Hook para evaluar CloudFormation y API de control de nube de AWS operar automáticamente. También se centrará en los diferentes tipos de entradas disponibles para tus reglas de guardia en función del momento en que se ejecute tu garfio. Puedes configurar un Guard Hook para que funcione durante los siguientes tipos de operaciones:
+ Operaciones de recursos
+ Operaciones de apilado
+ Operaciones del conjunto de cambios

Para obtener más información sobre cómo escribir reglas de Guard, consulte [Escribir AWS CloudFormation Guard reglas](https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html)

**Topics**
+ [Reglas de Guard para la operación de recursos](#guard-hooks-write-rules-resource-operations)
+ [Reglas de Stack Operation Guard](#guard-hooks-write-rules-stack-operations)
+ [Cambie las reglas establecidas de Operation Guard](#guard-hooks-write-rules-change-set-operations)

## Reglas de Guard para la operación de recursos
<a name="guard-hooks-write-rules-resource-operations"></a>

Cada vez que se crea, actualiza o elimina un recurso, se considera una operación de recurso. Por ejemplo, si ejecutas la actualización de una CloudFormation pila que crea un recurso nuevo, habrás completado una operación de recursos. Cuando creas, actualizas o eliminas un recurso mediante la API de Cloud Control, también se considera una operación de recursos. Puedes configurar tu Guard Hook según el objetivo `RESOURCE` y `CLOUD_CONTROL` las operaciones en la `TargetOperations` configuración de tu Hook. Cuando tu Guard Hook evalúa una operación de recursos, el motor Guard evalúa una entrada de recursos.

**Topics**
+ [Sintaxis de entrada de recursos de Guard](#guard-hooks-write-rules-resource-operations-input)
+ [Ejemplo de entrada de operación de recursos de Guard](#guard-hooks-write-rules-resource-operations-example)
+ [Proteja las reglas para los cambios en los recursos](#guard-hooks-rules-resource-changes)

### Sintaxis de entrada de recursos de Guard
<a name="guard-hooks-write-rules-resource-operations-input"></a>

La entrada de recursos de Guard son los datos que están disponibles para que las reglas de Guard los evalúen.

El siguiente es un ejemplo de la forma de una entrada de recursos:

```
HookContext:
  AWSAccountID: String
  StackId: String
  HookTypeName: String
  HookTypeVersion: String
  InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION]
  TargetName: String
  TargetType: RESOURCE
  TargetLogicalId: String
  ChangeSetId: String
Resources:
  {ResourceLogicalID}:
    ResourceType: {ResourceType}
    ResourceProperties:
        {ResourceProperties}
Previous:
  ResourceLogicalID:
    ResourceType: {ResourceType}
    ResourceProperties:
        {PreviousResourceProperties}
```

`HookContext`  <a name="guard-hook-resource-hookcontext"></a>  
`AWSAccountID`  <a name="guard-hook-resource-awsaccountid"></a>
El ID Cuenta de AWS que contiene el recurso que se está evaluando.  
`StackId`  <a name="guard-hook-resource-stackid"></a>
El ID de pila de la CloudFormation pila que forma parte de la operación de recursos. Está vacío si la persona que llama es Cloud Control API.  
`HookTypeName`  <a name="guard-hook-resource-hooktypename"></a>
El nombre del Hook que se está ejecutando.  
`HookTypeVersion`  <a name="guard-hook-resource-hooktypeversion"></a>
La versión del Hook que se está ejecutando.  
`InvocationPoint`  <a name="guard-hook-resource-invocationpoint"></a>
El punto exacto de la lógica de aprovisionamiento en el que se ejecuta el Hook.  
*Valores válidos*: (`CREATE_PRE_PROVISION`\$1 `UPDATE_PRE_PROVISION` \$1`DELETE_PRE_PROVISION`)  
`TargetName`  <a name="guard-hook-resource-targetname"></a>
El tipo de objetivo que se está evaluando, por ejemplo,`AWS::S3::Bucket`.  
`TargetType`  <a name="guard-hook-resource-targettype"></a>
El tipo de objetivo que se está evaluando, por ejemplo`AWS::S3::Bucket`. En el caso de los recursos aprovisionados con la API de Cloud Control, este valor será`RESOURCE`.  
`TargetLogicalId`  <a name="guard-hook-resource-targetlogicalid"></a>
El `TargetLogicalId` del recurso que se está evaluando. Si el origen del Hook es CloudFormation, será el ID lógico (también conocido como nombre lógico) del recurso. Si el origen del Hook es la API de Cloud Control, será un valor construido.  
`ChangeSetId`  <a name="guard-hook-resource-changesetid"></a>
El ID del conjunto de cambios que se ejecutó para provocar la invocación del Hook. Este valor está vacío si el cambio de recurso lo inició la API de Cloud Control o las `delete-stack` operaciones `create-stack``update-stack`, o.

`Resources`  <a name="guard-hook-resource-resources"></a>  
`ResourceLogicalID`  <a name="guard-hook-resource-current-resourcelogicalid"></a>
Cuando la operación se inicia con CloudFormation, `ResourceLogicalID` es el ID lógico del recurso de la CloudFormation plantilla.  
Cuando la operación la inicia la API de Cloud Control, `ResourceLogicalID` es una combinación del tipo de recurso, el nombre, el ID de operación y el ID de solicitud.  
`ResourceType`  <a name="guard-hook-resource-current-resourcetype"></a>
El nombre del tipo del recurso (ejemplo:`AWS::S3::Bucket`).  
`ResourceProperties`  <a name="guard-hook-resource-current-resourceproperties"></a>
Las propiedades propuestas del recurso que se está modificando. Cuando el Guard Hook se ejecute en función de los cambios en el CloudFormation recurso, todas las funciones, parámetros y transformaciones se resolverán por completo. Si se elimina el recurso, este valor estará vacío.

`Previous`  <a name="guard-hook-resource-previous"></a>  
`ResourceLogicalID`  <a name="guard-hook-resource-previous-resourcelogicalid"></a>
Cuando la operación se inicia con CloudFormation, `ResourceLogicalID` es el identificador lógico del recurso de la CloudFormation plantilla.  
Cuando la operación la inicia la API de Cloud Control, `ResourceLogicalID` es una combinación del tipo de recurso, el nombre, el ID de operación y el ID de solicitud.  
`ResourceType`  <a name="guard-hook-resource-previous-resourcetype"></a>
El nombre del tipo del recurso (ejemplo:`AWS::S3::Bucket`).  
`ResourceProperties`  <a name="guard-hook-resource-previous-resourceproperties"></a>
Las propiedades actuales asociadas al recurso que se está modificando. Si se elimina el recurso, este valor estará vacío.

### Ejemplo de entrada de operación de recursos de Guard
<a name="guard-hooks-write-rules-resource-operations-example"></a>

El siguiente ejemplo de entrada muestra un Guard Hook que recibirá la definición del `AWS::S3::Bucket` recurso que se va a actualizar. Estos son los datos disponibles para que Guard los evalúe.

```
HookContext:
  AwsAccountId: "123456789012"
  StackId: "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000"
  HookTypeName: org::s3policy::hook
  HookTypeVersion: "00001"
  InvocationPoint: UPDATE_PRE_PROVISION
  TargetName: AWS::S3::Bucket
  TargetType: RESOURCE
  TargetLogicalId: MyS3Bucket
  ChangeSetId: ""
Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket
      ObjectLockEnabled: true
Previous:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket
      ObjectLockEnabled: false
```

Para ver todas las propiedades disponibles para el tipo de recurso, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html).

### Proteja las reglas para los cambios en los recursos
<a name="guard-hooks-rules-resource-changes"></a>

Cuando un Guard Hook evalúa los cambios en los recursos, comienza por descargar todas las reglas configuradas con el Hook. Luego, estas reglas se evalúan en función de la entrada de recursos. The Hook fallará si alguna regla no pasa su evaluación. Si no hay errores, el Hook pasará.

El siguiente ejemplo es una regla de guardia que evalúa si la `ObjectLockEnabled` propiedad es `true` para algún tipo de `AWS::S3::Bucket` recurso.

```
let s3_buckets_default_lock_enabled = Resources.*[ Type == 'AWS::S3::Bucket']

rule S3_BUCKET_DEFAULT_LOCK_ENABLED when %s3_buckets_default_lock_enabled !empty {
  %s3_buckets_default_lock_enabled.Properties.ObjectLockEnabled exists
  %s3_buckets_default_lock_enabled.Properties.ObjectLockEnabled == true
  <<
    Violation: S3 Bucket ObjectLockEnabled must be set to true.
    Fix: Set the S3 property ObjectLockEnabled parameter to true.
  >>
}
```

Si esta regla se ejecuta en contra de la siguiente entrada, fallará ya que la `ObjectLockEnabled` propiedad no está establecida en. `true`

```
Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket 
      ObjectLockEnabled: false
```

Cuando esta regla se ejecute en contra de la siguiente entrada, pasará ya que `ObjectLockEnabled` está establecida en`true`.

```
Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket
      ObjectLockEnabled: true
```

Cuando se produce un error en un Hook, las reglas que hayan fallado se volverán a propagar a nuestra CloudFormation API de Cloud Control. Si se ha configurado un depósito de registro para el Guard Hook, allí se proporcionará información adicional sobre las reglas. Estos comentarios adicionales incluyen la `Fix` información `Violation` y la información.

## Reglas de Stack Operation Guard
<a name="guard-hooks-write-rules-stack-operations"></a>

Cuando se crea, actualiza o elimina una CloudFormation pila, puedes configurar tu Guard Hook para que comience por evaluar la nueva plantilla y, posiblemente, impedir que la operación de apilamiento continúe. Puedes configurar tu Guard Hook para que se centre en `STACK` las operaciones en la `TargetOperations` configuración de tu Hook.

**Topics**
+ [Sintaxis de entrada de Guard Stack](#guard-hooks-write-rules-stack-operations-input)
+ [Ejemplo de entrada de operación de Guard Stack](#guard-hooks-write-rules-stack-operations-example)
+ [Reglas de protección para los cambios de pila](#guard-hooks-rules-stack-changes)

### Sintaxis de entrada de Guard Stack
<a name="guard-hooks-write-rules-stack-operations-input"></a>

La entrada para las operaciones de Guard Stack proporciona la CloudFormation plantilla completa para que la evalúen las reglas de Guard.

El siguiente es un ejemplo de la forma de una entrada de pila:

```
HookContext:
  AWSAccountID: String
  StackId: String
  HookTypeName: String
  HookTypeVersion: String
  InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION]
  TargetName: String
  TargetType:STACK
  ChangeSetId: String
{Proposed CloudFormation Template}
Previous:
    {CloudFormation Template}
```

`HookContext`  <a name="guard-hook-stack-hookcontext"></a>  
`AWSAccountID`  <a name="guard-hook-stack-awsaccountid"></a>
El ID del recurso Cuenta de AWS que contiene.  
`StackId`  <a name="guard-hook-stack-stackid"></a>
El ID de pila de la CloudFormation pila que forma parte de la operación de apilado.  
`HookTypeName`  <a name="guard-hook-stack-hooktypename"></a>
El nombre del Hook que se está ejecutando.  
`HookTypeVersion`  <a name="guard-hook-stack-hooktypeversion"></a>
La versión del Hook que se está ejecutando.  
`InvocationPoint`  <a name="guard-hook-stack-invocationpoint"></a>
El punto exacto de la lógica de aprovisionamiento en el que se ejecuta el Hook.  
*Valores válidos*: (`CREATE_PRE_PROVISION`\$1 `UPDATE_PRE_PROVISION` \$1`DELETE_PRE_PROVISION`)  
`TargetName`  <a name="guard-hook-stack-targetname"></a>
El nombre de la pila que se está evaluando.  
`TargetType`  <a name="guard-hook-stack-targettype"></a>
Este valor será `STACK` cuando se ejecute como un Hook a nivel de pila.  
`ChangeSetId`  <a name="guard-hook-stack-changesetid"></a>
El ID del conjunto de cambios que se ejecutó para provocar la invocación del Hook. Este valor está vacío si la operación de pila se inició mediante una `delete-stack` operación `create-stack``update-stack`, o.

`Proposed CloudFormation Template`  <a name="guard-hook-stack-template-current-template"></a>
El valor completo CloudFormation de la plantilla que se pasó a CloudFormation `create-stack` nuestras `update-stack` operaciones. Esto incluye elementos como `Resources``Outputs`, y`Properties`. Puede ser una cadena JSON o YAML, según lo que se haya proporcionado a CloudFormation.  
En `delete-stack` las operaciones, este valor estará vacío.

`Previous`  <a name="guard-hook-stack-template-previous-template"></a>
La última CloudFormation plantilla implementada correctamente. Este valor está vacío si se va a crear o eliminar la pila.  
En `delete-stack` las operaciones, este valor estará vacío.

**nota**  
Las plantillas proporcionadas son las que se transfieren a las operaciones `create` o se `update` apilan. Al eliminar una pila, no se proporcionan valores de plantilla.

### Ejemplo de entrada de operación de Guard Stack
<a name="guard-hooks-write-rules-stack-operations-example"></a>

El siguiente ejemplo de entrada muestra un Guard Hook que recibirá una plantilla completa y la plantilla implementada anteriormente. La plantilla de este ejemplo utiliza el formato JSON.

```
HookContext:
  AwsAccountId: 123456789012
  StackId: "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000"
  HookTypeName: org::templatechecker::hook
  HookTypeVersion: "00001"
  InvocationPoint: UPDATE_PRE_PROVISION
  TargetName: MyStack
  TargetType: CHANGE_SET
  TargetLogicalId: arn:aws:cloudformation:us-west-2:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000
  ChangeSetId: arn:aws:cloudformation:us-west-2:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000
Resources: {
   "S3Bucket": {
        "Type": "AWS::S3::Bucket",
        "Properties": {
           "BucketEncryption": {
               "ServerSideEncryptionConfiguration": [ 
                {"ServerSideEncryptionByDefault": 
                    {"SSEAlgorithm": "aws:kms", 
                      "KMSMasterKeyID": "KMS-KEY-ARN" }, 
                      "BucketKeyEnabled": true } 
                ] 
           }
        }
}
Previous: {
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "S3Bucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {}
        }
    }
}
```

### Reglas de protección para los cambios de pila
<a name="guard-hooks-rules-stack-changes"></a>

Cuando un Guard Hook evalúa los cambios en la pila, comienza por descargar todas las reglas configuradas con el Hook. Luego, estas reglas se evalúan en función de la entrada de recursos. The Hook fallará si alguna regla no pasa su evaluación. Si no hay errores, el Hook pasará.

El siguiente ejemplo es una regla de guardia que evalúa si hay algún tipo de `AWS::S3::Bucket` recurso que contenga una propiedad llamada`BucketEncryption`, con el valor `SSEAlgorithm` establecido en `aws:kms` o`AES256`.

```
let s3_buckets_s3_default_encryption = Resources.*[ Type == 'AWS::S3::Bucket']

rule S3_DEFAULT_ENCRYPTION_KMS when %s3_buckets_s3_default_encryption !empty {
  %s3_buckets_s3_default_encryption.Properties.BucketEncryption exists
  %s3_buckets_s3_default_encryption.Properties.BucketEncryption.ServerSideEncryptionConfiguration[*].ServerSideEncryptionByDefault.SSEAlgorithm in ["aws:kms","AES256"]
  <<
    Violation: S3 Bucket default encryption must be set.
    Fix: Set the S3 Bucket property BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault.SSEAlgorithm to either "aws:kms" or "AES256"
  >>
}
```

Cuando la regla se ejecute en la siguiente plantilla, lo hará`fail`.

```
AWSTemplateFormatVersion: 2010-09-09
Description: S3 bucket without default encryption
Resources:
  EncryptedS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}'
```

Cuando la regla se ejecute en la siguiente plantilla, lo hará`pass`.

```
AWSTemplateFormatVersion: 2010-09-09
Description: S3 bucket with default encryption using SSE-KMS with an S3 Bucket Key
Resources:
  EncryptedS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}'
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: 'aws:kms'
              KMSMasterKeyID: KMS-KEY-ARN
            BucketKeyEnabled: true
```

## Cambie las reglas establecidas de Operation Guard
<a name="guard-hooks-write-rules-change-set-operations"></a>

Cuando se crea un conjunto de CloudFormation cambios, puede configurar su Guard Hook para que evalúe la plantilla y los cambios propuestos en el conjunto de cambios a fin de bloquear la ejecución del conjunto de cambios.

**Topics**
+ [Sintaxis de entrada del conjunto de cambios de Guard](#guard-hooks-write-rules-change-set-operations-input)
+ [Ejemplo de entrada de operación de conjunto de cambios de Guard](#guard-hooks-write-rules-change-set-operations-example)
+ [Regla de protección para las operaciones del conjunto de cambios](#guard-hooks-rules-change-set-operations)

### Sintaxis de entrada del conjunto de cambios de Guard
<a name="guard-hooks-write-rules-change-set-operations-input"></a>

La entrada del conjunto de cambios de Guard son los datos que están disponibles para que las reglas de Guard los evalúen.

A continuación se muestra un ejemplo de la forma de una entrada de un conjunto de cambios:

```
HookContext:
  AWSAccountID: String
  StackId: String
  HookTypeName: String
  HookTypeVersion: String
  InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION]
  TargetName: CHANGE_SET
  TargetType:CHANGE_SET
  TargetLogicalId:ChangeSet ID
  ChangeSetId: String
{Proposed CloudFormation Template}
Previous:
  {CloudFormation Template}
Changes: [{ResourceChange}]
```

La sintaxis del `ResourceChange` modelo es:

```
logicalResourceId: String 
resourceType: String
acción: CREATE, UPDATE, DELETE
Número de línea: Number
Antes de Context: JSON String
Después de Context: JSON String
```

`HookContext`  <a name="guard-hook-change-set-hookcontext"></a>  
`AWSAccountID`  <a name="guard-hook-change-set-awsaccountid"></a>
El ID del recurso Cuenta de AWS que contiene el recurso.  
`StackId`  <a name="guard-hook-change-set-stackid"></a>
El ID de pila de la CloudFormation pila que forma parte de la operación de apilado.  
`HookTypeName`  <a name="guard-hook-change-set-hooktypename"></a>
El nombre del Hook que se está ejecutando.  
`HookTypeVersion`  <a name="guard-hook-change-set-hooktypeversion"></a>
La versión del Hook que se está ejecutando.  
`InvocationPoint`  <a name="guard-hook-change-set-invocationpoint"></a>
El punto exacto de la lógica de aprovisionamiento en el que se ejecuta el Hook.  
*Valores válidos*: (`CREATE_PRE_PROVISION`\$1 `UPDATE_PRE_PROVISION` \$1`DELETE_PRE_PROVISION`)  
`TargetName`  <a name="guard-hook-change-set-targetname"></a>
El nombre de la pila que se está evaluando.  
`TargetType`  <a name="guard-hook-change-set-targettype"></a>
Este valor será `CHANGE_SET` cuando se ejecute como un Hook a nivel de conjunto de cambios.  
`TargetLogicalId`  <a name="guard-hook-change-set-targetlogicalid"></a>
Este valor será el ARN del conjunto de cambios.  
`ChangeSetId`  <a name="guard-hook-change-set-changesetid"></a>
El ID del conjunto de cambios que se ejecutó para provocar la invocación de Hook. Este valor está vacío si la operación de pila se inició mediante una `delete-stack` operación `create-stack``update-stack`, o.

`Proposed CloudFormation Template`  <a name="guard-hook-change-set-current-template"></a>
La CloudFormation plantilla completa que se proporcionó a una `create-change-set` operación. Puede ser una cadena JSON o YAML en función de lo que se haya proporcionado a CloudFormation.

`Previous`  <a name="guard-hook-change-set-previous-template"></a>
La última CloudFormation plantilla implementada correctamente. Este valor está vacío si se va a crear o eliminar la pila.

`Changes`  <a name="guard-hook-change-set-changes"></a>
El `Changes` modelo. Aquí se enumeran los cambios en los recursos.

Cambios    
logicalResourceId  <a name="guard-hook-change-set-change-logicalresourceid"></a>
El nombre del recurso lógico del recurso modificado.  
resourceType  <a name="guard-hook-change-set-change-resourcetype"></a>
El tipo de recurso que se cambiará.  
acción  <a name="guard-hook-change-set-change-action"></a>
El tipo de operación que se está realizando en el recurso.  
*Valores válidos*: (`CREATE`\$1 `UPDATE` \$1`DELETE`)  
Número de línea  <a name="guard-hook-change-set-change-linenumber"></a>
El número de línea de la plantilla asociada al cambio.  
Antes de Context  <a name="guard-hook-change-set-change-beforecontext"></a>
Una cadena JSON de propiedades del recurso antes del cambio:  

```
{"properties": {"property1": "value"}}
```  
Después de Context  <a name="guard-hook-change-set-change-aftercontext"></a>
Una cadena JSON de propiedades del recurso tras el cambio:  

```
{"properties": {"property1": "new value"}}
```

### Ejemplo de entrada de operación de conjunto de cambios de Guard
<a name="guard-hooks-write-rules-change-set-operations-example"></a>

El siguiente ejemplo de entrada muestra un Guard Hook que recibirá una plantilla completa, la plantilla implementada anteriormente y una lista de cambios en los recursos. La plantilla de este ejemplo utiliza el formato JSON.

```
HookContext:
  AwsAccountId: "00000000"
  StackId: MyStack
  HookTypeName: org::templatechecker::hook
  HookTypeVersion: "00001"
  InvocationPoint: UPDATE_PRE_PROVISION
  TargetName: my-example-stack
  TargetType:STACK
  TargetLogicalId: arn...:changeSet/change-set
  ChangeSetId: ""
Resources: {
    "S3Bucket": {
       "Type": "AWS::S3::Bucket",
       "Properties": {
           "BucketName": "amzn-s3-demo-bucket",
           "VersioningConfiguration":{
              "Status": "Enabled"
            }                
         }
    }
Previous: {
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "S3Bucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "amzn-s3-demo-bucket",
                "VersioningConfiguration":{
                  "Status": "Suspended"
                }
            }
        }
    }
}
Changes: [
  {
    "logicalResourceId": "S3Bucket",
    "resourceType": "AWS::S3::Bucket",
    "action": "UPDATE",
    "lineNumber": 5,
    "beforeContext": "{\"Properties\":{\"VersioningConfiguration\":{\"Status\":\"Suspended\"}}}",
    "afterContext": "{\"Properties\":{\"VersioningConfiguration\":{\"Status\":\"Enabled\"}}}"
  }
]
```

### Regla de protección para las operaciones del conjunto de cambios
<a name="guard-hooks-rules-change-set-operations"></a>

El siguiente ejemplo es una regla de protección que evalúa los cambios en los buckets de Amazon S3 y garantiza que no estén `VersionConfiguration` deshabilitados.

```
let s3_buckets_changing = Changes[resourceType == 'AWS::S3::Bucket']

rule S3_VERSIONING_STAY_ENABLED when %s3_buckets_changing !empty {
    let afterContext = json_parse(%s3_buckets_changing.afterContext)
    when %afterContext.Properties.VersioningConfiguration.Status !empty {
        %afterContext.Properties.VersioningConfiguration.Status == 'Enabled'
    }
}
```