Utilisation de modules pour encapsuler et réutiliser les configurations de ressources - AWS CloudFormation

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.

Utilisation de modules pour encapsuler et réutiliser les configurations de ressources

Les modules vous permettent d'empaqueter des configurations de ressources pour les inclure dans les modèles de pile, de manière transparente, gérable et reproductible. Les modules peuvent encapsuler les configurations de service courantes et les bonnes pratiques en tant que blocs de création modulaires et personnalisables à inclure dans vos modèles de pile. Les modules vous permettent d'inclure des configurations de ressources qui intègrent les bonnes pratiques, les connaissances des experts du secteur et les directives acceptées (pour des domaines tels que la sécurité, la conformité, la gouvernance et les réglementations sectorielles) dans vos modèles, sans avoir à acquérir une connaissance approfondie des subtilités de l'implémentation des ressources.

Par exemple, un expert du secteur de la mise en réseau pourrait créer un module contenant des groupes de sécurité intégrés et des règles d'entrée et de sortie qui respectent les consignes de sécurité. Vous pouvez ensuite inclure ce module dans votre modèle pour allouer une infrastructure réseau sécurisée dans votre pile, sans devoir passer du temps à déterminer comment fonctionnent les VPC, les sous-réseaux, les groupes de sécurité et les passerelles. Et comme les modules sont versionnés, si les directives de sécurité changent au fil du temps, l'auteur du module peut créer une nouvelle version du module intégrant ces modifications.

Les caractéristiques de l'utilisation des modules dans vos modèles sont les suivantes :

  • Prévisibilité : un module doit respecter le schéma qu'il enregistre dans le CloudFormation registre, afin que vous sachiez vers quelles ressources il peut être résolu une fois que vous l'avez inclus dans votre modèle.

  • Réutilisabilité : vous pouvez utiliser le même module sur plusieurs modèles et comptes.

  • Traçabilité : CloudFormation conserve la connaissance des ressources d'une pile qui ont été provisionnées à partir d'un module, ce qui vous permet de comprendre facilement la source des modifications apportées aux ressources.

  • Facilité de gestion : une fois que vous avez enregistré un module, vous pouvez le gérer via le CloudFormation registre, y compris le contrôle des versions et la disponibilité des comptes et des régions.

Un module peut contenir :

  • une ou plusieurs ressources à provisionner à partir du module, ainsi que toutes les données associées, telles que les sorties ou les conditions ;

  • tous les paramètres du module, qui vous permettent de spécifier des valeurs personnalisées chaque fois que le module est utilisé.

Pour plus d'informations sur le développement de types de modules, voir Développement de types de modules dans le Guide de l'utilisateur de l'interface de ligne de CloudFormation commande.

Utilisation de modules dans un modèle

Pour utiliser un module, assurez-vous qu'il est enregistré dans le compte et la région dans lesquels vous souhaitez l'utiliser. Pour plus d’informations, consultez Extensions publiques et privées. Vous enregistrez les modules dans le CloudFormation registre en tant qu'extensions privées. Ensuite, traitez-le autant que vous le feriez pour une ressource individuelle :

  • Incluez-le dans la section Ressources de votre modèle.

  • Spécifiez les propriétés nécessaires pour le module.

Lorsque vous lancez une opération de stack, CloudFormation génère un modèle traité qui convertit tous les modules inclus dans les ressources appropriées. Utilisez des ensembles de modifications pour prévisualiser les ressources à ajouter ou à mettre à jour avant d'exécuter réellement l'opération de pile. Pour plus d’informations, consultez Mise à jour des piles à l'aide de jeux de modifications.

Prenons l'exemple suivant : Vous disposez d'un modèle qui contient à la fois des ressources et des modules. Le modèle contient une ressource individuelle, ResourceA, ainsi qu'un module. ModuleParent Ce module contient deux ressources, ResourceB et ResourcEC, ainsi qu'un module imbriqué. ModuleChild ModuleChildcontient une seule ressource, ResourceD. Si vous créez une pile à partir de ce modèle, CloudFormation traitez le modèle et associez les modules aux ressources appropriées. La pile qui en résulte dispose de quatre ressources : ResourceA, ResourceB, ResourceCet RessourceD.

Au cours d'une opération de pile, CloudFormation résout les deux modules inclus dans le modèle de pile en quatre ressources appropriées.

CloudFormation permet de savoir quelles ressources d'une pile ont été créées à partir de modules. Vous pouvez afficher ces informations dans les onglets Événements, Ressources et Écarts pour une pile donnée. Elles sont également comprises dans les prévisualisations des ensembles de modifications.

Les modules se distinguent des ressources d'un modèle, car ils adhèrent à la convention de dénomination en quatre parties suivante, par opposition à la convention typique en trois parties utilisée par les ressources :

organization::service::use-case::MODULE

Utilisation de paramètres pour spécifier des valeurs de module

Les modules peuvent inclure des paramètres de module. Tout comme les paramètres de modèle, les paramètres de module vous permettent d'entrer des valeurs personnalisées dans votre module à partir du modèle (ou du module) qui le contient. Le module peut ensuite utiliser ces valeurs pour configurer les propriétés des ressources qu'il contient.

Vous pouvez également définir des paramètres de modèle qui configurent à leur tour les propriétés de module, de sorte que les utilisateurs puissent entrer des valeurs qui seront transmises au module au moment de l'opération de pile. Pour plus d'informations sur la définition des paramètres du modèle, consultezParamètres.

De même, si un module contient un module imbriqué qui inclut des paramètres de module, vous pouvez :

  • spécifier les valeurs des paramètres du module imbriqué directement dans le module parent ;

  • définir les paramètres correspondants du module dans le module parent qui permettent de configurer les paramètres du module imbriqué avec le modèle (ou le module) dans lequel le module parent est contenu.

Utilisation des paramètres de modèle pour spécifier les valeurs des paramètres de module

L'exemple suivant montre comment définir des paramètres de modèle qui transmettent des valeurs à un module.

Ici, le modèle contenant My::S3::SampleBucket::MODULE définit un paramètre de modèle, BucketName, qui permet à l'utilisateur de spécifier un nom de compartiment S3 pendant l'opération de pile.

// Template containing My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } } } }

Spécification des propriétés sur les ressources d'un module enfant à partir du module parent

L'exemple suivant illustre comment spécifier des valeurs de paramètre dans un module imbriqué dans un autre module.

Ce premier module, My::S3::SampleBucketPrivate::MODULE, sera le module enfant. Il définit deux paramètres : BucketName et AccessControl. Les valeurs spécifiées pour ces paramètres permettent de spécifier les propriétés BucketName et AccessControl de la ressource AWS::S3::Bucket contenue par le module. Ci-dessous se trouve le fragment de modèle pour My::S3::SampleBucketPrivate::MODULE.

// My::S3::SampleBucketPrivate::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket with Versioning and DeletionPolicy.", "Parameters": { "BucketName": { "Description": "Name for the bucket", "Type": "String" }, "AccessControl": { "Description": "AccessControl for the bucket", "Type": "String" } }, "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl": { "Ref": "AccessControl" }, "DeletionPolicy": "Retain", "VersioningConfiguration": { "Status": "Enabled" } } } } }

Ensuite, le module précédent est imbriqué dans un module parent, My::S3::SampleBucket::MODULE. Le module parent, My::S3::SampleBucket::MODULE, définit les paramètres du module enfant de la manière suivante :

  • Il définit le AccessControl paramètre de My::S3::SampleBucketPrivate::MODULE àPrivate.

  • Pour BucketName, il définit un paramètre de module qui permettra de spécifier le nom du compartiment dans le modèle (ou le module) qui contient My::S3::SampleBucket::MODULE.

// My::S3::SampleBucket::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket. With Private AccessControl.", "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucketPrivate::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl" : "Private" } } } }

Spécification des contraintes pour les paramètres de module

Les paramètres du module ne prennent pas en charge l'application des contraintes. Pour plus d’informations, consultez Propriétés. Pour effectuer une vérification de contrainte sur un paramètre de module, créez un paramètre de modèle avec les contraintes souhaitées, puis référencez ce paramètre de modèle dans votre paramètre de module.

Référencement de ressources dans un module

Les ressources d'un module peuvent être référencées par un nom logique. Le nom logique complet d'une ressource contenue dans un module peut être construit en combinant :

  • Nom logique spécifié pour le module dans le modèle le contenant (ou le module le contenant).

  • Nom logique de la ressource, spécifié dans le module.

Le nom logique complet de la ressource peut être spécifié avec ou sans l'utilisation d'un point comme délimiteur. Par exemple, les deux noms logiques ci-dessous sont valides et équivalents d'un point de vue fonctionnel :

  • ModuleLogicalName.ResourceLogicalName

  • ModuleLogicalNameResourceLogicalName

De cette façon, vous pouvez utiliser les fonctions intrinsèques GetAtt et Ref pour accéder aux valeurs de propriété des ressources du module.

Dans l'exemple suivant, le modèle fait référence à une propriété dans un module pour configurer une propriété correspondante sur une ressource dans le modèle lui-même.

Supposons que le module My::S3::SampleBucket::MODULE contienne une ressource AWS::S3::Bucket avec le nom logique de S3Bucket. Pour référencer le nom de compartiment de cette ressource à l'aide de la fonction intrinsèque Ref, combinez le nom logique donné au module dans le modèle, MyBucket, avec le nom logique de la ressource dans le module, S3Bucket, pour obtenir le nom logique complet de la ressource : MyBucket.S3Bucket ou MyBucketS3Bucket.

Les noms logiques des ressources contenues dans un module sont spécifiés dans le schéma du module. Vous pouvez accéder à ce schéma de la manière suivante :

  • Trouver le module dans le CloudFormation registre. L'onglet Schéma affiche le schéma du module.

  • Utilisation de l'DescribeTypeopération pour renvoyer les détails du module, y compris le schéma.

// Template that uses My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } }, "exampleQueue": { "Type": "AWS::SQS::Queue", "Properties": { "QueueName": { "Ref": "MyBucket.S3Bucket" } } } }, "Outputs": { "BucketArn": { "Value": { "Fn::GetAtt": [ "MyBucket", "S3Bucket.Arn" ] } } } }
Parameters: BucketName: Description: Name for your sample bucket Type: String Resources: MyBucket: Type: My::S3::SampleBucket::MODULE Properties: BucketName: !Ref BucketName exampleQueue: Type: AWS::SQS::Queue Properties: QueueName: !Ref MyBucket.S3Bucket Outputs: BucketArn: Value: !GetAtt MyBucket.S3Bucket.Arn

Considérations relatives à l'utilisation de modules

  • L'utilisation d'un module n'implique aucun coût supplémentaire. Vous ne payez que pour les ressources que ces modules résolvent dans vos piles.

  • CloudFormation les quotas, tels que le nombre maximum de ressources autorisées dans une pile ou la taille maximale du corps du modèle, s'appliquent au modèle traité, que les ressources incluses dans ce modèle proviennent de modules ou non. Pour plus d’informations, consultez Comprendre les CloudFormation quotas.

  • Les balises que vous spécifiez au niveau de la pile sont affectées aux ressources individuelles dérivées du module.

  • Les scripts d'assistance spécifiés au niveau du module ne se propagent pas aux ressources individuelles contenues dans le module lors du traitement du CloudFormation modèle.

  • Les sorties spécifiées dans le module sont propagées aux sorties au niveau du modèle.

    Chaque sortie se voit attribuer un ID logique qui est une concaténation du nom logique du module et du nom de sortie tel que défini dans le module. Pour plus d'informations sur les sorties, consultezOutputs.

  • Les paramètres spécifiés dans le module ne sont pas propagés aux paramètres au niveau du modèle.

    Toutefois, vous pouvez créer des paramètres au niveau du modèle qui font référence aux paramètres au niveau du module. Pour plus d’informations, consultez Utilisation de paramètres pour spécifier des valeurs de module.

Enregistrement des modules et gestion des versions

Vous enregistrez et gérez les modules de votre compte et de votre région à l'aide du CloudFormation registre. Pour plus d’informations, consultez Utilisation du AWS CloudFormation registre.

Vous pouvez enregistrer plusieurs versions du même module dans un compte et une région donnés. Gardez les considérations suivantes à l'esprit :

  • Un module doit être enregistré dans le compte et la région dans lesquels vous souhaitez l'utiliser.

  • Pendant les opérations de pile, CloudFormation utilise la version du module actuellement enregistrée comme version par défaut dans le compte et la région dans lesquels l'opération de pile est effectuée. Cela inclut les modules imbriqués dans d'autres modules.

    Par conséquent, sachez que si différentes versions du même module sont enregistrées comme version par défaut dans différents comptes ou régions, l'utilisation du même modèle peut entraîner des résultats différents.

    Pour plus d’informations, consultez Spécification de la version d'une extension privée à utiliser à l'aide du AWS CLI.

  • Pendant les opérations de pile, CloudFormation utilise la version de la ressource actuellement enregistrée comme version par défaut dans le compte et la région dans lesquels l'opération de pile est effectuée. Cela inclut les ressources générées par l'inclusion de modules.

  • La modification de la version par défaut d'un module ne lance aucune opération de mise à jour de la pile. Toutefois, la prochaine fois que vous effectuerez une opération de pile avec un modèle contenant ce module, comme une mise à jour de pile, la nouvelle version par défaut CloudFormation sera utilisée dans l'opération.

    La seule exception est d'effectuer une mise à jour de pile avec l'option spécifiée Utiliser le modèle précédent, comme décrit ci-dessous.

  • Pour les opérations de mise à jour de pile, si vous spécifiez l'option Utiliser le CloudFormation modèle précédent, utilisez le modèle traité précédent pour la mise à jour de pile et ne retraitez pas le module pour les modifications que vous pourriez y avoir apportées.

  • Pour garantir des résultats uniformes, si vous incluez des modules dans un modèle de pile à utiliser avec des ensembles de pile, vous devez vous assurer que la même version du module est configurée de la même manière que la version par défaut dans tous les comptes et régions dans lesquels vous prévoyez de déployer vos instances de pile. Cela inclut les modules imbriqués dans d'autres modules. Pour plus d'informations sur les ensembles de piles, consultezTravailler avec AWS CloudFormation StackSets.

Pour plus d'informations sur l'enregistrement de nouvelles versions d'un module ou sur la modification de la version par défaut d'un module, consultezUtilisation du AWS CloudFormation registre.

Activation des modules publics à utiliser dans votre compte

Afin d'activer correctement un module public dans votre compte et votre région, les conditions suivantes doivent être respectées pour chaque extension publique tierce (ressource ou module) incluse dans le module :

  • L'extension doit déjà être activée dans le compte et la région.

    Si l'extension du module utilise un alias de nom de type, l'extension doit être enregistrée dans votre compte et votre région en utilisant le même alias de nom de type. Pour plus d’informations, consultez Spécification d'alias pour faire référence aux extensions.

  • La version d'extension actuellement activée doit être l'une des versions majeures prises en charge de cette extension spécifiée dans le module. Pour plus d'informations, consultez la section Configuration requise pour publier un module public dans le guide de l'utilisateur de la CloudFormation CLI.

Si les extensions et versions d'extension publiques tierces ne sont pas activées correctement, l'opération CloudFormation échouera et une erreur indiquera les extensions et/ou les versions qui doivent être activées pour que le module puisse être activé avec succès.