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::If
pour 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'NoEcho
attribut 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 dansMetadata
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.