

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.

# Publicar ganchos para uso público
<a name="hooks-publishing"></a>

Para desarrollar un Hook público de terceros, desarrolla tu Hook como una extensión privada. Luego, en cada una de las extensiones Región de AWS en las que quieras que la extensión esté disponible públicamente: 

1. Registra tu Hook como una extensión privada en el CloudFormation registro.

1. Prueba tu Hook para asegurarte de que cumple con todos los requisitos necesarios para ser publicado en el CloudFormation registro.

1. Publica tu Hook en el CloudFormation registro.
**nota**  
Antes de publicar cualquier extensión en una región determinada, primero debes registrarte como editor de extensiones en esa región. Para hacerlo en varias regiones simultáneamente, consulte [Publicar extensiones en varias regiones mediante StackSets](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension-stacksets.html) la *Guía del usuario de CloudFormation CLI*.

Una vez que hayas desarrollado y registrado tu Hook, podrás ponerlo a disposición del público en CloudFormation general *publicándolo* en el CloudFormation registro, como una extensión pública de terceros.

Los Hooks públicos de terceros te permiten ofrecer a CloudFormation los usuarios la posibilidad de inspeccionar de forma proactiva la configuración de AWS los recursos antes de aprovisionarlos. Al igual que ocurre con los Hooks privados, los Hooks públicos reciben el mismo trato que cualquier Hook publicado por AWS ellos. CloudFormation

Todos los CloudFormation usuarios pueden ver los Hooks publicados en el registro Regiones de AWS en el que están publicados. A continuación, los usuarios pueden *activar* la extensión en su cuenta, de modo que esté disponible para su uso en sus plantillas. Para obtener más información, consulte [Utilizar extensiones públicas de terceros del CloudFormation registro](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html) en la *Guía del CloudFormation usuario*.

# Probando un Hook personalizado para uso público
<a name="hooks-testing-registered-hooks"></a>

Para publicar tu Hook personalizado registrado, debe superar todos los requisitos de prueba definidos para él. La siguiente es una lista de requisitos necesarios antes de publicar tu Hook personalizado como una extensión de terceros.

Cada controlador y objetivo se prueban dos veces. Una vez para `SUCCESS` y otra para`FAILED`.
+ Para un caso de `SUCCESS` respuesta:
  + El estado debe ser`SUCCESS`.
  + No debe devolver un código de error.
  + El retardo de devolución de llamada debe establecerse en `0` segundos, si se especifica.
+ Para el caso `FAILED` de respuesta:
  + El estado debe ser`FAILED`.
  + Debe devolver un código de error.
  + Debe tener un mensaje de respuesta.
  + El retardo de devolución de llamada se debe establecer en `0` segundos, si se especifica.
+ Para el caso `IN_PROGRESS` de respuesta:
  + No debe devolver un código de error.
  + `Result`el campo no debe configurarse como respuesta.

# Especificación de los datos de entrada para su uso en las pruebas de contrato
<a name="hooks-input-data-contract-test"></a>

De forma predeterminada, CloudFormation realiza pruebas de contrato utilizando las propiedades de entrada generadas a partir de los patrones que definas en tu esquema de Hook. Sin embargo, la mayoría de los Hooks son lo suficientemente complejos como para que las propiedades de entrada para precrear o actualizar las pilas de aprovisionamiento requieran una comprensión del recurso que se está aprovisionando. Para solucionar este problema, puedes especificar la entrada que CloudFormation utilizan al realizar sus pruebas de contrato.

CloudFormation ofrece dos formas de especificar los datos de entrada para utilizarlos al realizar las pruebas de contrato:
+ Anula el archivo

  El uso de un `overrides` archivo proporciona una forma ligera de especificar los datos de entrada para determinadas propiedades específicas CloudFormation para utilizarlos durante `preCreate` las pruebas `preUpdate` y `preDelete` las operaciones.
+ Archivos de entrada

  También puede usar varios `input` archivos para especificar los datos de entrada de las pruebas de contrato si:
  + Desea o necesita especificar datos de entrada diferentes para las operaciones de creación, actualización y eliminación, o bien datos no válidos con los que realizar las pruebas.
  + Desea especificar varios conjuntos de datos de entrada diferentes.

## Especificar los datos de entrada mediante un archivo de anulación
<a name="hook-override-inputs"></a>

El siguiente es un ejemplo de los datos de entrada de Amazon S3 Hook utilizando el `overrides` archivo.

```
{
    "CREATE_PRE_PROVISION": {
        "AWS::S3::Bucket": {
            "resourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            }
        },
        "AWS::SQS::Queue": {
            "resourceProperties": {
                "/QueueName": "MyQueueContract",
                "/KmsMasterKeyId": "hellocontract"
            }
        }
    },
    "UPDATE_PRE_PROVISION": {
        "AWS::S3::Bucket": {
            "resourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "previousResourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            }
        }
    },
    "INVALID_UPDATE_PRE_PROVISION": {
        "AWS::S3::Bucket": {
            "resourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "previousResourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            }
        }
    },
    "INVALID": {
        "AWS::SQS::Queue": {
            "resourceProperties": {
                "/QueueName": "MyQueueContract",
                "/KmsMasterKeyId": "KMS-KEY-ARN"
            }
        }
    }
}
```

## Especificar los datos de entrada mediante archivos de entrada
<a name="hook-test-inputs"></a>

Utilice `input` los archivos para especificar diferentes tipos de datos de entrada CloudFormation para su uso: `preCreate` entrada, `preUpdate` entrada y entrada no válida. Cada tipo de datos se especifica en un archivo independiente. También puede especificar varios conjuntos de datos de entrada para las pruebas de contrato.

Para especificar `input` los archivos CloudFormation que se van a utilizar en las pruebas por contrato, añade una `inputs` carpeta al directorio raíz de tu proyecto de Hooks. Luego agrega tus archivos de entrada.

Especifique el tipo de datos de entrada que contiene un archivo mediante las siguientes convenciones de nomenclatura, donde **n**es un número entero:
+ `inputs_n_pre_create.json`: utilice archivos con `preCreate` controladores para especificar las entradas a fin de crear el recurso.
+ `inputs_n_pre_update.json`: Utilice archivos con `preUpdate` controladores para especificar las entradas a fin de actualizar el recurso.
+ `inputs_n_pre_delete.json`: Utilice archivos con `preDelete` controladores para especificar las entradas a fin de eliminar el recurso.
+ `inputs_n_invalid.json`: Para especificar entradas no válidas para probarlas.

Para especificar varios conjuntos de datos de entrada para las pruebas de contrato, incremente el número entero en los nombres de los archivos para ordenar los conjuntos de datos de entrada. Por ejemplo, el primer conjunto de archivos de entrada debe tener el nombre `inputs_1_pre_create.json``inputs_1_pre_update.json`, y`inputs_1_pre_invalid.json`. El siguiente conjunto se llamaría `inputs_2_pre_create.json``inputs_2_pre_update.json`, y`inputs_2_pre_invalid.json`, y así sucesivamente.

Cada archivo de entrada es un archivo JSON que contiene solo las propiedades del recurso que se utilizarán en las pruebas.

El siguiente es un ejemplo de directorio `inputs` para Amazon S3 especificar datos de entrada mediante archivos de entrada.

`inputs_1_pre_create.json`  <a name="inputs_1_pre_create.json"></a>
El siguiente es un ejemplo de la prueba de `inputs_1_pre_create.json` contrato.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "AccessControl": "BucketOwnerFullControl",
            "AnalyticsConfigurations": [],
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    },
    "AWS::SQS::Queue": {
        "resourceProperties": {
            "QueueName": "MyQueue",
            "KmsMasterKeyId": "KMS-KEY-ARN"
        }
    }
}
```

`inputs_1_pre_update.json`  <a name="inputs_1_pre_update.json"></a>
El siguiente es un ejemplo de la prueba de `inputs_1_pre_update.json` contrato.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        },
        "previousResourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    }
}
```

`inputs_1_invalid.json`  <a name="inputs_1_invalid.json"></a>
El siguiente es un ejemplo de la prueba de `inputs_1_invalid.json` contrato.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "AccessControl": "BucketOwnerFullControl",
            "AnalyticsConfigurations": [],
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "ServerSideEncryptionByDefault": {
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    },
    "AWS::SQS::Queue": {
        "resourceProperties": {
            "NotValid": "The property of this resource is not valid."
        }
    }
}
```

`inputs_1_invalid_pre_update.json`  <a name="inputs_1_invalid_pre_update.json"></a>
El siguiente es un ejemplo de la prueba de `inputs_1_invalid_pre_update.json` contrato.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        },
        "previousResourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    }
}
```

Para obtener más información, consulte [Publishing extensions to make them available for public use](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html) (Publicar extensiones para que estén disponibles para uso público) en la *Guía del usuario de la CLI de CloudFormation *.