Bedingungen - AWS CloudFormation

Bedingungen

Der optionale Abschnitt Conditions enthält Anweisungen, die die Bedingungen definieren, unter denen Entitäten erstellt oder konfiguriert werden. Beispielsweise können Sie eine Bedingung erstellen und sie dann einer Ressource oder Ausgabe zuordnen, sodass AWS CloudFormation die Ressource oder Ausgabe nur dann erstellt, wenn die Bedingung erfüllt ist. Ebenso können Sie die Bedingung mit einer Eigenschaft verknüpfen, sodass AWS CloudFormation die Eigenschaft nur dann auf einen bestimmten Wert setzt, wenn die Bedingung wahr ist. Wenn die Bedingung falsch ist, setzt AWS CloudFormation die Eigenschaft auf einen anderen Wert, den Sie angeben.

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. Beispielsweise möchten Sie in der Produktionsumgebung vielleicht Amazon EC2-Instances mit einem bestimmten Funktionsumfang bereitstellen, in der Testumgebung jedoch nur Instances mit begrenztem Funktionsumfang, um Geld zu sparen. Bei Bedingungen können Sie definieren, welche Ressourcen erstellt werden und wie sie für jeden Umgebungstyp konfiguriert werden.

Bedingungen werden anhand von vordefinierten Pseudoparametern oder Eingabeparameterwerten ausgewertet, die Sie beim Anlegen oder Aktualisieren eines Stacks angeben. In jeder Bedingung können Sie eine andere Bedingung, einen Parameterwert oder eine Zuweisung referenzieren. Sobald Sie alle gewünschten Bedingungen definiert haben, können Sie sie mit Ressourcen und Ressourceneigenschaften in den Abschnitten Resources und Outputs der Vorlage verknüpfen.

Sobald Sie einen Stack erstellen oder aktualisieren möchten, prüft AWS CloudFormation vor der Ressourcenerstellung zunächst sämtliche Bedingungen in Ihrer Vorlage. Ressourcen, die mit einer als wahr identifizierten Bedingung verknüpft sind, werden erstellt. Ressourcen, die mit einer falschen Bedingung verknüpft sind, werden ignoriert. AWS CloudFormation bewertet diese Bedingungen bei jedem Stack-Update neu, bevor Ressourcen aktualisiert werden. Ressourcen, die nach wie vor mit einer als wahr identifizierten Bedingung verknüpft sind, werden aktualisiert. Ressourcen, die jetzt mit einer als falsch identifizierten Bedingung verknüpft sind, werden gelöscht. Weitere Informationen über die Funktion

Wichtig

Bedingungen können während einer Stack-Aktualisierung nicht allein aktualisiert werden. Sie können Bedingungen nur aktualisieren, wenn Sie Änderungen einschließen, die Ressourcen hinzufügen, ändern oder löschen.

Übersicht über die Verwendung von Bedingungen

Je nachdem, welche Entität Sie bedingt anlegen oder konfigurieren möchten, müssen Sie in den folgenden Vorlagenabschnitten Anweisungen einfügen:

Parameters Abschnitt

Definieren Sie die Eingaben, die Ihre Bedingungen auswerten sollen. Die Bedingungen werden basierend auf den Werten dieser Eingangsparameter als wahr oder falsch bewertet. Wenn Sie möchten, dass Ihre Bedingungen Pseudoparameter auswerten, müssen Sie die Pseudoparameter in diesem Abschnitt nicht definieren; Pseudoparameter sind durch AWS CloudFormation vordefiniert.

Conditions Abschnitt

Hier definieren Sie die Bedingungen mithilfe intrinsischer Bedingungsfunktionen. Diese Bedingungen legen fest, wann AWS CloudFormation die mit ihnen verknüpften Ressourcen erstellt.

Abschnitt Resources und Abschnitt Outputs

Ordnen Sie Bedingungen den Ressourcen oder Ausgaben zu, die Sie bedingt anlegen möchten. AWS CloudFormation erstellt Entitäten, die mit einer wahren Bedingung verbunden sind und ignoriert Entitäten, die mit einer falschen Bedingung verbunden sind. Sie verknüpfen Bedingungen über den Schlüssel Condition und ihre logische ID mit einer Ressource oder einer Ausgabe. Zur bedingungsbasierten Festlegung einer Eigenschaft verwenden Sie die Funktion Fn::If. Weitere Informationen finden Sie unter Bedingungsfunktionen.

Syntax

Der Abschnitt Conditions besteht aus dem Schlüsselnamen Conditions. Jede Bedingungsdeklaration enthält eine logische ID und intrinsische Funktionen, die bei der Erstellung oder Aktualisierung eines Stacks überprüft werden. Die folgende Pseudovorlage veranschaulicht den Abschnitt Conditions:

JSON

"Conditions" : { "Logical ID" : {Intrinsic function} }

YAML

Conditions: Logical ID: Intrinsic function

Intrinsische Bedingungsfunktionen

Sie können die folgenden intrinsischen Funktionen verwenden, um Bedingungen zu definieren:

  • Fn::And

  • Fn::Equals

  • Fn::If

  • Fn::Not

  • Fn::Or

Die Syntax der einzelnen Funktionen sowie weitere Informationen finden Sie unter Bedingungsfunktionen.

Anmerkung

Fn::If wird nur im Metadatenattribut, Aktualisierungsrichtlinienattribut und Eigenschaftswerte im Bereich Resources und den Bereichen Outputs einer Vorlage unterstützt.

Beispiele

Die folgende Beispielvorlage enthält einen Eingabeparameter EnvType. Wenn Sie für diesen Parameter prod angeben, wird ein Stack für die Produktion erstellt, wenn Sie test angeben ein Stack für Tests. In einer Produktionsumgebung erstellt AWS CloudFormation eine Amazon EC2-Instance und fügt dieser Instance ein Volume an. In einer Testumgebung erstellt AWS CloudFormation nur die Amazon EC2-Instance.

Die Bedingung CreateProdResources wird als true interpretiert, wenn der Parameter EnvType auf prod gesetzt ist. In derselben Vorlage sind die Ressourcen NewVolume und MountPoint mit der Bedingung CreateProdResources verknüpft. Daher werden diese Ressourcen nur erstellt, wenn der Parameter EnvType auf prod gesetzt wurde.

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867", "TestAz" : "us-east-1a" }, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235", "TestAz" : "us-west-1a" }, "us-west-2" : { "AMI" : "ami-a0cfeed8", "TestAz" : "us-west-2a" }, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98", "TestAz" : "eu-west-1a" }, "sa-east-1" : { "AMI" : "ami-07b14488da8ea02a0", "TestAz" : "sa-east-1a" }, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10", "TestAz" : "ap-southeast-1a" }, "ap-southeast-2" : { "AMI" : "ami-09b42976632b27e9b", "TestAz" : "ap-southeast-2a" }, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85", "TestAz" : "ap-northeast-1a" } } }, "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "test"], "ConstraintDescription" : "must specify prod or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]} } }, "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" ]} } } }, "Outputs" : { "VolumeId" : { "Value" : { "Ref" : "NewVolume" }, "Condition" : "CreateProdResources" } } }

YAML

AWSTemplateFormatVersion: "2010-09-09" Mappings: RegionMap: us-east-1: AMI: "ami-0ff8a91507f77f867" TestAz: "us-east-1a" us-west-1: AMI: "ami-0bdb828fd58c52235" TestAz: "us-west-1a" us-west-2: AMI: "ami-a0cfeed8" TestAz: "us-west-2a" eu-west-1: AMI: "ami-047bb4163c506cd98" TestAz: "eu-west-1a" sa-east-1: AMI: "ami-07b14488da8ea02a0" TestAz: "sa-east-1a" ap-southeast-1: AMI: "ami-08569b978cc4dfa10" TestAz: "ap-southeast-1a" ap-southeast-2: AMI: "ami-09b42976632b27e9b" TestAz: "ap-southeast-2a" ap-northeast-1: AMI: "ami-06cd52961ce9f0d85" TestAz: "ap-northeast-1a" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test. Conditions: CreateProdResources: !Equals [ !Ref EnvType, prod ] Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] 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 Outputs: VolumeId: Condition: CreateProdResources Value: !Ref NewVolume