Bedingungsfunktionen - AWS CloudFormation

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 oder false ergibt.

Fn::AndAnwendungsbeispiele

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::EqualsAnwendungsbeispiele

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

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::IfBeispiele für die Verwendung

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, die true oder false ergibt.

Fn::NotAnwendungsbeispiele

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 oder false ergibt.

Fn::OrAnwendungsbeispiele

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.