Funzioni di condizione - AWS CloudFormation

Questa è la nuova guida AWS CloudFormation di riferimento per i modelli. Aggiorna i segnalibri e i link. Per informazioni su come iniziare CloudFormation, consulta la Guida per l'AWS CloudFormation utente.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Funzioni di condizione

È possibile utilizzare funzioni intrinseche, come Fn::If orFn::Equals, per creare e configurare risorse dello stack in base alla logica condizionale. Queste condizioni vengono valutate durante la creazione o l'aggiornamento dello stack. Dopo aver definito tutte le condizioni, è possibile associarle alle risorse o alle proprietà delle risorse nelle Outputs sezioni Resources e di un modello.

Per scenari avanzati, è possibile combinare condizioni utilizzando Fn::Or le funzioni Fn::And or oppure utilizzare Fn::Not per negare il valore di una condizione. Puoi anche annidare le condizioni per creare una logica condizionale più complessa.

Se non conosci l'utilizzo delle condizioni nei tuoi modelli, ti consigliamo di consultare prima l'argomento sulla sintassi delle condizioni del CloudFormation modello nella Guida per l'AWS CloudFormation utente.

Nota

È necessario definire tutte le condizioni nella Conditions sezione di un modello, ad eccezione Fn::If delle condizioni. È possibile utilizzare la Fn::If condizione nei valori degli Metadata UpdatePolicy attributi, degli attributi e delle proprietà nelle Outputs sezioni Resources and.

Fn::And

Restituisce true se una delle condizioni specificate viene valutata true; restituisce false se una qualsiasi delle condizioni corrisponde a false. Fn::And agisce come operatore AND. Il numero minimo di condizioni che puoi includere è 2, il numero massimo è 10.

Dichiarazione

JSON

"Fn::And": [{condition}, {...}]

YAML

Sintassi per il nome completo della funzione:

Fn::And: [condition]

Sintassi per la forma breve:

!And [condition]

Parametri

condition

Una condizione che corrisponde a true o false.

Fn::Andesempi di utilizzo

La seguente funzione MyAndCondition viene valutata true se il nome del gruppo di sicurezza a cui si fa riferimento è uguale a sg-mysggroup e se SomeOtherCondition corrisponde a 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

Confronta due valori per capire se sono uguali. Restituisce true se i due valori sono uguali o false se non lo sono.

Dichiarazione

JSON

"Fn::Equals" : ["value_1", "value_2"]

YAML

Sintassi per il nome completo della funzione:

Fn::Equals: [value_1, value_2]

Sintassi per la forma breve:

!Equals [value_1, value_2]

Parametri

value

Un valore di stringa da confrontare.

Fn::Equalsesempi di utilizzo

La seguente condizione IsProduction viene valutata true se il valore per il parametro EnvironmentType è uguale a prod:

JSON

"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }

YAML

IsProduction: !Equals [!Ref EnvironmentType, prod]

Fn::If

Restituisce un valore se la condizione specificata viene valutata true e un altro valore se viene valutata false. Attualmente, CloudFormation supporta la funzione Fn::If intrinseca nei valori degli Metadata attributi, UpdatePolicy degli attributi e delle proprietà nella Resources sezione e nelle Outputs sezioni di un modello. Puoi utilizzare lo pseudoparametro AWS::NoValue come valore restituito per rimuovere la proprietà corrispondente.

Dichiarazione

YAML

Sintassi per il nome completo della funzione:

Fn::If: [condition_name, value_if_true, value_if_false]

Sintassi per la forma breve:

!If [condition_name, value_if_true, value_if_false]

Parametri

condition_name

Un riferimento a una condizione nella sezione Conditions (Condizioni). Utilizza il nome della condizione per farvi riferimento.

value_if_true

Un valore da restituire se la condizione specificata viene valutata true.

value_if_false

Un valore da restituire se la condizione specificata viene valutata false.

Fn::Ifesempi di utilizzo

Scelta condizionale di una risorsa

L'esempio seguente utilizza una Fn::If funzione in una definizione di EC2 risorsa Amazon per determinare quale risorsa del gruppo di sicurezza associare all'istanza. Se la CreateNewSecurityGroup condizione risulta vera, CloudFormation utilizza il valore di riferimento di NewSecurityGroup (un gruppo di sicurezza creato altrove nel modello) per specificare la SecurityGroupIds proprietà. Se CreateNewSecurityGroup è false, CloudFormation utilizza il valore di riferimento di ExistingSecurityGroupId (un parametro che fa riferimento a un gruppo di sicurezza esistente).

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]

Uscite condizionali

Nella Output sezione di un modello, è possibile utilizzare la Fn::If funzione per generare informazioni in modo condizionale. Nel frammento seguente, se la CreateNewSecurityGroup condizione risulta vera, restituisce l'ID del gruppo CloudFormation di sicurezza della risorsa. NewSecurityGroup Se la condizione è falsa, CloudFormation restituisce l'ID del gruppo di sicurezza della risorsa. ExistingSecurityGroup

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]

Valori dell'array condizionale

L'esempio seguente utilizza Fn::If per fornire in modo condizionale diversi valori di matrice in base a una condizione. Se la MoreThan2AZs condizione risulta vera, utilizza tre sottoreti pubbliche. Altrimenti, utilizza solo due sottoreti pubbliche.

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

Proprietà condizionali e valori delle proprietà

L'esempio seguente utilizza lo AWS::NoValue pseudo parametro in una funzione. Fn::If La condizione utilizza una snapshot per un'istanza database Amazon RDS solo se viene fornito un ID snapshot. Se la UseDBSnapshot condizione restituisce true, CloudFormation utilizza il valore del DBSnapshotName parametro per la proprietà. DBSnapshotIdentifier Se la condizione restituisce false, CloudFormation rimuove la proprietà DBSnapshotIdentifier.

Utilizza inoltre una Fn::If funzione nella AllocatedStorage proprietà dell'istanza database di Amazon RDS. Se la IsProduction condizione risulta vera, la dimensione dello storage viene impostata su. 100 Altrimenti, è impostato su. 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"]

Politiche di aggiornamento condizionale

Il seguente frammento fornisce una policy di aggiornamento di dimensionamento automatico solo se la condizione RollingUpdates viene valutata true. Se la condizione risulta falsa, CloudFormation rimuove la politica di AutoScalingRollingUpdate aggiornamento.

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

Restituisce true per una condizione che viene valutata false o restituisce false per una condizione che viene valutata true. Fn::Not agisce come operatore NOT.

Dichiarazione

JSON

"Fn::Not": [{condition}]

YAML

Sintassi per il nome completo della funzione:

Fn::Not: [condition]

Sintassi per la forma breve:

!Not [condition]

Parametri

condition

Una condizione come Fn::Equals che viene valutata true o false.

Fn::Notesempi di utilizzo

La seguente condizione EnvCondition viene valutata true se il valore per il parametro EnvironmentType è uguale a prod:

JSON

"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }

YAML

MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]

Fn::Or

Restituisce true se una qualsiasi delle condizioni specificate viene valutata true; restituisce false se tutte le condizioni vengono valutate false. Fn::Or agisce come operatore OR. Il numero minimo di condizioni che puoi includere è 2, il numero massimo è 10.

Dichiarazione

JSON

"Fn::Or": [{condition}, {...}]

YAML

Sintassi per il nome completo della funzione:

Fn::Or: [condition, ...]

Sintassi per la forma breve:

!Or [condition, ...]

Parametri

condition

Una condizione che corrisponde a true o false.

Fn::Oresempi di utilizzo

La seguente funzione MyOrCondition viene valutata true se il nome del gruppo di sicurezza a cui si fa riferimento è uguale a sg-mysggroup o se SomeOtherCondition viene valutata true:

JSON

"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }

YAML

MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]

Funzioni supportate

È possibile utilizzare le funzioni seguenti nella condizione Fn::If:

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::GetAZs

  • Fn::If

  • Fn::Join

  • Fn::Select

  • Fn::Sub

  • Ref

È possibile utilizzare le seguenti funzioni in tutte le altre funzioni di condizione, ad esempio Fn::Equals e Fn::Or:

  • Fn::FindInMap

  • Ref

  • Altre funzioni di condizione

Modello di esempio

Crea risorse in modo condizionale per uno stack di produzione, di sviluppo o di test

In alcuni casi si ha la necessità di creare stack simili, ma con piccoli aggiustamenti. Ad esempio, potresti avere modello utilizzato per la applicazioni di produzione e voler creare lo stesso stack di produzione, in modo da poterlo usare a fini di sviluppo o test. Tuttavia, per questi scopi, potresti non avere bisogno di tutte le capacità aggiuntive inclusa in uno stack a livello di produzione. Invece, è possibile utilizzare un parametro di input di tipo ambiente per creare in modo condizionale risorse di stack specifiche per la produzione, lo sviluppo o il test, come mostrato nel seguente esempio:

Puoi specificare prod, dev o test per il parametro EnvType. Per ogni tipo di ambiente, il modello specifica un diverso tipo di istanza, che può variare da un tipo di istanza grande e ottimizzata per l'elaborazione a un tipo di istanza più ridotto, adatto a un uso generale. Per specificare in modo condizionale il tipo di istanza, il modello definisce due condizioni nella Conditions sezione del modello:CreateProdResources, che restituisce true se il valore del EnvType parametro è uguale a prod eCreateDevResources, che restituisce true se il valore del parametro è uguale a. dev

Nella proprietà InstanceType, il modello nidifica due funzioni intrinseche Fn::If per determinare il tipo di istanza da utilizzare. Se la condizione CreateProdResources è true, il tipo di istanza è c5.xlarge. Se la condizione è false, viene valutata la condizione CreateDevResources. Se la condizione CreateDevResources è true, il tipo di istanza è t3.medium, altrimenti è t3.small.

Oltre al tipo di istanza, l'ambiente di produzione crea e collega un EC2 volume Amazon all'istanza. Le risorse MountPoint e NewVolume sono associate alla condizione CreateProdResources: in questo modo, le risorse vengono create solo se la condizione viene valutata true.

Esempio 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" ]} } } } }
Esempio 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
Nota

Per esempi più complessi di utilizzo delle condizioni per creare risorse, consulta l'Attributo Conditionargomento.