Il s'agit du nouveau guide AWS CloudFormation de référence des modèles. Veuillez mettre à jour vos favoris et vos liens. Pour obtenir de l'aide pour démarrer CloudFormation, consultez le guide de AWS CloudFormation l'utilisateur.
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.
Fonctions de condition
Vous pouvez utiliser des fonctions intrinsèques, telles que Fn::If
ouFn::Equals
, pour créer et configurer des ressources de pile en fonction de la logique conditionnelle. Ces conditions sont évaluées lors de la création ou des mises à jour de la pile. Après avoir défini toutes vos conditions, vous pouvez les associer à des ressources ou à des propriétés de ressources dans les Outputs
sections Resources
et d'un modèle.
Pour les scénarios avancés, vous pouvez combiner des conditions à l'aide de Fn::Or
fonctions Fn::And
ou Fn::Not
pour annuler la valeur d'une condition. Vous pouvez également imbriquer des conditions pour créer une logique conditionnelle plus complexe.
Si vous utilisez des conditions pour la première fois dans vos modèles, nous vous recommandons de consulter d'abord la rubrique relative à la syntaxe des conditions du CloudFormation modèle dans le Guide de AWS CloudFormation l'utilisateur.
Note
Vous devez définir toutes les conditions dans la Conditions
section d'un modèle, à l'exception Fn::If
des conditions. Vous pouvez utiliser la Fn::If
condition dans les valeurs Metadata
d'UpdatePolicy
attribut, d'attribut et de propriété des Outputs
sections Resources
et.
Fn::And
Renvoie true
si toutes les conditions spécifiées correspondent à true ou renvoie false
si l'une des conditions équivaut à false. Fn::And
agit en tant qu'opérateur AND. Le nombre minimum de conditions que vous pouvez inclure est de 2, et la valeur maximale est de 10.
Déclaration
JSON
"Fn::And": [{
condition
}, {...
}]
YAML
Syntaxe pour le nom complet de la fonction :
Fn::And: [
condition
]
Syntaxe pour la forme courte :
!And [
condition
]
Paramètres
- condition
-
Condition qui correspond à
true
oufalse
.
Fn::And
exemples d'utilisation
La condition MyAndCondition
suivante équivaut à true si le nom du groupe de sécurité référencé est égal à sg-mysggroup
et si SomeOtherCondition
est défini sur true :
JSON
"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }
YAML
MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref ASecurityGroup] - !Condition SomeOtherCondition
Fn::Equals
Compare si deux valeurs sont égales Renvoie true
si les deux valeurs sont égales ou false
si elles ne le sont pas.
Déclaration
JSON
"Fn::Equals" : ["
value_1
", "value_2
"]
YAML
Syntaxe pour le nom complet de la fonction :
Fn::Equals: [
value_1
,value_2
]
Syntaxe pour la forme courte :
!Equals [
value_1
,value_2
]
Paramètres
- value
-
Valeur de chaîne que vous souhaitez comparer.
Fn::Equals
exemples d'utilisation
La condition IsProduction
suivante équivaut à true si la valeur du paramètre EnvironmentType
est égal à prod
:
JSON
"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }
YAML
IsProduction: !Equals [!Ref EnvironmentType, prod]
Fn::If
Renvoie une valeur si la condition spécifiée équivaut à true
et une autre valeur si la condition spécifiée équivaut à false
. Actuellement, CloudFormation prend en charge la fonction Fn::If
intrinsèque dans les valeurs UpdatePolicy
d'Metadata
attribut, d'attribut et de propriété dans la Resources
section et Outputs
les sections d'un modèle. Vous pouvez utiliser le pseudo-paramètre AWS::NoValue
comme valeur de retour pour supprimer la propriété correspondante.
Déclaration
JSON
"Fn::If": [
condition_name
,value_if_true
,value_if_false
]
YAML
Syntaxe pour le nom complet de la fonction :
Fn::If: [
condition_name
,value_if_true
,value_if_false
]
Syntaxe pour la forme courte :
!If [
condition_name
,value_if_true
,value_if_false
]
Paramètres
- condition_name
-
Référence à une condition dans la section Conditions. Utilisez le nom de la condition pour la référencer.
- value_if_true
-
Valeur à renvoyer si la condition spécifiée équivaut à true.
- value_if_false
-
Valeur à renvoyer si la condition spécifiée équivaut à
false
.
Fn::If
exemples d'utilisation
Rubriques
Choix conditionnel d'une ressource
L'exemple suivant utilise une Fn::If
fonction dans une définition de EC2 ressource Amazon pour déterminer la ressource du groupe de sécurité à associer à l'instance. Si la CreateNewSecurityGroup
condition est vraie, CloudFormation utilise la valeur référencée de NewSecurityGroup
(un groupe de sécurité créé ailleurs dans le modèle) pour spécifier la SecurityGroupIds
propriété. Si la valeur CreateNewSecurityGroup
est fausse, CloudFormation utilise la valeur référencée de ExistingSecurityGroupId
(un paramètre qui fait référence à un groupe de sécurité existant).
JSON
"Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0abcdef1234567890", "InstanceType": "t3.micro", "SecurityGroupIds": { "Fn::If": [ "CreateNewSecurityGroup", [{"Ref": "NewSecurityGroup"}], [{"Ref": "ExistingSecurityGroupId"}] ] }] } } }
YAML
Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0abcdef1234567890 InstanceType: t3.micro SecurityGroupIds: !If - CreateNewSecurityGroup - [!Ref NewSecurityGroup] - [!Ref ExistingSecurityGroupId]
Sorties conditionnelles
Dans la Output
section d'un modèle, vous pouvez utiliser la Fn::If
fonction pour générer des informations de manière conditionnelle. Dans l'extrait suivant, si la CreateNewSecurityGroup
condition est vraie, CloudFormation affiche l'ID du groupe de sécurité de la ressource. NewSecurityGroup
Si la condition est fausse, CloudFormation affiche l'ID du groupe de sécurité de la ExistingSecurityGroup
ressource.
JSON
"Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroupId"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
Valeurs de tableau conditionnelles
L'exemple suivant permet Fn::If
de fournir de manière conditionnelle différentes valeurs de tableau en fonction d'une condition. Si la MoreThan2AZs
condition est vraie, elle utilise trois sous-réseaux publics. Dans le cas contraire, il n'utilise que deux sous-réseaux publics.
JSON
"Subnets": { "Fn::If": [ "MoreThan2AZs", [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"}, {"Fn::ImportValue": "PublicSubnet03"} ], [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"} ] ] }
YAML
Subnets: Fn::If: - MoreThan2AZs - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02 - Fn::ImportValue: PublicSubnet03 - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02
Propriétés conditionnelles et valeurs des propriétés
L'exemple suivant utilise le AWS::NoValue
pseudo-paramètre dans une Fn::If
fonction. La condition utilise un instantané pour une instance de base de données Amazon RDS uniquement si un ID d'instantané est fourni. Si la UseDBSnapshot
condition est vraie, CloudFormation utilise la valeur du DBSnapshotName
paramètre de la DBSnapshotIdentifier
propriété. Si la condition équivaut à false, CloudFormation supprime la propriété DBSnapshotIdentifier
.
Il utilise également une Fn::If
fonction dans la AllocatedStorage
propriété de l'instance de base de données Amazon RDS. Si la IsProduction
condition est vraie, la taille de stockage est définie sur. 100
Dans le cas contraire, il est réglé sur20
.
JSON
"MyDatabase" : { "Type" : "AWS::RDS::DBInstance", "Properties": { "DBInstanceClass": "db.t3.micro", "AllocatedStorage": { "Fn::If": [ "IsProduction", 100, 20 ] }, "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDatabase: Type: AWS::RDS::DBInstance Properties: DBInstanceClass: db.t3.micro AllocatedStorage: !If [IsProduction, 100, 20] Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
Politiques de mise à jour conditionnelle
L'extrait suivant fournit une politique de mise à jour Auto Scaling uniquement si la condition RollingUpdates
équivaut à true (vrai). Si la condition est fausse, CloudFormation la politique de AutoScalingRollingUpdate
mise à jour est supprimée.
JSON
"UpdatePolicy": { "Fn::If": [ "RollingUpdates", { "AutoScalingRollingUpdate": { "MaxBatchSize": 2, "MinInstancesInService": 2, "PauseTime": "PT0M30S" } }, { "Ref": "AWS::NoValue" } ] }
YAML
UpdatePolicy: !If - RollingUpdates - AutoScalingRollingUpdate: MaxBatchSize: 2 MinInstancesInService: 2 PauseTime: PT0M30S - !Ref "AWS::NoValue"
Fn::Not
Renvoie true
pour une condition qui équivaut à false
, ou renvoie false
pour une condition qui équivaut à true
. Fn::Not
agit en tant qu'opérateur NOT.
Déclaration
JSON
"Fn::Not": [{
condition
}]
YAML
Syntaxe pour le nom complet de la fonction :
Fn::Not: [
condition
]
Syntaxe pour la forme courte :
!Not [
condition
]
Paramètres
- condition
-
Condition comme
Fn::Equals
, qui a la valeurtrue
oufalse
.
Fn::Not
exemples d'utilisation
La condition EnvCondition
suivante équivaut à true si la valeur du paramètre EnvironmentType
est égal à prod
:
JSON
"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }
YAML
MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]
Fn::Or
Renvoie true
si l'une quelconque des conditions spécifiées équivaut à true, ou renvoie false
si toutes les conditions équivalent à false. Fn::Or
agit en tant qu'opérateur OR. Le nombre minimum de conditions que vous pouvez inclure est de 2, et la valeur maximale est de 10.
Déclaration
JSON
"Fn::Or": [{
condition
}, {...
}]
YAML
Syntaxe pour le nom complet de la fonction :
Fn::Or: [
condition, ...
]
Syntaxe pour la forme courte :
!Or [
condition, ...
]
Paramètres
- condition
-
Condition qui correspond à
true
oufalse
.
Fn::Or
exemples d'utilisation
La condition MyOrCondition
suivante équivaut à true si le nom du groupe de sécurité référencé est égal à sg-mysggroup
ou si SomeOtherCondition
est défini sur true :
JSON
"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }
YAML
MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
Fonctions prises en charge
Vous pouvez utiliser les fonctions suivantes dans la condition Fn::If
:
-
Fn::Base64
-
Fn::FindInMap
-
Fn::GetAtt
-
Fn::GetAZs
-
Fn::If
-
Fn::Join
-
Fn::Select
-
Fn::Sub
-
Ref
Vous pouvez utiliser les fonctions suivantes dans toutes les autres fonctions de condition, comme Fn::Equals
et Fn::Or
:
-
Fn::FindInMap
-
Ref
-
Autres fonctions de condition
Exemple 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 :
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. Afin de spécifier le type d'instance de manière conditionnelle, le modèle définit deux conditions dans la Conditions
section du modèle :CreateProdResources
, qui est évaluée comme vraie si la valeur du EnvType
paramètre est égale à prod
etCreateDevResources
, qui est évaluée comme vraie 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 c5.xlarge
. Si la condition équivaut à false, la condition CreateDevResources
est évaluée. Si la condition CreateDevResources
équivaut à true, le type d'instance est t3.medium
. Sinon, le type d'instance est t3.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.
Exemple JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "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" : "ami-1234567890abcdef0", "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c5.xlarge", {"Fn::If" : [ "CreateDevResources", "t3.medium", "t3.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" 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: ami-1234567890abcdef0 InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.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
Note
Pour des exemples plus complexes d'utilisation de conditions pour créer des ressources, consultez la Attribut Condition rubrique.