Exemples de modèle - 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.

Exemples de modèle

Création de ressources de manière conditionnelle pour une pile de production, de développement ou de test

Dans certains cas, vous pouvez créer des piles qui sont semblables, mais qui impliquent des modifications mineures. Par exemple, vous utilisez peut-être un modèle pour les applications de production. Vous voulez créer la même pile de production afin de pouvoir l'utiliser pour le développement ou les tests. Cependant, pour le développement et les tests, vous n'avez pas forcément besoin de toute la capacité supplémentaire qui est incluse dans une pile de production. Au lieu de cela, vous pouvez utiliser un paramètre d'entrée pour le type d'environnement afin de créer de manière conditionnelle les ressources qui sont spécifiques à la production, au développement ou au test, comme illustré dans l'exemple suivant :

Exemple JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867"}, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235"}, "us-west-2" : { "AMI" : "ami-a0cfeed8"}, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98"}, "sa-east-1" : { "AMI" : "ami-07b14488da8ea02a0"}, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10"}, "ap-southeast-2" : { "AMI" : "ami-09b42976632b27e9b"}, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85"} } }, "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}, "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c1.xlarge", {"Fn::If" : [ "CreateDevResources", "m1.large", "m1.small" ]} ]} } }, "MountPoint" : { "Type" : "AWS::EC2::VolumeAttachment", "Condition" : "CreateProdResources", "Properties" : { "InstanceId" : { "Ref" : "EC2Instance" }, "VolumeId" : { "Ref" : "NewVolume" }, "Device" : "/dev/sdh" } }, "NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} } } } }
Exemple YAML
AWSTemplateFormatVersion: "2010-09-09" Mappings: RegionMap: us-east-1: AMI: "ami-0ff8a91507f77f867" us-west-1: AMI: "ami-0bdb828fd58c52235" us-west-2: AMI: "ami-a0cfeed8" eu-west-1: AMI: "ami-047bb4163c506cd98" sa-east-1: AMI: "ami-07b14488da8ea02a0" ap-southeast-1: AMI: "ami-08569b978cc4dfa10" ap-southeast-2: AMI: "ami-09b42976632b27e9b" ap-northeast-1: AMI: "ami-06cd52961ce9f0d85" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: [prod, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] InstanceType: !If [CreateProdResources, c1.xlarge, !If [CreateDevResources, m1.large, m1.small]] MountPoint: Type: "AWS::EC2::VolumeAttachment" Condition: CreateProdResources Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: "AWS::EC2::Volume" Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone

Vous pouvez spécifier prod, dev ou test pour le paramètre EnvType. Pour chaque type d'environnement, le modèle spécifie un autre type d'instance. Les types d'instance peuvent aller d'un type d'instance volumineux, optimisé pour le calcul à un type d'instance à usage général et de petite taille. Pour spécifier le type d'instance de manière conditionnelle, le modèle définit deux conditions dans la section Conditions : CreateProdResources, qui équivaut à true si la valeur du paramètre EnvType est égale à prod et CreateDevResources, qui équivaut à true si la valeur du paramètre est égale à dev.

Dans la propriété InstanceType, les modèles hébergent deux fonctions intrinsèques Fn::Ifpour déterminer le type d'instance à utiliser. Si la condition CreateProdResources équivaut à true, le type d'instance est c1.xlarge. Si la condition équivaut à false, la condition CreateDevResources est évaluée. Si la condition CreateDevResources équivaut à true, le type d'instance est m1.large. Sinon, le type d'instance est m1.small.

Outre le type d'instance, l'environnement de production crée et attache un EC2 volume Amazon à l'instance. Les ressources MountPoint et NewVolume sont associées à la condition CreateProdResources pour que les ressources soient créées uniquement si la condition équivaut à true.

Attribution d'une propriété de ressource de manière conditionnelle

Dans cet exemple, vous pouvez créer une RDS instance de base de données Amazon à partir d'un instantané. Si vous spécifiez le DBSnapshotName paramètre, CloudFormation utilise la valeur du paramètre comme nom du cliché lors de la création de l'instance de base de données. Si vous conservez la valeur par défaut (chaîne vide), CloudFormation supprimez la DBSnapshotIdentifier propriété et créez une instance de base de données à partir de zéro.

L’exemple définit les paramètres DBUser et DBPassword avec la propriété NoEcho définie sur true. Si vous définissez l'NoEchoattribut surtrue, CloudFormation renvoie la valeur du paramètre masquée sous forme d'astérisques (*****) pour tous les appels décrivant la pile ou les événements de la pile, à l'exception des informations stockées aux emplacements spécifiés ci-dessous.

Important

L'utilisation de l'attribut NoEcho ne masque aucune information stockée dans les lieux suivants :

  • La section des Metadata modèles. CloudFormation ne transforme, ne modifie ni n'expédie aucune information que vous incluez dans Metadata cette section. Pour de plus amples informations, veuillez consulter Metadata.

  • La section de modèle Outputs Pour de plus amples informations, veuillez consulter Outputs.

  • L’attribut Metadata d'une définition de ressource. Pour de plus amples informations, veuillez consulter Attribut Metadata.

Nous vous recommandons vivement de ne pas utiliser ces mécanismes pour inclure des informations sensibles, telles que des mots de passe ou des secrets.

Important

Plutôt que d'intégrer des informations sensibles directement dans vos CloudFormation modèles, nous vous recommandons d'utiliser des paramètres dynamiques dans le modèle de pile pour référencer les informations sensibles stockées et gérées à l'extérieur CloudFormation, par exemple dans le AWS Systems Manager Parameter Store ou AWS Secrets Manager.

Pour plus d'informations, consultez les N'incorporez pas d'informations d'identification dans vos modèles meilleures pratiques.

Exemple JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters": { "DBUser": { "NoEcho": "true", "Description" : "The database admin account username", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "DBPassword": { "NoEcho": "true", "Description" : "The database admin account password", "Type": "String", "MinLength": "1", "MaxLength": "41", "AllowedPattern" : "[a-zA-Z0-9]*", "ConstraintDescription" : "must contain only alphanumeric characters." }, "DBSnapshotName": { "Description": "The name of a DB snapshot (optional)", "Default": "", "Type": "String" } }, "Conditions": { "UseDBSnapshot": {"Fn::Not": [{"Fn::Equals" : [{"Ref" : "DBSnapshotName"}, ""]}]} }, "Resources" : { "MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }, "MyRDSParamGroup" : { "Type": "AWS::RDS::DBParameterGroup", "Properties" : { "Family" : "MySQL5.5", "Description" : "CloudFormation Sample Database Parameter Group", "Parameters" : { "autocommit" : "1" , "general_log" : "1", "old_passwords" : "0" } } } } }
Exemple YAML
AWSTemplateFormatVersion: "2010-09-09" Parameters: DBUser: NoEcho: true Description: The database admin account username Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" ConstraintDescription: must begin with a letter and contain only alphanumeric characters. DBPassword: NoEcho: true Description: The database admin account password Type: String MinLength: 1 MaxLength: 41 AllowedPattern: "[a-zA-Z0-9]*" ConstraintDescription: must contain only alphanumeric characters. DBSnapshotName: Description: The name of a DB snapshot (optional) Default: "" Type: String Conditions: UseDBSnapshot: !Not [!Equals [!Ref DBSnapshotName, ""]] Resources: MyDB: Type: "AWS::RDS::DBInstance" Properties: AllocatedStorage: 5 DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"] MyRDSParamGroup: Type: "AWS::RDS::DBParameterGroup" Properties: Family: MySQL5.5 Description: CloudFormation Sample Database Parameter Group Parameters: autocommit: 1 general_log: 1 old_passwords: 0

La condition UseDBSnapshot a la valeur true uniquement si DBSnapshotName n'est pas une chaîne vide. Si la UseDBSnapshot condition est vraie, CloudFormation utilise la valeur du DBSnapshotName paramètre de la DBSnapshotIdentifier propriété. Si la condition est fausse, la DBSnapshotIdentifier propriété CloudFormation est supprimée. Le pseudo-paramètre AWS::NoValue supprime la propriété de ressource correspondante lorsqu'elle est utilisée comme valeur de retour.

Utilisation d'une ressource existante de manière conditionnelle

Dans cet exemple, vous pouvez utiliser un groupe de EC2 sécurité Amazon qui a déjà été créé ou vous pouvez créer un nouveau groupe de sécurité, qui est spécifié dans le modèle. Pour le paramètre ExistingSecurityGroup, vous pouvez spécifier le nom du groupe de sécurité default ou NONE. Si vous le spécifiezdefault, CloudFormation utilise un groupe de sécurité déjà créé et nommédefault. Si vous le spécifiezNONE, CloudFormation crée le groupe de sécurité défini dans le modèle.

Exemple JSON
{ "Parameters" : { "ExistingSecurityGroup" : { "Description" : "An existing security group ID (optional).", "Default" : "NONE", "Type" : "String", "AllowedValues" : ["default", "NONE"] } }, "Conditions" : { "CreateNewSecurityGroup" : {"Fn::Equals" : [{"Ref" : "ExistingSecurityGroup"}, "NONE"] } }, "Resources" : { "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-0ff8a91507f77f867", "SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }] } }, "NewSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Condition" : "CreateNewSecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0" } ] } } }, "Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] } } } }
Exemple YAML
Parameters: ExistingSecurityGroup: Description: An existing security group ID (optional). Default: NONE Type: String AllowedValues: - default - NONE Conditions: CreateNewSecurityGroup: !Equals [!Ref ExistingSecurityGroup, NONE] Resources: MyInstance: Type: "AWS::EC2::Instance" Properties: ImageId: "ami-0ff8a91507f77f867" SecurityGroups: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup] NewSecurityGroup: Type: "AWS::EC2::SecurityGroup" Condition: CreateNewSecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

Pour déterminer s'il faut créer la ressource NewSecurityGroup, celle-ci est associée à la condition CreateNewSecurityGroup. La ressource est créée uniquement lorsque la condition équivaut à true (lorsque le paramètre ExistingSecurityGroup est égal à NONE).

Dans la propriété SecurityGroups, le modèle utilise la fonction intrinsèque Fn::If pour déterminer le groupe de sécurité à utiliser. Si la condition CreateNewSecurityGroup a la valeur true, la propriété de groupe de sécurité référence la ressource NewSecurityGroup. Si la condition CreateNewSecurityGroup a la valeur false, la propriété de groupe de sécurité référence le paramètre ExistingSecurityGroup (groupe de sécurité default).

Enfin, le modèle génère l'ID de groupe de sécurité de manière conditionnelle. Si la CreateNewSecurityGroup condition est vraie, CloudFormation affiche l'ID du groupe de sécurité de la NewSecurityGroup ressource. Si la condition est fausse, CloudFormation affiche l'ID du groupe de sécurité de la ExistingSecurityGroup ressource.