

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Hooks de publication destinés à un usage public
<a name="hooks-publishing"></a>

Pour développer un Hook tiers public, développez votre Hook en tant qu'extension privée. Ensuite, Région AWS dans chaque cas où vous souhaitez rendre l'extension accessible au public : 

1. Enregistrez votre Hook en tant qu'extension privée dans le CloudFormation registre.

1. Testez votre Hook pour vous assurer qu'il répond à toutes les exigences nécessaires pour être publié dans le CloudFormation registre.

1. Publiez votre Hook dans le CloudFormation registre.
**Note**  
Avant de publier une extension dans une région donnée, vous devez d'abord vous enregistrer en tant qu'éditeur d'extensions dans cette région. Pour ce faire simultanément dans plusieurs régions, reportez-vous à la section [Publication d'extensions dans plusieurs régions à l'aide StackSets](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension-stacksets.html) du *guide de l'utilisateur de la CloudFormation CLI*.

Une fois que vous avez développé et enregistré votre Hook, vous pouvez le rendre accessible au public en CloudFormation le *publiant* CloudFormation dans le registre, sous la forme d'une extension publique tierce.

Les Hooks tiers publics vous permettent de proposer aux CloudFormation utilisateurs d'inspecter de manière proactive la configuration des AWS ressources avant le provisionnement. Comme pour les Hooks privés, les Hooks publics sont traités de la même manière que tout Hook publié par AWS within CloudFormation.

Les hooks publiés dans le registre sont visibles par tous les CloudFormation utilisateurs dans le registre Régions AWS dans lequel ils sont publiés. Les utilisateurs peuvent ensuite *activer* votre extension dans leur compte, ce qui la rend disponible pour utilisation dans leurs modèles. Pour plus d'informations, consultez la section [Utiliser des extensions publiques tierces depuis le CloudFormation registre](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html) dans le *Guide de CloudFormation l'utilisateur*.

# Tester un Hook personnalisé pour un usage public
<a name="hooks-testing-registered-hooks"></a>

Afin de publier votre Hook personnalisé enregistré, il doit satisfaire à toutes les exigences de test définies pour celui-ci. Voici une liste des exigences requises avant de publier votre Hook personnalisé en tant qu'extension tierce.

Chaque gestionnaire et chaque cible sont testés deux fois. Une fois pour `SUCCESS` et une fois pour`FAILED`.
+ Pour le cas de `SUCCESS` réponse :
  + Le statut doit être`SUCCESS`.
  + Ne doit pas renvoyer de code d'erreur.
  + Le délai de rappel doit être fixé à `0` quelques secondes, s'il est spécifié.
+ Pour le cas de `FAILED` réponse :
  + Le statut doit être`FAILED`.
  + Doit renvoyer un code d'erreur.
  + Il doit y avoir un message en réponse.
  + Le délai de rappel doit être fixé à `0` quelques secondes, s'il est spécifié.
+ Pour le cas de `IN_PROGRESS` réponse :
  + Ne doit pas renvoyer de code d'erreur.
  + `Result`le champ ne doit pas être défini en réponse.

# Spécification des données d'entrée à utiliser dans les tests de contrats
<a name="hooks-input-data-contract-test"></a>

Par défaut, il CloudFormation effectue des tests de contrat en utilisant les propriétés d'entrée générées à partir des modèles que vous définissez dans votre schéma Hook. Cependant, la plupart des Hooks sont suffisamment complexes pour que les propriétés d'entrée permettant de précréer ou de prémettre à jour les piles de provisionnement nécessitent une compréhension de la ressource provisionnée. Pour résoudre ce problème, vous pouvez spécifier l'entrée qu'il CloudFormation utilise lors de ses tests de contrat.

CloudFormation vous propose deux méthodes pour spécifier les données d'entrée à utiliser lors de tests contractuels :
+ Remplace le fichier

  L'utilisation d'un `overrides` fichier permet de spécifier des données d'entrée pour certaines propriétés spécifiques CloudFormation à utiliser pendant les tests `preUpdate` et `preCreate` les tests `preDelete` opérationnels.
+ Fichiers d'entrée

  Vous pouvez également utiliser plusieurs `input` fichiers pour spécifier les données d'entrée des tests de contrat si :
  + Vous souhaitez ou devez spécifier des données d'entrée différentes pour les opérations de création, de mise à jour et de suppression, ou des données non valides pour les tests.
  + Vous souhaitez spécifier plusieurs ensembles de données d'entrée différents.

## Spécification des données d'entrée à l'aide d'un fichier de remplacement
<a name="hook-override-inputs"></a>

Voici un exemple de données d'entrée de Amazon S3 Hook utilisant le `overrides` fichier.

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

## Spécification des données d'entrée à l'aide de fichiers d'entrée
<a name="hook-test-inputs"></a>

Utilisez `input` des fichiers pour spécifier les différents types de données d'entrée CloudFormation à utiliser : `preCreate` entrée, `preUpdate` entrée et entrée non valide. Chaque type de données est spécifié dans un fichier distinct. Vous pouvez également spécifier plusieurs ensembles de données d'entrée pour les tests de contrat.

Pour spécifier `input` les fichiers CloudFormation à utiliser dans les tests de contrats, ajoutez un `inputs` dossier dans le répertoire racine de votre projet Hooks. Ajoutez ensuite vos fichiers d'entrée.

Spécifiez le type de données d'entrée qu'un fichier contient en utilisant les conventions de dénomination suivantes, où **n**est un entier :
+ `inputs_n_pre_create.json`: utilisez des fichiers dotés de `preCreate` gestionnaires pour spécifier les entrées nécessaires à la création de la ressource.
+ `inputs_n_pre_update.json`: utilisez des fichiers dotés de `preUpdate` gestionnaires pour spécifier les entrées nécessaires à la mise à jour de la ressource.
+ `inputs_n_pre_delete.json`: utilisez des fichiers dotés de `preDelete` gestionnaires pour spécifier les entrées permettant de supprimer la ressource.
+ `inputs_n_invalid.json`: pour spécifier des entrées non valides à tester.

Pour spécifier plusieurs ensembles de données d'entrée pour les tests de contrat, incrémentez le nombre entier dans les noms de fichiers afin de classer vos ensembles de données d'entrée. Par exemple, votre premier ensemble de fichiers d'entrée doit être nommé `inputs_1_pre_create.json``inputs_1_pre_update.json`, et`inputs_1_pre_invalid.json`. Votre prochain ensemble serait nommé`inputs_2_pre_create.json`, et `inputs_2_pre_update.json``inputs_2_pre_invalid.json`, et ainsi de suite.

Chaque fichier d'entrée est un fichier JSON contenant uniquement les propriétés des ressources à utiliser lors des tests.

Voici un exemple de répertoire permettant de Amazon S3 spécifier des `inputs` données d'entrée à l'aide de fichiers d'entrée.

`inputs_1_pre_create.json`  <a name="inputs_1_pre_create.json"></a>
Voici un exemple de test `inputs_1_pre_create.json` contractuel.  

```
{
    "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>
Voici un exemple de test `inputs_1_pre_update.json` contractuel.  

```
{
    "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>
Voici un exemple de test `inputs_1_invalid.json` contractuel.  

```
{
    "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>
Voici un exemple de test `inputs_1_invalid_pre_update.json` contractuel.  

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

Pour plus d'informations, veuillez consulter la rubrique [Publier des extensions pour les rendre accessibles au public](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html) dans le *Guide de l'utilisateur de la CLI CloudFormation *.