

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.

# Referencia de sintaxis del esquema para CloudFormation Hooks
<a name="hooks-schema"></a>

En esta sección se describe la sintaxis del esquema que utilizas para desarrollar CloudFormation Hooks.

Un Hook incluye una especificación de Hook representada por un esquema JSON y controladores de Hook. El primer paso para crear un Hook personalizado es modelar un esquema que defina el Hook, sus propiedades y sus atributos. Al inicializar un proyecto Hook personalizado mediante el [https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-cli-init.html](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-cli-init.html)comando CloudFormation CLI, se crea un archivo de esquema Hook para usted. Usa este archivo de esquema como punto de partida para definir la forma y la semántica de tu Hook personalizado.

## Sintaxis del esquema
<a name="schema-syntax"></a>

El siguiente esquema es la estructura de un Hook.

```
{
"typeName": "string",
    "description": "string",
    "sourceUrl": "string",
    "documentationUrl": "string",
    "definitions": {
        "definitionName": {
          . . .
        }
    },
    "typeConfiguration": {
        "properties": {
             "propertyName": {
                "description": "string",
                "type": "string",
                 . . .
            },
        },
    "required": [
        "propertyName"
         . . .
            ],
    "additionalProperties": false
    },
    "handlers": {
        "preCreate": {
            "targetNames": [
            ],
            "permissions": [
            ]
        },
        "preUpdate": {
            "targetNames": [
            ],
            "permissions": [
            ]
        },
        "preDelete": {
            "targetNames": [
            ],
            "permissions": [
            ]
        }
   },
   "additionalProperties": false
}
```

`typeName`  <a name="hooks-properties-typeName"></a>
El nombre exclusivo de tu Hook. Especifica un espacio de nombres de tres partes para tu Hook, con un patrón recomendado de. `Organization::Service::Hook`  
Los siguientes espacios de nombres de organización están reservados y no se pueden usar en los nombres de tipo Hook:  
+ `Alexa`
+ `AMZN`
+ `Amazon`
+ `ASK`
+ `AWS`
+ `Custom`
+ `Dev`
*Obligatorio*: sí  
 *Patrón*: `^[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}$`  
*Mínimo*: `10`  
*Máximo*: `196`

`description`  <a name="hooks-properties-description"></a>
Una breve descripción del Hook que se muestra en la CloudFormation consola.  
*Obligatorio*: sí

`sourceUrl`  <a name="hooks-properties-sourceUrl"></a>
La URL del código fuente del Hook, si es pública.  
*Obligatorio*: no  
*Máximo*: `4096`

`documentationUrl`  <a name="hooks-properties-documentationurl"></a>
La URL de una página que proporciona documentación detallada del Hook.  
*Obligatorio*: sí  
*Patrón*: `^https\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])(\:[0-9]*)*([\?/#].*)?$`  
*Máximo*: `4096`  
Si bien el esquema de Hook debe incluir descripciones de propiedades completas y precisas, puedes usar la `documentationURL` propiedad para proporcionar a los usuarios más detalles, incluidos ejemplos, casos de uso y otra información detallada.

`definitions`  <a name="hooks-properties-definitions"></a>
Usa el `definitions` bloque para proporcionar esquemas de propiedades de Hook compartidos.  
Se considera una buena práctica utilizar la `definitions` sección para definir elementos de esquema que se puedan utilizar en varios puntos del esquema de tipo Hook. A continuación, puedes usar un puntero JSON para hacer referencia a ese elemento en los lugares correspondientes de tu esquema de tipo Hook.  
*Obligatorio*: no

`typeConfiguration`  <a name="hooks-properties-typeconfiguration"></a>
La definición de los datos de configuración de un Hook.  
*Obligatorio*: sí

`properties`  <a name="hooks-properties-properties"></a>
Las propiedades del Hook. Todas las propiedades de un Hook deben expresarse en el esquema. Alinee las propiedades del esquema Hook con las propiedades de configuración del tipo Hook.  
No se permiten propiedades anidadas. En su lugar, defina las propiedades anidadas en el `definitions` elemento y utilice un `$ref` puntero para hacer referencia a ellas en la propiedad deseada.
Actualmente se admiten las siguientes propiedades:  
+ `default`— El valor por defecto de la propiedad.
+ `description`— Una descripción de la propiedad.
+ `pattern`— Un patrón de expresiones regulares que se utiliza para validar la entrada.
+ `type`— El tipo de propiedad aceptado.

`additionalProperties`  <a name="hooks-properties-additionalproperties"></a>
`additionalProperties` se debe establecer en `false`. Todas las propiedades de un Hook deben expresarse en el esquema: no se permiten entradas arbitrarias.  
*Obligatorio*: sí  
*Valores válidos*: `false`

`handlers`  <a name="hooks-properties-handlers"></a>
Los controladores especifican las operaciones que pueden iniciar el Hook definido en el esquema, como los puntos de invocación del Hook. Por ejemplo, se invoca un `preUpdate` controlador antes de las operaciones de actualización para todos los objetivos especificados en el controlador.  
*Valores válidos*: `preCreate` \$1 `preUpdate` \$1 `preDelete`  
Debe especificarse al menos un valor para el controlador.
Apila las operaciones que dan como resultado el estado de `UpdateCleanup` no invocan un Hook. Por ejemplo, en los dos escenarios siguientes, no se invoca el `preDelete` controlador del Hook:  
+ la pila se actualiza después de eliminar un recurso de la plantilla.
+ se elimina un recurso con el tipo de actualización de [reemplazo](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement).

`targetNames`  <a name="hooks-properties-targetNames"></a>
Un conjunto de cadenas de nombres de tipos a los que apunta Hook. Por ejemplo, si un `preCreate` controlador tiene un `AWS::S3::Bucket` objetivo, el Hook se ejecuta para los buckets de Amazon S3 durante la fase de preaprovisionamiento.  
+ `TargetName`

  Especifique al menos un nombre de destino para cada controlador implementado.

  *Patrón*: `^[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}$`

  *Mínimo*: `1`

  *Obligatorio*: sí
**aviso**  
Las referencias dinámicas de SSM SecureString y Secrets Manager no se resuelven antes de pasarlas a Hooks.

`permissions`  <a name="hooks-properties-permissions"></a>
Una matriz de cadenas que especifica los AWS permisos necesarios para invocar el controlador.  
*Obligatorio*: sí

`additionalProperties`  <a name="hooks-additional-properties"></a>
`additionalProperties` se debe establecer en `false`. Todas las propiedades de un Hook deben expresarse en el esquema: no se permiten entradas arbitrarias.  
*Obligatorio*: sí  
*Valores válidos*: `false`

## Ejemplos de esquemas de Hooks
<a name="example-hooks"></a>

 **Ejemplo 1** 

Los tutoriales de Java y Python utilizan el siguiente ejemplo de código. El siguiente es un ejemplo de estructura para un Hook llamado. `mycompany-testing-mytesthook.json`

```
{
    "typeName":"MyCompany::Testing::MyTestHook",
    "description":"Verifies S3 bucket and SQS queues properties before create and update",
    "sourceUrl":"https://mycorp.com/my-repo.git",
    "documentationUrl":"https://mycorp.com/documentation",
    "typeConfiguration":{
        "properties":{
            "minBuckets":{
                "description":"Minimum number of compliant buckets",
                "type":"string"
            },
            "minQueues":{
                "description":"Minimum number of compliant queues",
                "type":"string"
            },
            "encryptionAlgorithm":{
                "description":"Encryption algorithm for SSE",
                "default":"AES256",
                "type":"string",
                "pattern": "[a-zA-Z]*[1-9]"
            }
        },
        "required":[
            
        ],
        "additionalProperties":false
    },
    "handlers":{
        "preCreate":{
            "targetNames":[
                "AWS::S3::Bucket",
                "AWS::SQS::Queue"
            ],
            "permissions":[
                
            ]
        },
        "preUpdate":{
            "targetNames":[
                "AWS::S3::Bucket",
                "AWS::SQS::Queue"
            ],
            "permissions":[
                
            ]
        },
        "preDelete":{
            "targetNames":[
                "AWS::S3::Bucket",
                "AWS::SQS::Queue"
            ],
            "permissions":[
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:GetEncryptionConfiguration",
                "sqs:ListQueues",
                "sqs:GetQueueAttributes",
                "sqs:GetQueueUrl"
            ]
        }
    },
    "additionalProperties":false
}
```

 **Ejemplo 2** 

El siguiente ejemplo es un esquema que usa `STACK` and `CHANGE_SET` for para apuntar `targetNames` a una plantilla de pila y a una operación de conjunto de cambios.

```
{
    "typeName":"MyCompany::Testing::MyTestHook",
    "description":"Verifies Stack and Change Set properties before create and update",
    "sourceUrl":"https://mycorp.com/my-repo.git",
    "documentationUrl":"https://mycorp.com/documentation",
    "typeConfiguration":{
        "properties":{
            "minBuckets":{
                "description":"Minimum number of compliant buckets",
                "type":"string"
            },
            "minQueues":{
                "description":"Minimum number of compliant queues",
                "type":"string"
            },
            "encryptionAlgorithm":{
                "description":"Encryption algorithm for SSE",
                "default":"AES256",
                "type":"string",
                "pattern": "[a-zA-Z]*[1-9]"
            }
        },
        "required":[
        ],
        "additionalProperties":false
    },
    "handlers":{
        "preCreate":{
            "targetNames":[
                "STACK",
                "CHANGE_SET"
            ],
            "permissions":[  
            ]
        },
        "preUpdate":{
            "targetNames":[
                "STACK"
            ],
            "permissions":[
            ]
        },
        "preDelete":{
            "targetNames":[
                "STACK"
            ],
            "permissions":[
                
            ]
        }
    },
    "additionalProperties":false
}
```