Fonctions de condition - AWS CloudFormation

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'UpdatePolicyattribut, 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 ou false.

Fn::Andexemples 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::Equalsexemples 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'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]

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::Ifexemples d'utilisation

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 valeur true ou false.

Fn::Notexemples 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 ou false.

Fn::Orexemples 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::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 Attribut Condition rubrique.