Informationen über Vorlagengrundlagen - AWS CloudFormation

Informationen über Vorlagengrundlagen

In Melden Sie sich in der &console; an und öffnen Sie die Seite &ConsolePageURL;. haben Sie erfahren, wie Sie eine Vorlage zum Erstellen eines Stacks verwenden. Sie haben gesehen, wie Ressourcen in einer Vorlage angegeben werden und wie diese den Ressourcen im Stack zugeordnet werden. Wir haben auch Eingabeparameter erwähnt und wie Sie sie verwenden können, um bestimmte Werte beim Erstellen eines Stacks anhand einer Vorlage einzubringen. In diesem Abschnitt setzen wir uns noch näher mit Ressourcen und Parametern auseinander. Wir werden auch die anderen Komponenten von Vorlagen abdecken, damit Sie wissen, wie Sie diese Komponenten zusammen verwenden, um Vorlagen zu erstellen, die die gewünschten AWS-Ressourcen generieren.

Was ist eine AWS CloudFormation-Vorlage?

Eine Vorlage ist eine Deklaration der AWS-Ressourcen, die ein Stack bilden. Die Vorlage wird als Textdatei gespeichert, deren Format mit dem JavaScript Object Notation (JSON)- oder YAML-Standard kompatibel ist. Da es nur Textdateien sind, können Sie diese in einem beliebigen Texteditor erstellen und bearbeiten und in Ihrem Quellcodeüberwachungssystem zusammen mit Ihrem Quellcode verwalten. Weitere Informationen zu den Vorlagenformaten finden Sie unter AWS CloudFormation-Vorlagenformate.

In der Vorlage deklarieren und konfigurieren Sie die AWS-Ressourcen, die Sie erstellen und konfigurieren möchten. Sie deklarieren ein Objekt als Name-Wert-Paar oder als Kombination eines Namens mit einer Reihe von untergeordneten Objekten, die eingeschlossen sind. Die Syntax hängt von dem Format ab, das Sie verwenden. Weitere Informationen finden Sie im Aufbau einer Vorlage. Das einzige erforderliche Objekt oberster Ebene ist das Objekt Ressourcen, das mindestens eine Ressource deklarieren muss. Lassen Sie uns nun mit der grundlegenden Vorlage beginnen, die nur ein Ressourcenobjekt mit der Deklaration einer Ressource enthält.

Ressourcen: Hello Bucket!

Das Objekt Ressourcen enthält eine Auflistung von Ressourcenobjekten. Eine Ressourcendeklaration enthält die Attribute der Ressource, die wiederum als untergeordnete Objekte deklariert sind. Eine Ressource muss ein Type-Attribut haben, das die Art von AWS-Ressourcen definiert, die Sie erstellen möchten. Das Attribut Type hat ein spezielles Format:

AWS::ProductIdentifier::ResourceType

Der Ressourcentyp eines Amazon S3-Buckets ist beispielsweise AWS::S3::Bucket. Eine vollständige Liste von Ressourcentypen finden Sie unter Vorlage – Referenz.

Werfen wir einen Blick auf eine grundlegende Vorlage. Die folgende Vorlage deklariert eine einzelne Ressource vom Typ AWS::S3::Bucket: mit dem Namen HelloBucket.

JSON

{ "Resources" : { "HelloBucket" : { "Type" : "AWS::S3::Bucket" } } }

YAML

Resources: HelloBucket: Type: AWS::S3::Bucket

Wenn Sie diese Vorlage verwenden, um einen Stack zu erstellen, erstellt AWS CloudFormation ein Amazon S3-Bucket. Ein Bucket ist einfach zu erstellen, weil CloudFormation zum Erstellen eines Buckets Standardeinstellungen verwenden kann. Bei anderen Ressourcen, wie z. B. einer Amazon EC2 Auto Scaling-Gruppe oder EC2 Instance, erfordert CloudFormation weitere Informationen. Für Ressourcendeklarationen wird das Attribut Properties verwendet, um die Informationen zum Erstellen einer Ressource anzugeben.

Je nach Ressourcentyp sind bestimmte Eigenschaften erforderlich, z. B. die ImageId-Eigenschaft für die Ressource AWS::EC2::Instance. Andere Eigenschaften sind optional. Einige Eigenschaften verfügen über Standardwerte, wie zum Beispiel die AccessControl-Eigenschaft der Ressource AWS::S3::Bucket. Die Angabe eines Werts für diese Eigenschaften ist daher optional. Andere Eigenschaften sind nicht erforderlich, können aber Funktionalitäten hinzufügen, die erwünscht sind, z. B. die Eigenschaft WebsiteConfiguration der Ressource AWS::S3::Bucket. Die Angabe eines Wert für diese Eigenschaften ist völlig optional und hängt von den jeweiligen Anforderungen ab. Im obigen Beispiel konnten wird die Standardeinstellungen akzeptieren und das Attribut Eigenschaften auslassen, weil die Ressource AWS::S3::Bucket nur über optionale Eigenschaften verfügt und wir keine optionalen Funktionen benötigt haben.

Die Eigenschaften der einzelnen Ressourcentypen finden Sie unter den entsprechenden Themen in AWS-Ressourcen- und Eigenschaftstypen – Referenz.

Ressourceneigenschaften und gemeinsames Verwenden von Ressourcen

Normalerweise ist eine Eigenschaft einer Ressource eine Zeichenfolge. Die folgende Vorlage gibt beispielsweise eine vorgefertigte ACL (PublicRead) der AccessControl-Eigenschaft des Buckets an.

JSON

{ "Resources" : { "HelloBucket" : { "Type" : "AWS::S3::Bucket", "Properties" : { "AccessControl" : "PublicRead" } } } }

YAML

Resources: HelloBucket: Type: AWS::S3::Bucket Properties: AccessControl: PublicRead

Einige Ressourcen können mehrere Eigenschaften und einige Eigenschaften können eine oder mehrere Untereigenschaften haben. Die Ressource AWS::S3::Bucket hat zum Beispiel zwei Eigenschaften: AccessControl und WebsiteConfiguration. Die WebsiteConfiguration-Eigenschaft verfügt über zwei Untereigenschaften: IndexDocument und ErrorDocument. Die folgende Vorlage zeigt die ursprüngliche Bucket-Ressource mit den zusätzlichen Eigenschaften.

JSON

{ "Resources" : { "HelloBucket" : { "Type" : "AWS::S3::Bucket", "Properties" : { "AccessControl" : "PublicRead", "WebsiteConfiguration" : { "IndexDocument" : "index.html", "ErrorDocument" : "error.html" } } } } }

YAML

Resources: HelloBucket: Type: AWS::S3::Bucket Properties: AccessControl: PublicRead WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html

Einer der größten Vorteile von Vorlagen und CloudFormation ist die Möglichkeit, eine Gruppe von Ressourcen zu erstellen, die zusammenwirken, um eine Anwendung oder Lösung zu erstellen. Der Name einer Ressource in der Vorlage ist ein logischer Name. Wenn CloudFormation die Ressource erstellt, generiert es einen physischen Namen, der auf der Kombination des logischen Namens, des Stack-Namens und einer eindeutigen ID beruht.

Sie fragen sich vielleicht, wie Sie die Eigenschaften einer Ressource basierend auf dem Namen oder der Eigenschaft einer anderen Ressource festlegen. Zum Beispiel können Sie eine CloudFront-Verteilung erstellen, die von einem S3-Bucket unterstützt wird, oder eine EC2-Instance, die EC2-Sicherheitsgruppen verwendet, und alle diese Ressourcen können in derselben Vorlage erstellt werden. CloudFormation hat eine Reihe von intrinsischen Funktionen, mit denen Sie auf andere Ressourcen und deren Eigenschaften verweisen können. Sie können die Ref-Funktion verwenden, um auf eine Identifikationseigenschaft einer Ressource zu verweisen. Häufig ist es der physische Name der Ressource. Manchmal kann es aber eine Kennung sein, z. B. die IP-Adresse einer AWS::EC2::EIP-Ressource oder ein Amazon-Ressourcenname (ARN) eines Amazon SNS-Themas. Eine Liste der Werte, die die Ref-Funktion zurückgibt, finden Sie unter Ref-Funktion. Die folgende Vorlage enthält eine AWS::EC2::Instance-Ressource. Die Eigenschaft SecurityGroups der Ressource ruft die Ref-Funktion auf, um auf die AWS::EC2::SecurityGroup-Ressource InstanceSecurityGroup zu verweisen.

JSON

{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ], "KeyName": "mykey", "ImageId": "" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup KeyName: mykey ImageId: '' InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

Die Eigenschaft SecurityGroups ist eine Liste von Sicherheitsgruppen. Im vorhergehenden Beispiel enthält die Liste nur ein Element. Die Liste der Eigenschaft SecurityGroup in der folgenden Vorlage enthält ein weiteres Element.

JSON

{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": "mykey", "ImageId": "ami-7a11e213" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: mykey ImageId: ami-7a11e213 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

MyExistingSecurityGroup ist eine Zeichenfolge, die sich auf eine vorhandene EC2-Sicherheitsgruppe bezieht anstatt auf eine Sicherheitsgruppe, die in einer Vorlage deklariert ist. Verwenden Sie Literalzeichenfolgen, um auf eine vorhandene AWS-Ressource zu verweisen.

Im obigen Beispiel ist die KeyName-Eigenschaft der AWS::EC2::Instance-Ressource die Literalzeichenfolge mykey. Das bedeutet, dass in der Region, in der der Stack erstellt wird, ein Schlüsselpaar mit dem Namen mykey vorhanden sein muss. Andernfalls wird die Stack-Erstellung fehlschlagen, da das Schlüsselpaar nicht vorhanden ist. Das Schlüsselpaar, das Sie verwenden, kann je nach der Region, in der Sie den Stack erstellen, variieren. Alternativ möchten Sie die Vorlage unter Umständen für eine andere Person freigeben, sodass dieser Benutzer sie über sein AWS-Konto verwenden kann. Wenn dies der Fall ist, können Sie einen Eingabeparameter verwenden, um den Namen des Schlüsselpaars beim Erstellen des Stacks anzugeben. Die Ref-Funktion kann auf die Eingabeparameter bezogen werden, die zum Zeitpunkt der Stack-Erstellung angegeben wurden. Die folgende Vorlage fügt das Objekt Parameter mit dem KeyName-Parameter hinzu, mit dem die KeyName-Eigenschaft der AWS::EC2::Instance-Ressource angegeben wird. Der Parametertyp lautet AWS::EC2::KeyPair::KeyName. Damit wird sichergestellt, dass ein Benutzer einen gültigen Schlüsselpaarnamen in seinem Konto und in der Region verwendet, in der der Stack erstellt wird.

JSON

{ "Parameters": { "KeyName": { "Description": "The EC2 Key Pair to allow SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName" } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": { "Ref": "KeyName" }, "ImageId": "ami-7a11e213" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Parameters: KeyName: Description: The EC2 Key Pair to allow SSH access to the instance Type: 'AWS::EC2::KeyPair::KeyName' Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: !Ref KeyName ImageId: ami-7a11e213 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

Die Ref-Funktion ist hilfreich, wenn der Parameter oder der Wert, der für eine Ressource zurückgegeben wird, genau dem entspricht, was gewünscht war. Sie benötigen jedoch möglicherweise weitere Attribute einer Ressource. Wenn Sie beispielsweise eine CloudFront-Verteilung mit S3-Ursprung erstellen möchten, müssen Sie den Bucket-Speicherort angeben, indem Sie eine DNS-Adresse verwenden. Eine Reihe von Ressourcen haben zusätzliche Attribute, deren Werte Sie in Ihrer Vorlage verwenden können. Um diese Attribute abzurufen, verwenden Sie die Funktion Fn::GetAtt. Die folgende Vorlage erstellt eine CloudFront-Verteilungsressource, die den DNS-Namen einer S3-Bucket-Ressource mit der Funktion Fn::GetAtt angibt, um das DomainName-Attribut des Buckets abzurufen.

JSON

{ "Resources": { "myBucket": { "Type": "AWS::S3::Bucket" }, "myDistribution": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "Origins": [ { "DomainName": { "Fn::GetAtt": [ "myBucket", "DomainName" ] }, "Id": "myS3Origin", "S3OriginConfig": {} } ], "Enabled": "true", "DefaultCacheBehavior": { "TargetOriginId": "myS3Origin", "ForwardedValues": { "QueryString": "false" }, "ViewerProtocolPolicy": "allow-all" } } } } } }

YAML

Resources: myBucket: Type: 'AWS::S3::Bucket' myDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: !GetAtt - myBucket - DomainName Id: myS3Origin S3OriginConfig: {} Enabled: 'true' DefaultCacheBehavior: TargetOriginId: myS3Origin ForwardedValues: QueryString: 'false' ViewerProtocolPolicy: allow-all

Die Fn::GetAtt-Funktion hat zwei Parameter, den logischen Namen der Ressource und den Namen des Attributs, das abgerufen wird. Eine vollständige Liste der verfügbaren Attribute einer Ressource finden Sie unter Fn::GetAtt. Beachten Sie, dass die zwei Parameter der Fn::GetAtt-Funktion in einem Array aufgeführt werden. Bei Funktionen mit mehreren Parametern werden diese in einem Array angegeben.

Empfangen von Benutzereingaben mithilfe von Eingabeparametern

Sie haben nun etwas über Ressourcen erfahren und auch darüber, wie sie zusammen in einer Vorlage verwendet werden. Sie haben gelernt, wie Sie auf Eingabeparameter verweisen. Wir haben uns jedoch noch nicht eingehend damit beschäftigt, wie Eingabeparameter im Detail definiert werden. Werfen wir einen Blick auf Parameterdeklarationen und sehen wir uns an, wie Benutzereingaben eingeschränkt und überprüft werden können.

Sie geben die Parameter in dem Objekt Parameters einer Vorlage an. Ein Parameter enthält eine Liste von Attributen, die seinen Wert sowie Einschränkungen für diesen Wert definieren. Das einzige erforderliche Attribut ist „Type“, das eine Zeichenfolge, eine Zahl oder ein AWS-spezifischer Typ ist. Sie können auch ein „Description“-Attribut angeben. Dadurch erfährt der Benutzer, welche Art von Wert angegeben werden soll. Wenn ein Benutzer im Assistenten „Create Stack“ die Vorlage verwendet, werden Name und Beschreibung des Parameters auf der Seite „Specify Parameters“ angezeigt.

Das folgende Vorlagenfragment ist ein Parameters-Objekt, das die Parameter deklariert, die auf der Seite „Specify Parameters“ oben verwendet werden.

JSON

"Parameters": { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server", "Type": "AWS::EC2::KeyPair::KeyName" }, "WordPressUser": { "Default": "admin", "NoEcho": "true", "Description" : "The WordPress database admin account user name", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*" }, "WebServerPort": { "Default": "8888", "Description" : "TCP/IP port for the WordPress web server", "Type": "Number", "MinValue": "1", "MaxValue": "65535" } }

YAML

Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server Type: AWS::EC2::KeyPair::KeyName WordPressUser: Default: admin NoEcho: true Description: The WordPress database admin account user name Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" WebServerPort: Default: 8888 Description: TCP/IP port for the WordPress web server Type: Number MinValue: 1 MaxValue: 65535

Bei Parametern mit Standardwerten verwendet CloudFormation die Standardwerte, es sei denn, der Benutzer gibt einen anderen Wert an. Wenn Sie das Standardattribut auslassen, muss der Benutzer einen Wert für diesen Parameter angeben. Wenn jedoch der Benutzer einen Wert angeben muss, ist nicht sichergestellt, dass der Wert gültig ist. Um einen Wert eines Parameters zu überprüfen, können Sie Einschränkungen definieren oder einen AWS-spezifischen Parametertyp festlegen.

Beachten Sie, dass der Parameter KeyName kein Default-Attribut aufweist, während andere Parameter eins haben. Der Parameter WordPressUser hat beispielsweise das Attribut Default: admin, aber der Parameter KeyName hat keins. Benutzer müssen bei der Stack-Erstellung einen Schlüsselnamenwert angeben. Wenn keiner angegeben wird, kann CloudFormation kein Stack erstellen und zeigt eine Ausnahme an: Parameters: [KeyName] must have values.

Bei AWS-spezifischen Parametertypen überprüft CloudFormation die Eingabewerte anhand vorhandener Werte im AWS-Konto des Benutzers und in der Region, in der der Stack erstellt wird, bevor Stack-Ressourcen erstellt werden. In der Beispielvorlage ist der Parameter KeyName ein AWS-spezifischer Parametertyp von AWS::EC2::KeyPair::KeyName. CloudFormation überprüft, ob die Benutzer einen gültigen EC2-Schlüsselpaarnamen angeben, bevor sie den Stack erstellen. Ein weiteres Beispiel für einen AWS-spezifischen Parametertypen ist AWS::EC2::VPC::Id, bei dem der Benutzer eine gültige VPC-ID angeben muss. Zusätzlich zur Vorausvalidierung zeigt die AWS-Konsole zeigt eine Dropdown-Liste der gültigen Werte für AWS-spezifische Parametertypen, z. B. gültige EC2-Schlüsselpaarnamen oder VPC-IDs, wenn Benutzer den Assistenten „Create Stack“ verwenden.

Für den Typen String können Sie die folgenden Attribute verwenden, um Einschränkungen zu deklarieren: MinLength, MaxLength, Default, AllowedValues und AllowedPattern. Im obigen Beispiel hat der Parameter WordPressUser drei Einschränkungen: Der Parameterwert muss 1 bis 16 Zeichen lang sein (MinLength, MaxLength) und muss mit einem Buchstaben beginnen, gefolgt von einer beliebigen Kombination aus Buchstaben und Zahlen (AllowedPattern).

Für den Typen Number können Sie die folgenden Einschränkungen deklarieren: MinValue, MaxValue, Default und AllowedValues. Eine Zahl kann eine ganze Zahl oder ein Gleitkommawert sein. Im obigen Beispiel muss der Parameter WebServerPort eine Zahl zwischen 1 und 65535 sein (MinValue, MaxValue).

Am Anfang dieses Abschnitts haben wir erwähnt, dass Parameter eine gute Möglichkeit darstellen, sensible oder implementierungsspezifische Daten anzugeben, z. B. Passwörter oder Benutzernamen, die Sie verwenden müssen, aber nicht in die Vorlage einbetten möchten. 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. Im Beispiel oben ist der Parameter WordPressUser für Personen, die die Stack-Einstellungen anzeigen, nicht sichtbar. Der Parameterwert wird in Form von Sternchen zurückgegeben.

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.

Angeben bedingter Werte mithilfe von Zuweisungen

Parameter dienen besonders gut dazu, Benutzern die Möglichkeit zu geben, eindeutige oder sensible Werte für die Verwendung in Eigenschaften von Stack-Ressourcen festzulegen. Es gibt jedoch möglicherweise regional abhängige oder etwas komplizierte Einstellungen, die für Benutzer aufgrund anderer Bedingungen oder Abhängigkeiten schwer nachvollziehbar sind. In diesen Fällen sollten Sie logische Ausdrücke in die Vorlage selbst aufnehmen, damit Benutzer einfachere Werte (oder gar keine) festlegen können, um die gewünschten Ergebnisse zu erhalten. In einem früheren Beispiel haben wir die AMI-ID für die ImageId-Eigenschaft unserer EC2 Instance fest programmiert. Diese Methode funktioniert für die Region USA Ost, in der das AMI das gewünschte AMI repräsentiert. Wenn der Benutzer jedoch versucht, die den Stack in einer anderen Region bereitzustellen, erhält er das falsche oder gar kein AMI. (AMI-IDs sind einer Region eindeutig zugeordnet, d. h. die gleiche AMI-ID repräsentiert möglicherweise in einer anderen Region kein oder ein völlig anderes AMI.)

Um dieses Problem zu vermeiden, müssen Sie die richtige AMI-ID basierend auf einer bedingten Eingabe festlegen (in diesem Beispiel die Region, in der der Stack erstellt wird). Es gibt zwei Vorlagenfunktionen, die dafür infrage kommen: das Mappings-Objekt und der Pseudoparameter AWS::Region.

Der Pseudoparameter AWS::Region ist ein Wert, der von CloudFormation als Region aufgelöst wird, in der der Stack erstellt wird. Pseudoparameter werden von CloudFormation beim Erstellen des Stacks aufgelöst. Mit Zuweisungen können Sie einen Eingabewert als Bedingung zur Bestimmung eines anderen Werts verwenden. Ähnlich wie bei der switch-Anweisung verbindet eine Zuweisung einen Satz Werte mit einem anderen Satz Werte. Wenn Sie den AWS::Region-Parameter zusammen mit einer Zuweisung verwenden, können Sie sicherstellen, dass eine für die Region passende AMI-ID festgelegt wird. Die folgende Vorlage enthält ein Mappings-Objekt mit einer Zuweisung namens RegionMap, die dazu dient, eine AMI-ID der entsprechenden Region zuzuordnen.

JSON

{ "Parameters": { "KeyName": { "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type": "String" } }, "Mappings": { "RegionMap": { "us-east-1": { "AMI": "ami-76f0061f" }, "us-west-1": { "AMI": "ami-655a0a20" }, "eu-west-1": { "AMI": "ami-7fd4e10b" }, "ap-southeast-1": { "AMI": "ami-72621c20" }, "ap-northeast-1": { "AMI": "ami-8e08a38f" } } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "KeyName": { "Ref": "KeyName" }, "ImageId": { "Fn::FindInMap": [ "RegionMap", { "Ref": "AWS::Region" }, "AMI" ] }, "UserData": { "Fn::Base64": "80" } } } } }

YAML

Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instance Type: String Mappings: RegionMap: us-east-1: AMI: ami-76f0061f us-west-1: AMI: ami-655a0a20 eu-west-1: AMI: ami-7fd4e10b ap-southeast-1: AMI: ami-72621c20 ap-northeast-1: AMI: ami-8e08a38f Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: KeyName: !Ref KeyName ImageId: !FindInMap - RegionMap - !Ref 'AWS::Region' - AMI UserData: !Base64 '80'

In RegionMap wird jeder Region ein Name-Wert-Paar zugeordnet. Das Name-Wert-Paar ist ein Etikett und der Zuweisungswert. In RegionMap ist AMI das Etikett und die AMI-ID der Wert. Um mit einer Zuweisung einen Wert zurückzugeben, verwenden Sie die Funktion Fn::FindInMap, die den Namen der Zuweisung, den zum Suchen nach dem zugewiesenen Wert verwendeten Wert und das Etikett des zugewiesenen Werts, der zurückgegeben werden soll, verwendet. Im obigen Beispiel verwendet die ImageId-Eigenschaft der Ressource Ec2Instance die Funktion Fn::FindInMap, um den Wert zu bestimmen. Dazu werden RegionMap als die zu verwendende Zuweisung, AWS::Region als der Eingabewert für die Zuweisung und AMI als das Etikett festgelegt, um den Wert zu finden, zu dem die Zuweisung erfolgt. Wenn diese Vorlage beispielsweise verwendet würde, um einen Stack in der USA West (Nordkalifornien)-Region zu erstellen, würde ImageId auf ami-655a0a20 festgelegt.

Tipp

Mit dem AWS::Region-Pseudoparameter können Sie die Region herausfinden, in welcher der Stack erstellt wird. Einige Ressourcen, wie z. B. AWS::EC2::Instance, AWS::AutoScaling::AutoScalingGroup und AWS::ElasticLoadBalancing::LoadBalancer, haben eine Eigenschaft, die Availability Zones angibt. Sie können die Fn::GetAZs-Funktion verwenden, um die Liste aller Availability Zones in einer Region abzurufen.

Rechnerisch ermittelte Werte und Ausgabewerte

Parameter und Zuweisungen sind eine gute Möglichkeit, um bestimmte Werte zum Zeitpunkt der Stack-Erstellung zu übergeben oder zu bestimmen. Unter Umständen kann es jedoch passieren, dass ein Wert von einem Parameter oder einem anderen Ressourcenattribut nur ein Teil des erforderlichen Wertes ist. Im folgenden Fragment der WordPress-Vorlage erzeugt die Funktion Fn::Join beispielsweise die Target-Untereigenschaft der HealthCheck-Eigenschaft für die ElasticLoadBalancer-Ressource, indem der WebServerPort-Parameter mit anderen Literalzeichenfolgen verkettet wird, um den erforderlichen Wert zu bilden.

JSON

{ "Resources": { "ElasticLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "AvailabilityZones": { "Fn::GetAZs": "" }, "Instances": [ { "Ref": "Ec2Instance1" }, { "Ref": "Ec2Instance2" } ], "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": { "Ref": "WebServerPort" }, "Protocol": "HTTP" } ], "HealthCheck": { "Target": { "Fn::Join": [ "", [ "HTTP:", { "Ref": "WebServerPort" }, "/" ] ] }, "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "30", "Timeout": "5" } } } } }

YAML

Resources: ElasticLoadBalancer: Type: 'AWS::ElasticLoadBalancing::LoadBalancer' Properties: AvailabilityZones: !GetAZs '' Instances: - !Ref Ec2Instance1 - !Ref Ec2Instance2 Listeners: - LoadBalancerPort: '80' InstancePort: !Ref WebServerPort Protocol: HTTP HealthCheck: Target: !Join - '' - - 'HTTP:' - !Ref WebServerPort - / HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '30' Timeout: '5'

Die Funktion Fn::Join verwendet zwei Parameter: ein Begrenzungszeichen, das die Werte, die Sie verketten möchten, voneinander trennt, und eine Reihe von Werten in der Reihenfolge, in der sie angezeigt werden sollen. Im obigen Beispiel legt die Funktion Fn::Join eine leere Zeichenfolge als Trennzeichen fest und HTTP: (der Wert des WebServerPort-Parameters) und ein / als die Werte, die verkettet werden sollen. Wenn WebServerPort einen Wert von 8888 aufweist, wird die Zieleigenschaft auf den folgenden Wert eingestellt:

HTTP:8888/

Die Fn::Join-Funktion dient auch dazu, Ausgabewerte für den Stack zu deklarieren. Das Outputs-Objekt in der Vorlage enthält Deklarationen der Werte, die verfügbar sein sollen, nachdem der Stack erstellt wurde. Eine Ausgabe ist eine praktische Möglichkeit zum Erfassen wichtiger Informationen über Ihre Ressourcen oder Eingabeparameter. In der WordPress-Vorlage deklarieren wir das folgende Outputs-Objekt.

JSON

"Outputs": { "InstallURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] }, "/wp-admin/install.php" ] ] }, "Description": "Installation URL of the WordPress website" }, "WebsiteURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] } ] ] } } }

YAML

Outputs: InstallURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName - /wp-admin/install.php Description: Installation URL of the WordPress website WebsiteURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName

Jeder Ausgabewert hat einen Namen, ein Werte-Attribut, das die Deklaration des Werts enthält, der als Ausgabewert zurückgegeben wird, und optional eine Beschreibung des Werts. Im vorherigen Beispiel ist InstallURL die Zeichenfolge, die durch einen Aufruf der Fn::Join-Funktion zurückgegeben wird, der http://, den DNS-Namen der Ressource ElasticLoadBalancer und /wp-admin/install.php verkettet. Der Ausgabewert sollte folgendermaßen oder ähnlich aussehen:

http://mywptests-elasticl-1gb51l6sl8y5v-206169572.us-east-2.elb.amazonaws.com/wp-admin/install.php

Im „Erste Schritte“-Tutorial haben wir diesen Link verwendet, um bequem zur Installationsseite des von uns erstellten WordPress-Blogs zu gelangen. CloudFormation erzeugt die Ausgabewerte, nachdem es die Erstellung des Stacks abgeschlossen hat. Sie können die Ausgabewerte auf der Registerkarte „Outputs“ der CloudFormation-Konsole oder über den Befehl aws cloudformation describe-stacks abrufen.

Nächste Schritte

Wir sind die grundlegenden Aspekte einer Vorlage und ihre Verwendung durchgegangen. Sie haben Folgendes über Vorlagen erfahren:

  • Deklarieren von Ressourcen und deren Eigenschaften

  • Verweisen auf andere Ressourcen mit der Ref-Funktion und Ressourcenattributen mithilfe der Fn::GetAtt-Funktion

  • Verwenden von Parametern, um Benutzern zu ermöglichen, die Werte zum Zeitpunkt der Stack-Erstellung festzulegen und Einschränkungen zur Überprüfung der Parametereingabe zu verwenden

  • Verwenden von Zuweisungen zur Bestimmung bedingter Werte

  • Verwenden der Fn::Join-Funktion zur rechnerischen Ermittlung von Werten basierend auf Parametern, Ressourcenattributen und anderen Zeichenfolgen

  • Verwenden von Ausgabewerten zum Erfassen von Informationen zu Stack-Ressourcen

Wir sind nicht auf zwei Objekte oberster Ebene in einer Vorlage eingegangen: AWSTemplateFormatVersion und Description. AWSTemplateFormatVersion ist einfach die Version des Vorlagenformats— wenn Sie es nicht festlegen, verwendet CloudFormation die neueste Version.

Das Description-Objekt ist eine gültige JSON- oder YAML-Zeichenfolge. Diese Beschreibung wird auf der Seite „Specify Parameters“ des Assistenten „Create Stack“ angezeigt. Weitere Informationen erhalten Sie unter Formatversion und Beschreibung.

Natürlich gibt es erweiterte Vorlagen- und Stack-Funktionen. Hier finden Sie eine Liste ein paar der wichtigen Funktionen, die Sie interessieren werden:

Optionale Attribute , die mit jeder Ressource verwendet werden können:

  • Mit dem DependsOn-Attribut können Sie festlegen, dass die Ressourcen nacheinander erstellt werden.

  • Mit dem DeletionPolicy-Attribut können Sie festlegen, wie CloudFormation beim Löschen einer Ressource verfahren soll.

  • Mit dem Metadata-Attribut können Sie strukturierten Daten zu einer Ressource festlegen.

AWS::CloudFormation::Stack ermöglicht es Ihnen, einen anderen Stack als eine Ressource in Ihrer Vorlage zu platzieren.