

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Livros de publicação para uso público
<a name="hooks-publishing"></a>

Para desenvolver um Hook público de terceiros, desenvolva seu Hook como uma extensão privada. Em seguida, Região da AWS em cada um em que você deseja disponibilizar a extensão publicamente: 

1. Registre seu Hook como uma extensão privada no CloudFormation registro.

1. Teste seu Hook para garantir que ele atenda a todos os requisitos necessários para ser publicado no CloudFormation registro.

1. Publique seu Hook no CloudFormation registro.
**nota**  
Antes de publicar qualquer extensão em uma determinada região, você deve primeiro se registrar como editor de extensões nessa região. Para fazer isso em várias regiões simultaneamente, consulte [Publicar extensões em várias regiões usando](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension-stacksets.html) o StackSets Guia do *usuário da CloudFormation CLI*.

Depois de desenvolver e registrar seu Hook, você pode disponibilizá-lo publicamente para CloudFormation usuários em geral *publicando-o* no CloudFormation registro, como uma extensão pública de terceiros.

Hooks públicos de terceiros permitem que você ofereça CloudFormation aos usuários a inspeção proativa da configuração dos AWS recursos antes do provisionamento. Assim como acontece com os Hooks privados, os Hooks públicos são tratados da mesma forma que qualquer Hook publicado por AWS dentro. CloudFormation

Os ganchos publicados no registro são visíveis por todos os CloudFormation usuários Regiões da AWS no qual foram publicados. Os usuários podem então *ativar* sua extensão em suas contas, o que a torna disponível para uso em seus modelos. Para obter mais informações, consulte [Usar extensões públicas de terceiros do CloudFormation registro](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html) no *Guia do CloudFormation usuário*.

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

Para publicar seu Hook personalizado registrado, ele deve passar por todos os requisitos de teste definidos para ele. A seguir está uma lista dos requisitos necessários antes de publicar seu Hook personalizado como uma extensão de terceiros.

Cada manipulador e alvo são testados duas vezes. Uma vez para `SUCCESS` e outra para`FAILED`.
+ Para caso de `SUCCESS` resposta:
  + O status deve ser`SUCCESS`.
  + Não deve retornar um código de erro.
  + O atraso do retorno de chamada deve ser definido para `0` segundos, se especificado.
+ Para caso de `FAILED` resposta:
  + O status deve ser`FAILED`.
  + É necessário retornar um código de erro.
  + Deve ter uma mensagem em resposta.
  + O atraso do retorno de chamada deve ser definido para `0` segundos, se especificado.
+ Para caso de `IN_PROGRESS` resposta:
  + Não deve retornar um código de erro.
  + `Result`o campo não deve ser definido como resposta.

# Especificando dados de entrada para uso em testes de contrato
<a name="hooks-input-data-contract-test"></a>

Por padrão, CloudFormation ele executa testes de contrato usando propriedades de entrada geradas a partir dos padrões que você define em seu esquema Hook. No entanto, a maioria dos Hooks é complexa o suficiente para que as propriedades de entrada para pré-criar ou pré-atualizar pilhas de provisionamento exijam uma compreensão do recurso que está sendo provisionado. Para resolver isso, você pode especificar a entrada que ele CloudFormation usa ao realizar seus testes de contrato.

CloudFormation oferece duas maneiras de especificar os dados de entrada a serem usados ao realizar testes de contrato:
+ Substitui o arquivo

  O uso de um `overrides` arquivo fornece uma maneira leve de especificar dados de entrada para determinadas propriedades específicas CloudFormation para uso durante `preUpdate` e `preDelete` testes de `preCreate` operações.
+ Arquivos de entrada

  Você também pode usar vários `input` arquivos para especificar os dados de entrada do teste de contrato se:
  + Você deseja ou precisa especificar dados de entrada diferentes para operações de criação, atualização e exclusão, ou dados inválidos com os quais testar.
  + Você deseja especificar vários conjuntos de dados de entrada diferentes.

## Especificando dados de entrada usando um arquivo de substituição
<a name="hook-override-inputs"></a>

Veja a seguir um exemplo dos dados de entrada do Amazon S3 Hook usando o `overrides` arquivo.

```
{
    "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"
            }
        }
    }
}
```

## Especificando dados de entrada usando arquivos de entrada
<a name="hook-test-inputs"></a>

Use `input` arquivos para especificar diferentes tipos de dados de entrada a CloudFormation serem usados: `preCreate` entrada, `preUpdate` entrada e entrada inválida. Cada tipo de dado é especificado em um arquivo separado. Você também pode especificar vários conjuntos de dados de entrada para testes de contrato.

Para especificar `input` arquivos CloudFormation para uso em testes de contrato, adicione uma `inputs` pasta ao diretório raiz do seu projeto Hooks. Em seguida, adicione seus arquivos de entrada.

Especifique o tipo de dados de entrada que um arquivo contém usando as seguintes convenções de nomenclatura, onde **n**é um número inteiro:
+ `inputs_n_pre_create.json`: use arquivos com `preCreate` manipuladores para especificar entradas para criar o recurso.
+ `inputs_n_pre_update.json`: use arquivos com `preUpdate` manipuladores para especificar entradas para atualizar o recurso.
+ `inputs_n_pre_delete.json`: use arquivos com `preDelete` manipuladores para especificar entradas para excluir o recurso.
+ `inputs_n_invalid.json`: Para especificar entradas inválidas para teste.

Para especificar vários conjuntos de dados de entrada para testes de contrato, incremente o número inteiro nos nomes dos arquivos para ordenar seus conjuntos de dados de entrada. Por exemplo, seu primeiro conjunto de arquivos de entrada deve ser chamado de `inputs_1_pre_create.json``inputs_1_pre_update.json`, `inputs_1_pre_invalid.json` e. Seu próximo conjunto seria denominado`inputs_2_pre_create.json`,`inputs_2_pre_update.json`, e`inputs_2_pre_invalid.json`, e assim por diante.

Cada arquivo de entrada é um arquivo JSON contendo somente as propriedades do recurso a serem usadas nos testes.

Veja a seguir um exemplo de diretório `inputs` para Amazon S3 especificar dados de entrada usando arquivos de entrada.

`inputs_1_pre_create.json`  <a name="inputs_1_pre_create.json"></a>
Veja a seguir um exemplo do teste 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>
Veja a seguir um exemplo do teste 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>
Veja a seguir um exemplo do teste 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>
Veja a seguir um exemplo do teste 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 saber mais, consulte [Publicar extensões para disponibilizá-las para uso público](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html), no *Guia do usuário do CloudFormation *.