Dies ist der neue AWS CloudFormation Vorlagen-Referenzleitfaden. Bitte aktualisieren Sie Ihre Lesezeichen und Links. Hilfe zu den ersten CloudFormation Schritten finden Sie im AWS CloudFormation Benutzerhandbuch.
Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Bedingungsfunktionen
Sie können systeminterne Funktionen wie Fn::If
oder Fn::Equals
verwenden, um Stack-Ressourcen auf der Grundlage von bedingter Logik zu erstellen und zu konfigurieren. Diese Bedingungen werden bei der Stack-Erstellung oder bei Aktualisierungen ausgewertet. Nachdem Sie alle Ihre Bedingungen definiert haben, können Sie sie mit Ressourcen oder Ressourceneigenschaften in den Outputs
Abschnitten Resources
und einer Vorlage verknüpfen.
In fortgeschrittenen Szenarien können Sie Bedingungen mithilfe von Fn::Or
OR-Funktionen kombinieren Fn::And
oder sie verwenden, Fn::Not
um den Wert einer Bedingung zu negieren. Sie können Bedingungen auch verschachteln, um eine komplexere bedingte Logik zu erstellen.
Wenn Sie mit der Verwendung von Bedingungen in Ihren Vorlagen noch nicht vertraut sind, empfehlen wir Ihnen, zunächst das Thema Syntax der CloudFormation Vorlagenbedingungen im AWS CloudFormation Benutzerhandbuch zu lesen.
Anmerkung
Sie müssen alle Bedingungen im Conditions
Abschnitt einer Vorlage definieren, mit Ausnahme von Fn::If
Bedingungen. Sie können die Fn::If
Bedingung in den Metadata
Attribut-, UpdatePolicy
Attribut- und Eigenschaftswerten in den Outputs
Abschnitten Resources
und verwenden.
Fn::And
Gibt true
zurück, wenn alle angegebenen Bedingungen als wahr bewertet werden, oder false
, wenn eine der Bedingungen als falsch bewertet wird. Fn::And
fungiert als UND-Verknüpfung. Die Mindestanzahl von Bedingungen, die Sie verwenden können, ist 2 und die maximale Anzahl ist 10.
Deklaration
JSON
"Fn::And": [{
condition
}, {...
}]
YAML
Syntax für den vollständigen Funktionsnamen:
Fn::And: [
condition
]
Syntax für die Kurzform:
!And [
condition
]
Parameter
- condition
-
Eine Bedingung, die den Wert
true
oderfalse
ergibt.
Fn::And
Anwendungsbeispiele
Die folgende MyAndCondition
ergibt „true“, wenn der referenzierte Sicherheitsgruppenname sg-mysggroup
entspricht und wenn SomeOtherCondition
„true“ ergibt:
JSON
"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }
YAML
MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref ASecurityGroup] - !Condition SomeOtherCondition
Fn::Equals
Vergleicht, ob zwei Werte gleich sind. Gibt true
zurück, wenn die beiden Werte identisch sind, oder false
, wenn sie nicht identisch nicht.
Deklaration
JSON
"Fn::Equals" : ["
value_1
", "value_2
"]
YAML
Syntax für den vollständigen Funktionsnamen:
Fn::Equals: [
value_1
,value_2
]
Syntax für die Kurzform:
!Equals [
value_1
,value_2
]
Parameter
- value
-
Ein Zeichenkettenwert, den Sie vergleichen möchten.
Fn::Equals
Anwendungsbeispiele
Die folgende IsProduction
-Bedingung ergibt „true“, wenn der Wert für den EnvironmentType
-Parameter prod
entspricht:
JSON
"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }
YAML
IsProduction: !Equals [!Ref EnvironmentType, prod]
Fn::If
Gibt einen Wert zurück, wenn die angegebene Bedingung true
entspricht, und einen anderen Wert, wenn die angegebene Bedingung false
entspricht. CloudFormationUnterstützt derzeit die Fn::If
intrinsische Funktion in den Metadata
Attribut-, UpdatePolicy
Attribut- und Eigenschaftswerten im Resources
Abschnitt und in den Outputs
Abschnitten einer Vorlage. Sie können den Pseudoparameter AWS::NoValue
als Rückgabewert verwenden, um die entsprechende Eigenschaft zu entfernen.
Deklaration
JSON
"Fn::If": [
condition_name
,value_if_true
,value_if_false
]
YAML
Syntax für den vollständigen Funktionsnamen:
Fn::If: [
condition_name
,value_if_true
,value_if_false
]
Syntax für die Kurzform:
!If [
condition_name
,value_if_true
,value_if_false
]
Parameter
- condition_name
-
Ein Verweis auf eine Bedingung im Abschnitt „Conditions“. Verwenden Sie den Namen der Bedingung, um darauf zu verweisen.
- value_if_true
-
Ein Wert, der zurückgegeben werden soll, wenn die angegebene Bedingung true ergibt.
- value_if_false
-
Ein Wert, der zurückgegeben werden soll, wenn die angegebene Bedingung
false
ergibt.
Fn::If
Beispiele für die Verwendung
Themen
Bedingte Auswahl einer Ressource
Das folgende Beispiel verwendet eine Fn::If
Funktion in einer EC2 Amazon-Ressourcendefinition, um zu bestimmen, welche Sicherheitsgruppenressource der Instance zugeordnet werden soll. Wenn die CreateNewSecurityGroup
Bedingung als wahr ausgewertet wird, wird der referenzierte Wert von NewSecurityGroup
(einer Sicherheitsgruppe, die an anderer Stelle in der Vorlage erstellt wurde) CloudFormation verwendet, um die SecurityGroupIds
Eigenschaft anzugeben. Wenn der Wert falsch CreateNewSecurityGroup
ist, wird der referenzierte Wert von CloudFormation verwendet ExistingSecurityGroupId
(ein Parameter, der auf eine vorhandene Sicherheitsgruppe verweist).
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]
Bedingte Ausgaben
Im Output
Abschnitt einer Vorlage können Sie die Fn::If
Funktion verwenden, um Informationen bedingt auszugeben. Wenn im folgenden Codeausschnitt die CreateNewSecurityGroup
Bedingung als wahr ausgewertet wird, wird die Sicherheitsgruppen-ID der Ressource CloudFormation ausgegeben. NewSecurityGroup
Wenn die Bedingung falsch ist, wird die Sicherheitsgruppen-ID der Ressource CloudFormation ausgegeben. 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]
Bedingte Array-Werte
Im folgenden Beispiel werden verschiedene Array-Werte auf der Grundlage einer Bedingung bedingt bereitgestellt. Fn::If
Wenn die MoreThan2AZs
Bedingung als wahr ausgewertet wird, werden drei öffentliche Subnetze verwendet. Andernfalls werden nur zwei öffentliche Subnetze verwendet.
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
Bedingte Eigenschaften und Eigenschaftswerte
Im folgenden Beispiel wird der AWS::NoValue
Pseudo-Parameter in einer Fn::If
Funktion verwendet. Die Bedingung verwendet nur dann einen Snapshot für eine Amazon RDS-DB-Instance, wenn eine Snapshot-ID angegeben ist. Wenn die UseDBSnapshot
Bedingung als wahr ausgewertet wird, CloudFormation wird der DBSnapshotName
Parameterwert für die DBSnapshotIdentifier
Eigenschaft verwendet. Wenn die Bedingung „false“ ergibt, entfernt CloudFormation die DBSnapshotIdentifier
-Eigenschaft.
Es verwendet auch eine Fn::If
Funktion in der AllocatedStorage
Eigenschaft der Amazon RDS-DB-Instance. Wenn die IsProduction
Bedingung als wahr ausgewertet wird, wird die Speichergröße auf 100
gesetzt. Andernfalls ist sie auf gesetzt20
.
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"]
Richtlinien für bedingte Updates
Der folgende Codeausschnitt bietet nur dann eine Auto Scaling-Aktualisierungsrichtlinie, wenn die RollingUpdates
-Bedingung „true“ ergibt. Wenn die Bedingung als falsch ausgewertet wird, CloudFormation wird die AutoScalingRollingUpdate
Aktualisierungsrichtlinie entfernt.
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
Gibt true
für eine Bedingung zurück, die false
ergibt, oder gibt false
für eine Bedingung zurück, die mit true
ausgewertet wird. Fn::Not
dient als NOT-Operator.
Deklaration
JSON
"Fn::Not": [{
condition
}]
YAML
Syntax für den vollständigen Funktionsnamen:
Fn::Not: [
condition
]
Syntax für die Kurzform:
!Not [
condition
]
Parameter
- condition
-
Eine Bedingung wie z. B.
Fn::Equals
, dietrue
oderfalse
ergibt.
Fn::Not
Anwendungsbeispiele
Die folgende EnvCondition
-Bedingung ergibt „true“, wenn der Wert für den EnvironmentType
-Parameter nicht prod
entspricht:
JSON
"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }
YAML
MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]
Fn::Or
Gibt true
zurück, wenn alle angegebenen Bedingungen "true" ergeben, oder gibt false
zurück, wenn eine der Bedingungen mit "false" ausgewertet wird. Fn::Or
dient als OR-Operator. Die Mindestanzahl von Bedingungen, die Sie verwenden können, ist 2 und die maximale Anzahl ist 10.
Deklaration
JSON
"Fn::Or": [{
condition
}, {...
}]
YAML
Syntax für den vollständigen Funktionsnamen:
Fn::Or: [
condition, ...
]
Syntax für die Kurzform:
!Or [
condition, ...
]
Parameter
- condition
-
Eine Bedingung, die den Wert
true
oderfalse
ergibt.
Fn::Or
Anwendungsbeispiele
Die folgende MyOrCondition
ergibt „true“, wenn der referenzierte Sicherheitsgruppenname sg-mysggroup
entspricht oder wenn SomeOtherCondition
„true“ ergibt:
JSON
"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }
YAML
MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
Unterstützte Funktionen
Sie können die folgenden Funktionen in der Fn::If
-Bedingung verwenden:
-
Fn::Base64
-
Fn::FindInMap
-
Fn::GetAtt
-
Fn::GetAZs
-
Fn::If
-
Fn::Join
-
Fn::Select
-
Fn::Sub
-
Ref
Sie können die folgenden Funktionen in allen anderen Bedingungsfunktionen wie Fn::Equals
und Fn::Or
verwenden:
-
Fn::FindInMap
-
Ref
-
Andere Bedingungsfunktionen
Beispielvorlage
Bedingtes Erstellen von Ressourcen für einen Produktions-, Entwicklungs- oder Test-Stack
In einigen Fällen möchten Sie vielleicht Stacks erstellen, die ähnlich sind, aber kleinere Änderungen enthalten. Sie haben beispielsweise vielleicht eine Vorlage, die Sie für Produktionsanwendungen verwenden. Sie möchten denselben Produktions-Stack erstellen, damit Sie ihn für Entwicklung und Tests verwenden können. Für Entwicklung und Tests benötigen Sie aber wahrscheinlich nicht die gesamte zusätzliche Kapazität, die in einem Produktions-Stack enthalten ist. Stattdessen können Sie einen Umgebungstyp-Eingabeparameter verwenden, um bedingt spezifische Stack-Ressourcen für Produktion, Entwicklung oder Tests zu erstellen, wie im folgenden Beispiel dargestellt:
Sie können für den prod
-Parameter dev
, test
oder EnvType
angeben. Für jeden Umgebungstyp gibt die Vorlage gibt einen anderen Instance-Typ an. Die Instance-Typen können von einem großen, für Datenverarbeitung optimierten Instance-Typ bis zu einem kleinen Instance-Typ für den allgemeinen Einsatz reichen. Um den Instanztyp bedingt zu spezifizieren, definiert die Vorlage zwei Bedingungen im Conditions
Abschnitt der Vorlage:CreateProdResources
, die als wahr ausgewertet wird, wenn der EnvType
Parameterwert gleich istCreateDevResources
, prod
und die als wahr ausgewertet wird, wenn der Parameterwert gleich ist. dev
Die Vorlage verschachtelt in der InstanceType
-Eigenschaft zwei intrinsische Fn::If
-Funktionen, um zu ermitteln, welcher Instance-Typ verwendet wende soll. Wenn die CreateProdResources
-Bedingung erfüllt ist, ist der Instance-Typ c5.xlarge
. Wenn die Bedingung nicht erfüllt ist, wird die CreateDevResources
-Bedingung ausgewertet. Wenn die CreateDevResources
-Bedingung erfüllt ist, ist der Instance-Typ t3.medium
oder ansonsten ist der Instance-Typ t3.small
.
Zusätzlich zum Instance-Typ erstellt die Produktionsumgebung ein EC2 Amazon-Volume und fügt es der Instance hinzu. Die Ressourcen MountPoint
und NewVolume
werden mit der CreateProdResources
-Bedingung verknüpft, sodass die Ressourcen nur erstellt werden, wenn die Bedingung „true“ ergibt.
Beispiel 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" ]} } } } }
Beispiel 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
Anmerkung
Ausführlichere Beispiele für die Verwendung von Bedingungen zur Erstellung von Ressourcen finden Sie im Condition Attribut Thema.