Fonctions de condition - AWS CloudFormation

Il s’agit du nouveau Guide de référence des modèles CloudFormation. 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 ou Fn::Equals pour créer et configurer des ressources de pile selon une logique conditionnelle. Ces conditions sont évaluées lors de la création ou de la mise à jour de la pile. Une fois toutes vos conditions définies, vous pouvez les associer à des ressources ou à des propriétés de ressources dans les sections Resources et Outputs du modèle.

Pour des scénarios avancés, vous pouvez combiner les conditions à l’aide des fonctions Fn::And ou Fn::Or, ou utiliser Fn::Not pour inverser 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 section Conditions du modèle, à l’exception des conditions Fn::If. Vous pouvez utiliser la condition Fn::If dans l’attribut Metadata, l’attribut UpdatePolicy, et dans les valeurs des propriétés des sections Resources et Outputs.

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]

Parameters

condition

Condition qui correspond à true ou false.

Exemples d’utilisation de Fn::And

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]

Parameters

value

Une valeur de chaîne à comparer.

Exemples d’utilisation de Fn::Equals

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'Metadataattribut, 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

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]

Parameters

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.

Exemples d’utilisation de Fn::If

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 section Output d’un modèle, vous pouvez utiliser la fonction Fn::If pour générer conditionnellement des valeurs de sortie. 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 conditionnelles de tableaux

L’exemple suivant utilise Fn::If pour fournir conditionnellement différentes valeurs de tableau selon une condition. Si la condition MoreThan2AZs est « true », trois sous-réseaux publics sont utilisés. Sinon, seuls deux sous-réseaux publics sont utilisés.

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 et valeurs de propriétés conditionnelles

L’exemple suivant utilise le pseudo-paramètre AWS::NoValue dans une fonction Fn::If. 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 fonction Fn::If dans la propriété AllocatedStorage de l’instance de base de données Amazon RDS. Si la condition IsProduction est « true », la taille de stockage est définie sur 100. Sinon, elle est définie sur 20.

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 conditionnelles

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]

Parameters

condition

Condition comme Fn::Equals, qui a la valeur true ou false.

Exemples d’utilisation de Fn::Not

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, ...]

Parameters

condition

Condition qui correspond à true ou false.

Exemples d’utilisation de Fn::Or

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. Pour spécifier conditionnellement le type d’instance, le modèle définit deux conditions dans la section Conditions du modèle : CreateProdResources, qui est « true » si la valeur du paramètre EnvType est égale à prod, et CreateDevResources, qui est « 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 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 rubrique ConditionAttribut .