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
trueofalse.
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
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::Ifesempi 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::Equalsche viene valutatatrueofalse.
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
trueofalse.
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.