Beispielvorlagen - AWS CloudFormation

Beispielvorlagen

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:

Beispiel JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867"}, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235"}, "us-west-2" : { "AMI" : "ami-a0cfeed8"}, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98"}, "sa-east-1" : { "AMI" : "ami-07b14488da8ea02a0"}, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10"}, "ap-southeast-2" : { "AMI" : "ami-09b42976632b27e9b"}, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85"} } }, "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" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}, "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c1.xlarge", {"Fn::If" : [ "CreateDevResources", "m1.large", "m1.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" Mappings: RegionMap: us-east-1: AMI: "ami-0ff8a91507f77f867" us-west-1: AMI: "ami-0bdb828fd58c52235" us-west-2: AMI: "ami-a0cfeed8" eu-west-1: AMI: "ami-047bb4163c506cd98" sa-east-1: AMI: "ami-07b14488da8ea02a0" ap-southeast-1: AMI: "ami-08569b978cc4dfa10" ap-southeast-2: AMI: "ami-09b42976632b27e9b" ap-northeast-1: AMI: "ami-06cd52961ce9f0d85" 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: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] InstanceType: !If [CreateProdResources, c1.xlarge, !If [CreateDevResources, m1.large, m1.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

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 Instance-Typ bedingt anzugeben, definiert die Vorlage im Abschnitt „Conditions“ der Vorlage zwei Bedingungen: CreateProdResources, die „true“ ergibt, wenn der EnvType-Parameterwert prod entspricht, und CreateDevResources, die „true“ ergibt, wenn der Parameterwert dev entspricht.

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 c1.xlarge. Wenn die Bedingung nicht erfüllt ist, wird die CreateDevResources-Bedingung ausgewertet. Wenn die CreateDevResources-Bedingung erfüllt ist, ist der Instance-Typ m1.large oder ansonsten ist der Instance-Typ m1.small.

Zusätzlich zum Instance-Typ erstellt die Produktionsumgebung ein Amazon EC2-Volume und hängt es an die Instance an. Die Ressourcen MountPoint und NewVolume werden mit der CreateProdResources-Bedingung verknüpft, sodass die Ressourcen nur erstellt werden, wenn die Bedingung „true“ ergibt.

Bedingtes Zuweisen einer Ressourceneigenschaft

In diesem Beispiel erstellen Sie eine Amazon RDS-DB-Instance aus einem Snapshot. Wenn Sie den DBSnapshotName-Parameter angeben, verwendet CloudFormation beim Erstellen der DB-Instance den Parameterwert als Snapshot-Namen. Wenn Sie den Standardwert (leere Zeichenfolge) beibehalten, entfernt CloudFormation die Eigenschaft DBSnapshotIdentifier und erstellt eine neue DB-Instance.

Das Beispiel definiert die Parameter DBUser und DBPassword mit auf true gesetzter Eigenschaft NoEcho. Wenn Sie das NoEcho-Attribut auf true festlegen, gibt CloudFormation für alle Aufrufe, die den Stack oder die Stapelereignisse beschreiben, den als Sternchen (*****) maskierten Parameterwert zurück, mit Ausnahme der Informationen, die an den folgenden Speicherorten gespeichert sind.

Wichtig

Durch die Verwendung des NoEcho-Attributs werden keine Informationen maskiert, die im Folgenden gespeichert sind:

  • Der Metadata-Vorlagenabschnitt. CloudFormation transformiert, ändert und überarbeitet keine Informationen, die Sie im Metadata-Abschnitt einfügen. Weitere Informationen finden Sie unter Metadaten.

  • Der Outputs-Vorlagenabschnitt. Weitere Informationen finden Sie unter Ausgaben:

  • Das Metadata-Attribut einer Ressourcendefinition. Weitere Informationen finden Sie unter Metadaten-Attribut.

Es wird dringend empfohlen, diese Mechanismen nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Geheimnisse einzugeben.

Wichtig

Statt vertrauliche Informationen direkt in Ihre CloudFormation-Vorlagen einzubetten, sollten Sie mittels dynamischer Parameter in der Stack-Vorlage auf vertrauliche Informationen verweisen. Diese sollten außerhalb von CloudFormation gespeichert und verwaltet werden, z. B. im AWS Systems Manager Parameter Store oder in AWS Secrets Manager.

Weitere Informationen finden Sie in den bewährten Methoden zu Keine Anmeldeinformationen in Ihre Vorlagen einbetten.

Beispiel JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters": { "DBUser": { "NoEcho": "true", "Description" : "The database admin account username", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "DBPassword": { "NoEcho": "true", "Description" : "The database admin account password", "Type": "String", "MinLength": "1", "MaxLength": "41", "AllowedPattern" : "[a-zA-Z0-9]*", "ConstraintDescription" : "must contain only alphanumeric characters." }, "DBSnapshotName": { "Description": "The name of a DB snapshot (optional)", "Default": "", "Type": "String" } }, "Conditions": { "UseDBSnapshot": {"Fn::Not": [{"Fn::Equals" : [{"Ref" : "DBSnapshotName"}, ""]}]} }, "Resources" : { "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"} ] } } }, "MyRDSParamGroup" : { "Type": "AWS::RDS::DBParameterGroup", "Properties" : { "Family" : "MySQL5.5", "Description" : "CloudFormation Sample Database Parameter Group", "Parameters" : { "autocommit" : "1" , "general_log" : "1", "old_passwords" : "0" } } } } }

Beispiel YAML

AWSTemplateFormatVersion: "2010-09-09" Parameters: DBUser: NoEcho: true Description: The database admin account username Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" ConstraintDescription: must begin with a letter and contain only alphanumeric characters. DBPassword: NoEcho: true Description: The database admin account password Type: String MinLength: 1 MaxLength: 41 AllowedPattern: "[a-zA-Z0-9]*" ConstraintDescription: must contain only alphanumeric characters. DBSnapshotName: Description: The name of a DB snapshot (optional) Default: "" Type: String Conditions: UseDBSnapshot: !Not [!Equals [!Ref DBSnapshotName, ""]] Resources: 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"] MyRDSParamGroup: Type: "AWS::RDS::DBParameterGroup" Properties: Family: MySQL5.5 Description: CloudFormation Sample Database Parameter Group Parameters: autocommit: 1 general_log: 1 old_passwords: 0

Die UseDBSnapshot-Bedingung ergibt nur dann „true“, wenn der DBSnapshotName keine leere Zeichenfolge 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. Der AWS::NoValue-Pseudoparameter entfernt die entsprechende Ressourceneigenschaft, wenn diese Eigenschaft als Rückgabewert verwendet wird.

Bedingtes Verwenden einer vorhandenen Ressource

In diesem Beispiel können Sie eine Amazon EC2-Sicherheitsgruppe verwenden, die bereits erstellt wurde, oder Sie können eine neue Sicherheitsgruppe erstellen, die in der Vorlage angegeben ist. Für den ExistingSecurityGroup-Parameter können Sie den default-Sicherheitsgruppennamen oder NONE angeben. Wenn Sie default angeben, verwendet CloudFormation eine Sicherheitsgruppe, die bereits erstellt wurde und den Namen default besitzt. Wenn Sie NONE angeben, erstellt CloudFormation die Sicherheitsgruppe, die in der Vorlage definiert ist.

Beispiel JSON

{ "Parameters" : { "ExistingSecurityGroup" : { "Description" : "An existing security group ID (optional).", "Default" : "NONE", "Type" : "String", "AllowedValues" : ["default", "NONE"] } }, "Conditions" : { "CreateNewSecurityGroup" : {"Fn::Equals" : [{"Ref" : "ExistingSecurityGroup"}, "NONE"] } }, "Resources" : { "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-0ff8a91507f77f867", "SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }] } }, "NewSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Condition" : "CreateNewSecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0" } ] } } }, "Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] } } } }

Beispiel YAML

Parameters: ExistingSecurityGroup: Description: An existing security group ID (optional). Default: NONE Type: String AllowedValues: - default - NONE Conditions: CreateNewSecurityGroup: !Equals [!Ref ExistingSecurityGroup, NONE] Resources: MyInstance: Type: "AWS::EC2::Instance" Properties: ImageId: "ami-0ff8a91507f77f867" SecurityGroups: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup] NewSecurityGroup: Type: "AWS::EC2::SecurityGroup" Condition: CreateNewSecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

Um zu bestimmen, ob die NewSecurityGroup-Ressource erstellt werden soll, wird die Ressource mit der Bedingung CreateNewSecurityGroup verknüpft. Die Ressource wird nur erstellt, wenn die Bedingung „true“ ist (wenn der ExistingSecurityGroup-Parameter NONE entspricht).

In der SecurityGroups-Eigenschaft verwendet die Vorlage die intrinsische Funktion Fn::If, um zu ermitteln, welche Sicherheitsgruppe verwendet werden soll. Wenn die CreateNewSecurityGroup-Bedingung „true“ ergibt, verweist die Sicherheitsgruppeneigenschaft auf die NewSecurityGroup-Ressource. Wenn die CreateNewSecurityGroup-Bedingung „false“ ergibt, verweist die Sicherheitsgruppeneigenschaft auf den ExistingSecurityGroup-Parameter (die default-Sicherheitsgruppe).

Schließlich gibt die Vorlage bedingt die Sicherheitsgruppen-ID aus. 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.