Bedingungsfunktionen - AWS CloudFormation

Bedingungsfunktionen

Sie können intrinsische Funktionen wie z. B. Fn::If, Fn::Equalsund Fn::Not verwenden, um Stack-Ressourcen bedingt zu erstellen. Diese Bedingungen werden basierend auf Eingabeparametern ausgewertet, die Sie deklarieren, wenn Sie einen Stack erstellen oder aktualisieren. Nachdem Sie alle Ihre Bedingungen definiert haben, können Sie sie mit Ressourcen oder Ressourceneigenschaften in den Abschnitten für Ressourcen und Outputs einer Vorlage verknüpfen.

Sie definieren alle Bedingungen, außer Fn::If-Bedingungen, im Abschnitt „Conditions“ einer Vorlage. Sie können die Fn::If-Bedingung im Metadatenattribut, Aktualisierungsrichtlinienattribut und Eigenschaftswerte im Bereich „Resources“ und den Bereichen „Outputs“ einer Vorlage verwenden.

Sie verwenden möglicherweise Bedingungen, wenn Sie eine Vorlage erneut verwenden möchten, die Ressourcen in verschiedenen Kontexten erstellen können, z. B. in einer Testumgebung im Vergleich zu einer Produktionsumgebung. In Ihrer Vorlage können Sie einen EnvironmentType-Eingabeparameter hinzufügen, der prod oder test als Eingaben akzeptiert. Bei der Produktionsumgebung können Sie Amazon EC2-Instances mit bestimmten Funktionen einschließen; bei der Testumgebung sollten Sie jedoch weniger Funktionen verwenden, um Kosten zu sparen. Bei Bedingungen können Sie definieren, welche Ressourcen erstellt werden und wie sie für jeden Umgebungstyp konfiguriert werden.

Weitere Informationen zum Abschnitt zu Bedingungen finden Sie unter Bedingungen.

Anmerkung

Sie können auf andere Bedingungen und Werte aus den Abschnitten für Parameter und Zuordnungen einer Vorlage zur verweisen. Sie können beispielsweise auf einen Wert aus einem Eingabeparameter verweisen, aber Sie können nicht auf die logische ID einer Ressource in einer Bedingung verweisen.

Zuordnen einer Bedingung

Um Ressourcen, Ressourceneigenschaften oder Ausgaben bedingt zu erstellen, müssen Sie diesen eine Bedingung zuordnen. Fügen Sie den Schlüssel Condition: und die logische ID der Bedingung als Attribut hinzu, um eine Bedingung zuzuordnen, wie im folgenden Ausschnitt gezeigt. AWS CloudFormation erstellt die Ressource NewVolume nur, wenn die Bedingung CreateProdResources als wahr bewertet wird.

JSON

"NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} }

YAML

NewVolume: Type: "AWS::EC2::Volume" Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone

Fn::If

Für die Fn::If-Funktion müssen Sie nur den Namen der Bedingung angeben. Der folgende Codeausschnitt zeigt, wie Sie Fn::If verwenden, um eine Ressourceneigenschaft bedingt anzugeben. Wenn die CreateLargeSize-Bedingung erfüllt ist, legt CloudFormation die Volume-Größe auf 100 fest. Wenn die Bedingung nicht erfüllt ist, legt CloudFormation die Volume-Größe auf 10 fest.

JSON

"NewVolume" : { "Type" : "AWS::EC2::Volume", "Properties" : { "Size" : { "Fn::If" : [ "CreateLargeSize", "100", "10" ]}, "AvailabilityZone" : { "Fn::GetAtt" : [ "Ec2Instance", "AvailabilityZone" ]} }, "DeletionPolicy" : "Snapshot" }

YAML

NewVolume: Type: "AWS::EC2::Volume" Properties: Size: !If [CreateLargeSize, 100, 10] AvailabilityZone: !GetAtt: Ec2Instance.AvailabilityZone DeletionPolicy: Snapshot

Verschachtelte Bedingungen

Sie können auch Bedingungen in anderen Bedingungen verwenden. Der folgende Codeausschnitt stammt aus dem Conditions-Abschnitt einer Vorlage. Die MyAndCondition-Bedingung enthält die SomeOtherCondition-Bedingung:

JSON
"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }
YAML
MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref "ASecurityGroup"] - !Condition SomeOtherCondition

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.

Beispiel

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 Wert beliebiger Art, den Sie vergleichen möchten.

Beispiel

Die folgende UseProdCondition-Bedingung ergibt „true“, wenn der Wert für den EnvironmentType-Parameter prod entspricht:

JSON

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

YAML

UseProdCondition: !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. Derzeit unterstützt CloudFormation die intrinsische Funktion Fn::If im Metadatenattribut, Aktualisierungsrichtlinienattribut und Eigenschaftswerte im Bereich „Resources“ und den Bereichen „Outputs“ 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.

Beispiele

Weitere Beispiele finden Sie unter Beispielvorlagen.

Beispiel 1

Der folgende Codeausschnitt verwendet eine Fn::If-Funktion in der SecurityGroups-Eigenschaft für eine Amazon EC2-Ressource. Wenn die CreateNewSecurityGroup-Bedingung „wahr“ ergibt, verwendet CloudFormation den referenzierten Wert von NewSecurityGroup, um die SecurityGroups-Eigenschaft anzugeben. Andernfalls verwendet CloudFormation den referenzierten Wert von ExistingSecurityGroup.

JSON
"SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }]
YAML
SecurityGroups: - !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

Beispiel 2

Sie können im Abschnitt „Output“ einer Vorlage die Fn::If-Funktion verwenden, um Informationen bedingt auszugeben. Wenn die CreateNewSecurityGroup-Bedingung „true“ ergibt, gibt CloudFormation die Sicherheitsgruppen-ID der NewSecurityGroup-Ressource aus. Wenn die Bedingung "false" ergibt, gibt CloudFormation die Sicherheitsgruppen-ID der ExistingSecurityGroup-Ressource aus.

JSON
"Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

Beispiel 3

Der folgende Codeausschnitt verwendet den AWS::NoValue-Pseudoparameter in einer Fn::If-Funktion. Die Bedingung verwendet nur dann einen Snapshot für eine Amazon RDS-DB-Instance, wenn eine Snapshot-ID angegeben ist. Wenn die ‌UseDBSnapshot-Bedingung "true" ergibt, verwendet CloudFormation den Parameterwert DBSnapshotName für die DBSnapshotIdentifier-Eigenschaft. Wenn die Bedingung „false“ ergibt, entfernt CloudFormation die DBSnapshotIdentifier-Eigenschaft.

JSON
"MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDB: Type: "AWS::RDS::DBInstance" Properties: AllocatedStorage: 5 DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]

Beispiel 4

Der folgende Codeausschnitt bietet nur dann eine Auto Scaling-Aktualisierungsrichtlinie, wenn die RollingUpdates- Bedingung „true“ ergibt. Wenn die Bedingung „false“ ergibt, entfernt CloudFormation die AutoScalingRollingUpdate-Aktualisierungsrichtlinie.

JSON
"UpdatePolicy": { "AutoScalingRollingUpdate": { "Fn::If": [ "RollingUpdates", { "MaxBatchSize": "2", "MinInstancesInService": "2", "PauseTime": "PT0M30S" }, { "Ref" : "AWS::NoValue" } ] } }
YAML
UpdatePolicy: AutoScalingRollingUpdate: !If - RollingUpdates - 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.

Beispiel

Die folgende EnvCondition-Bedingung ergibt „true“, wenn der Wert für den EnvironmentType-Parameter 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.

Beispiel

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