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.
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 imMetadata
-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.
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.