Syntaxe Conditions du modèle CloudFormation - 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.

Syntaxe Conditions du modèle CloudFormation

La section Conditions facultative contient des instructions qui définissent les circonstances dans lesquelles les entités sont créées et configurées. Par exemple, vous pouvez créer une condition et l’associer à une ressource ou à une sortie, afin que CloudFormation crée cette ressource ou cette sortie uniquement si la condition est « true ». De même, vous pouvez associer une condition à une propriété afin que CloudFormation attribue une valeur spécifique à cette propriété uniquement si la condition est « true ». Si la condition est « false », CloudFormation attribue la valeur alternative que vous spécifiez.

Vous pouvez utiliser des conditions lorsque vous souhaitez réutiliser un modèle pour créer des ressources dans différents contextes, comme les environnements de test et de production. Par exemple, dans votre modèle, vous pouvez ajouter un paramètre d’entrée EnvironmentType qui accepte soit prod, soit test comme valeurs d’entrée. Pour l’environnement prod, vous pourriez inclure des instances EC2 avec certaines capacités, tandis que pour l’environnement test, vous pourriez utiliser des capacités réduites afin d’économiser des coûts. Cette définition de condition vous permet de déterminer quelles ressources sont créées et comment elles sont configurées pour chaque type d’environnement.

Syntaxe

La section Conditions se compose du nom de clé Conditions. Chaque déclaration de condition comprend un ID logique et une ou plusieurs fonctions intrinsèques.

JSON

"Conditions": { "LogicalConditionName1": { "Intrinsic function": ...[ }, "LogicalConditionName2": { "Intrinsic function": ... } }

YAML

Conditions: LogicalConditionName1: Intrinsic function: ... LogicalConditionName2: Intrinsic function: ...

Fonctionnement des conditions

Pour utiliser des conditions, procédez comme suit :

  1. Ajouter une définition de paramètre : définissez les valeurs d’entrée que vos conditions devront évaluer dans la section Parameters du modèle. Les conditions s’évaluent comme « true » ou « false » en fonction de ces valeurs de paramètres d’entrée. Notez que les pseudo-paramètres sont automatiquement disponibles et ne nécessitent pas de définition explicite dans la section Parameters. Pour plus d'informations sur les pseudo-paramètres, consultez Obtenir des AWS valeurs à l'aide de pseudo-paramètres.

  2. Ajouter une définition de condition : définissez des conditions dans la section Conditions à l’aide de fonctions intrinsèques telles que Fn::If ou Fn::Equals. Ces conditions déterminent le moment où CloudFormation crée les ressources qui leur sont associées. Les conditions peuvent se baser sur :

    • Valeurs de paramètres d’entrée ou de pseudo-paramètres

    • Autres conditions

    • Valeurs de mappage

    Cependant, vous ne pouvez pas référencer des ID logiques de ressources ni leurs attributs dans des conditions.

  3. Associer des conditions à des ressources ou à des sorties : référencez les conditions dans les ressources ou les sorties à l’aide de la clé Condition et de l’ID logique d’une condition. Vous pouvez également utiliser Fn::If dans d’autres parties du modèle (comme des valeurs de propriétés) pour définir des valeurs dynamiques basées sur une condition. Pour de plus amples informations, consultez Utilisation de la clé Condition.

CloudFormation évalue les conditions lors de la création ou de la mise à jour d’une pile. CloudFormation crée les entités associées à une condition évaluée à « true » et ignore celles associées à une condition évaluée à « false ». Lors de chaque mise à jour de pile, CloudFormation réévalue ces conditions avant de modifier les ressources. Les entités qui restent associées à une condition « true » sont mises à jour, tandis que celles associées à une condition « false » sont supprimées.

Important

Pendant une mise à jour de la pile, vous ne pouvez pas mettre à jour les conditions. Vous pouvez uniquement les mettre à jour lorsque vous intégrez des changements qui ajoutent, modifient ou suppriment des ressources.

Fonctions intrinsèques de condition

Vous pouvez utiliser les fonctions intrinsèques suivantes pour définir des conditions :

Note

Fn::If n'est pris en charge que dans l'attribut de métadonnées, l'attribut de politique de mise à jour et les valeurs de propriété dans les sections Resources et Outputs d'un modèle.

Utilisation de la clé Condition

Une fois une condition définie, vous pouvez l’appliquer à plusieurs endroits du modèle, comme dans Resources ey Outputs, à l’aide de la clé Condition. La clé Condition référence le nom logique d’une condition et renvoie le résultat évalué de la condition spécifiée.

Association des conditions aux ressources

Pour créer des ressources de manière conditionnelle, ajoutez la clé Condition ainsi que l’ID logique de la condition comme attribut de la ressource. CloudFormation crée la ressource uniquement lorsque la condition est évaluée comme true.

JSON

"NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "IsProduction", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} } }

YAML

NewVolume: Type: AWS::EC2::Volume Condition: IsProduction Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone

Association des conditions aux sorties

Vous pouvez également associer des conditions aux sorties. CloudFormation crée la sortie uniquement lorsque la condition associée s’évalue à « true ».

JSON

"Outputs" : { "VolumeId" : { "Condition" : "IsProduction", "Value" : { "Ref" : "NewVolume" } } }

YAML

Outputs: VolumeId: Condition: IsProduction Value: !Ref NewVolume

Référencement des conditions dans d’autres conditions

Lorsque vous définissez des conditions dans la section Conditions, vous pouvez référencer d’autres conditions à l’aide de la clé Condition. Cela vous permet de créer une logique conditionnelle plus complexe en combinant plusieurs conditions.

Dans l’exemple suivant, la condition IsProdAndFeatureEnabled s’évalue à « true » uniquement si les conditions IsProduction et IsFeatureEnabled s’évaluent toutes deux à « true ».

JSON

"Conditions": { "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]}, "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]}, "IsProdAndFeatureEnabled" : { "Fn::And" : [ {"Condition" : "IsProduction"}, {"Condition" : "IsFeatureEnabled"} ] } }

YAML

Conditions: IsProduction: !Equals [!Ref Environment, "prod"] IsFeatureEnabled: !Equals [!Ref FeatureFlag, "enabled"] IsProdAndFeatureEnabled: !And - !Condition IsProduction - !Condition IsFeatureEnabled

Renvoi conditionnel de valeurs de propriétés à l’aide de Fn::If

Pour un contrôle plus précis, vous pouvez utiliser la fonction intrinsèque Fn::If afin de renvoyer conditionnellement l’une de deux valeurs dans des propriétés de ressources ou de sorties. Cette fonction évalue une condition et renvoie une valeur si la condition est « true », et une autre valeur si la condition est « false ».

Valeurs conditionnelles de propriétés

L’exemple suivant montre comment définir le type d’instance EC2 en fonction d’une condition liée à l’environnement. Si la condition IsProduction s’évalue à « true », le type d’instance est défini sur c5.xlarge. Sinon, elle est définie sur t3.small.

JSON
"Properties" : { "InstanceType" : { "Fn::If" : [ "IsProduction", "c5.xlarge", "t3.small" ] } }
YAML
Properties: InstanceType: !If - IsProduction - c5.xlarge - t3.small

Suppression conditionnelle de propriétés

Vous pouvez également utiliser le pseudo-paramètre AWS::NoValue comme valeur de renvoi pour supprimer la propriété correspondante lorsqu’une condition s’évalue à « false ».

JSON
"DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] }
YAML
DBSnapshotIdentifier: !If - UseDBSnapshot - !Ref DBSnapshotName - !Ref "AWS::NoValue"

Exemples

Création de ressources en fonction de l’environnement

Les exemples suivants provisionnent une instance EC2 et créent puis attachent un volume EBS supplémentaire uniquement si le type d’environnement est prod. Si l’environnement est test, seule l’instance EC2 est créée, sans volume supplémentaire.

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Description": "Environment type", "Default": "test", "Type": "String", "AllowedValues": [ "prod", "test" ], "ConstraintDescription": "must specify prod or test" } }, "Conditions": { "IsProduction": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] } }, "Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-1234567890abcdef0", "InstanceType": "c5.xlarge" } }, "MountPoint": { "Type": "AWS::EC2::VolumeAttachment", "Condition": "IsProduction", "Properties": { "InstanceId": { "Ref": "EC2Instance" }, "VolumeId": { "Ref": "NewVolume" }, "Device": "/dev/sdh" } }, "NewVolume": { "Type": "AWS::EC2::Volume", "Condition": "IsProduction", "Properties": { "Size": 100, "AvailabilityZone": { "Fn::GetAtt": [ "EC2Instance", "AvailabilityZone" ] } } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Description: Environment type Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test Conditions: IsProduction: !Equals - !Ref EnvType - prod Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: c5.xlarge MountPoint: Type: AWS::EC2::VolumeAttachment Condition: IsProduction Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: AWS::EC2::Volume Condition: IsProduction Properties: Size: 100 AvailabilityZone: !GetAtt - EC2Instance - AvailabilityZone

Provisionnement de ressources basé sur plusieurs conditions

Les exemples suivants créent conditionnellement un compartiment S3 lorsqu’un nom de compartiment est fourni, puis attachent une stratégie de compartiment uniquement lorsque l’environnement est défini sur prod. Si aucun nom de compartiment n’est fourni ou si l’environnement est test, aucune ressource n’est créée.

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Type": "String", "AllowedValues": [ "prod", "test" ] }, "BucketName": { "Default": "", "Type": "String" } }, "Conditions": { "IsProduction": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] }, "CreateBucket": { "Fn::Not": [ { "Fn::Equals": [ { "Ref": "BucketName" }, "" ] } ] }, "CreateBucketPolicy": { "Fn::And": [ { "Condition": "IsProduction" }, { "Condition": "CreateBucket" } ] } }, "Resources": { "Bucket": { "Type": "AWS::S3::Bucket", "Condition": "CreateBucket", "Properties": { "BucketName": { "Ref": "BucketName" } } }, "Policy": { "Type": "AWS::S3::BucketPolicy", "Condition": "CreateBucketPolicy", "Properties": { "Bucket": { "Ref": "Bucket" }, "PolicyDocument": { ... } } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Type: String AllowedValues: - prod - test BucketName: Default: '' Type: String Conditions: IsProduction: !Equals - !Ref EnvType - prod CreateBucket: !Not - !Equals - !Ref BucketName - '' CreateBucketPolicy: !And - !Condition IsProduction - !Condition CreateBucket Resources: Bucket: Type: AWS::S3::Bucket Condition: CreateBucket Properties: BucketName: !Ref BucketName Policy: Type: AWS::S3::BucketPolicy Condition: CreateBucketPolicy Properties: Bucket: !Ref Bucket PolicyDocument: ...

Dans cet exemple, la condition CreateBucketPolicy montre comment référencer d’autres conditions à l’aide de la clé Condition. La stratégie est créée uniquement lorsque les conditions IsProduction et CreateBucket s’évaluent toutes deux à « true ».

Note

Pour des exemples plus complexes d’utilisation des conditions, consultez la rubrique Attribut Condition dans le Guide de référence des modèles CloudFormation.