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
ofalse
.
Fn::And
esempi 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::Equals
esempi 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
JSON
"Fn::If": [
condition_name
,value_if_true
,value_if_false
]
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::If
esempi di utilizzo
Argomenti
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 valutatatrue
ofalse
.
Fn::Not
esempi 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
ofalse
.
Fn::Or
esempi 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.