Lernen der Grundlagen von Vorlagen - AWS CloudFormation

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Lernen der Grundlagen von Vorlagen

In Erste Schritte 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 behandeln, damit Sie wissen, wie Sie diese Komponenten zusammen verwenden können, um Vorlagen zu erstellen, die die gewünschten AWS Ressourcen erzeugen.

Was ist eine - AWS CloudFormation Vorlage?

Eine Vorlage ist eine Deklaration der AWS Ressourcen, aus denen ein Stack besteht. Die Vorlage wird als Textdatei gespeichert, deren Format dem JSON-Standard ( JavaScript Object Notation) oder YAML-Standard entspricht. Da es 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 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 über ein -TypeAttribut verfügen, das die Art der AWS Ressource definiert, die Sie erstellen möchten. Das Attribut Type hat ein spezielles Format:

AWS::ProductIdentifier::ResourceType

Der Ressourcentyp für einen Amazon S3-Bucket 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 einen Amazon- AWS CloudFormation S3-Bucket. Amazon S3 Das Erstellen eines Buckets ist einfach, da einen Bucket mit Standardeinstellungen erstellen CloudFormation kann. Für andere Ressourcen, wie z. B. eine - Amazon EC2 Auto Scaling Gruppe oder EC2-Instance, CloudFormation benötigt weitere Informationen. Für Ressourcendeklarationen wird das Attribut Properties verwendet, um die Informationen zum Erstellen einer Ressource anzugeben.

Je nach Ressourcentyp sind einige Eigenschaften erforderlich, z. B. die ImageId Eigenschaft für eine -AWS::EC2::InstanceRessource, andere sind optional. Einige Eigenschaften haben Standardwerte, z. B. die - AccessControl Eigenschaft der -AWS::S3::BucketRessource, sodass die Angabe eines Werts für diese Eigenschaften optional ist. Andere Eigenschaften sind nicht erforderlich, können aber Funktionalitäten hinzufügen, die erwünscht sind, z. B. die WebsiteConfiguration-Eigenschaft der AWS::S3::Bucket-Ressource. 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 Standard-Einstellungen akzeptieren und das Eigenschaften-Attribut auslassen, weil die AWS::S3::Bucket-Ressource nur über optionale Eigenschaften verfügt und wir keine optionalen Features benötigt haben.

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

Ressourceneigenschaften und gemeinsames Verwenden von Ressourcen

Normalerweise ist eine Eigenschaft einer Ressource eine Zeichenfolge. Die folgende Vorlage gibt beispielsweise eine vordefinierte ACL (PublicRead) für die - 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 AWS::S3::Bucket Ressource hat beispielsweise zwei Eigenschaften: AccessControl und WebsiteConfiguration. Die - WebsiteConfiguration Eigenschaft hat 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 Reihe 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 die Ressource CloudFormation erstellt, generiert es einen physischen Namen, der auf der Kombination des logischen Namens, des Stack-Namens und einer eindeutigen ID basiert.

Sie fragen sich vielleicht, wie Sie die Eigenschaften einer Ressource basierend auf dem Namen oder der Eigenschaft einer anderen Ressource festlegen. Sie können beispielsweise eine CloudFront Verteilung erstellen, die von einem S3-Bucket oder einer EC2-Instance unterstützt wird, die EC2-Sicherheitsgruppen verwendet, und alle diese Ressourcen können in derselben Vorlage erstellt werden. CloudFormation verfügt über eine Reihe intrinsischer 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::InstanceRessource. Die - SecurityGroups Eigenschaft der Ressource ruft die Ref-Funktion auf, um auf die AWS::EC2::SecurityGroup Ressource zu verweisen InstanceSecurityGroup.

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 - SecurityGroups Eigenschaft ist eine Liste von Sicherheitsgruppen, und im vorherigen Beispiel haben wir nur ein Element in der Liste. Die folgende Vorlage enthält ein zusätzliches Element in der SecurityGroups Eigenschaftsliste.

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 AWS::EC2::Instance ist die - KeyName Eigenschaft von 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 Region, in der Sie den Stack erstellen, variieren, oder Sie möchten die Vorlage möglicherweise für eine andere Person freigeben, damit sie sie mit ihrem 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 ein Parameterobjekt hinzu, das den - KeyName Parameter enthält, der verwendet wird, um die - KeyName Eigenschaft für die -AWS::EC2::InstanceRessource anzugeben. 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 einem S3-Ursprung erstellen möchten, müssen Sie den Bucket-Speicherort mithilfe einer DNS-Adresse angeben. 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 mithilfe der -Fn::GetAtt Funktion 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 verwendet zwei Parameter, den logischen Namen der Ressource und den Namen des abzurufenden Attributs. Eine vollständige Liste der verfügbaren Attribute für Ressourcen finden Sie unter Fn::GetAtt. Sie werden feststellen, dass die Fn::GetAtt Funktion ihre beiden Parameter in einem Array auflistet. 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 Typ, das Zeichenfolge, Zahl oder ein AWS-spezifischer Typ sein kann. 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 CloudFormation verwendet die Standardwerte, es sei denn, Benutzer geben 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 den Wert eines Parameters zu überprüfen, können Sie Einschränkungen deklarieren oder einen AWS-spezifischen Parametertyp angeben.

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 dies nicht der Fall ist, CloudFormation kann den Stack nicht erstellen und löst eine Ausnahme aus: Parameters: [KeyName] must have values.

Bei AWS-spezifischen Parametertypen CloudFormation validiert Eingabewerte anhand vorhandener Werte im AWS Benutzerkonto und in der Region, in der der Stack erstellt wird, bevor Stack-Ressourcen erstellt werden. In der Beispielvorlage ist der KeyName Parameter ein AWS-spezifischer Parametertyp von AWS::EC2::KeyPair::KeyName. CloudFormation überprüft, ob Benutzer einen gültigen EC2-Schlüsselpaarnamen angeben, bevor der Stack erstellt wird. Ein weiteres Beispiel für einen AWS-spezifischen Parametertyp ist AWS::EC2::VPC::Id, bei dem Benutzer eine gültige VPC-ID angeben müssen. Zusätzlich zur Vorabvalidierung zeigt die AWS Konsole eine Dropdown-Liste gültiger Werte für AWS-spezifische Parametertypen an, z. B. gültige EC2-Schlüsselpaarnamen oder VPC-IDs, wenn Benutzer den Assistenten zum Erstellen von Stacks 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 setzentrue, gibt den als Sternchen (*****) maskierten Parameterwert für alle Aufrufe CloudFormation zurück, die den Stack oder die Stack-Ereignisse beschreiben, mit Ausnahme der Informationen, die an den unten angegebenen Speicherorten gespeichert sind. Im Beispiel oben ist der WordPressUser-Parameter 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:

  • Die Metadata template section. CloudFormation dos transformiert, ändert oder redigiert keine Informationen, die Sie in den Metadata Abschnitt aufnehmen. Weitere Informationen finden Sie unter Metadaten.

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

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

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

Wichtig

Anstatt vertrauliche Informationen direkt in Ihre CloudFormation Vorlagen einzubetten, empfehlen wir Ihnen, dynamische Parameter in der Stack-Vorlage zu verwenden, um auf vertrauliche Informationen zu verweisen, die außerhalb von gespeichert und verwaltet werden CloudFormation, z. B. im AWS Systems Manager Parameter Store oder AWS Secrets Manager.

Weitere Informationen finden Sie in der Keine Anmeldeinformationen in Vorlagen einbetten bewährten Methode.

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 hartcodiert. Diese Methode funktioniert für die Region USA Ost, in der es 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 Vorlagen-Features, die dafür infrage kommen: das Zuweisungs-Objekt und der AWS::Region-Pseudoparameter.

Der AWS::Region Pseudoparameter ist ein Wert, der als Region CloudFormation aufgelöst wird, in der der Stack erstellt wird. Pseudoparameter werden von beim Erstellen des CloudFormation 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 Zuordnung namens RegionMap , die verwendet wird, um 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 der wird RegionMapjede Region einem Name-Wert-Paar zugeordnet. Das Name-Wert-Paar ist ein Etikett und der Zuweisungswert. In der ist RegionMapAMI die Bezeichnung und die AMI-ID der Wert. Um eine Zuordnung zum Zurückgeben eines Werts zu verwenden, verwenden Sie die Funktion Fn::FindInMap, wobei Sie den Namen der Zuordnung, den Wert, der zum Suchen des zugeordneten Werts verwendet wird, und die Bezeichnung des zugeordneten Werts übergeben, den Sie zurückgeben möchten. Im obigen Beispiel verwendet die - ImageId Eigenschaft der -Ressource Ec2Instance die FindInMap Funktion Fn::, um ihren Wert zu bestimmen, indem sie RegionMap als die zu verwendende Zuordnung, AWS::Region als den Eingabewert, aus dem zugeordnet werden soll, und AMI als Bezeichnung zur Identifizierung des zuzuordnenden Werts angibt. Wenn z. B. diese Vorlage zum Erstellen eines Stacks in der Region USA West (Nordkalifornien) verwendet wird, würde ImageId auf ami-655a0a20 festgelegt werden.

Tipp

Mit dem AWS::Region-Pseudoparameter können Sie die Region herausfinden, in welcher der Stack erstellt wird. Einige Ressourcen, wie AWS::EC2::Instance, AWS::AutoScaling::AutoScalingGruppe 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 erstellt die Fn::Join-Funktion beispielsweise die Target Untereigenschaft der -HealthCheckEigenschaft für die ElasticLoadBalancer Ressource, indem der WebServerPort Parameter mit anderen Literalzeichenfolgen verkettet wird, um den benötigten 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 gibt die Funktion Fn::Join eine leere Zeichenfolge als Trennzeichen und HTTP:, den Wert des WebServerPort Parameters und ein /-Zeichen als zu verkettende Werte an. Wenn einen Wert von 8888 WebServerPort hätte, würde die Zieleigenschaft auf den folgenden Wert gesetzt:

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 beispielsweise 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 von einem Fn::Join-Funktionsaufruf zurückgegeben wird, der http://, den DNS-Namen der Ressource ElasticLoadBalancerund /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 Tutorial Erste Schritte haben wir diesen Link verwendet, um bequem zur Installationsseite für den WordPress Blog zu gelangen, den wir erstellt haben. CloudFormation generiert 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 Ressourcenattribute mit 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, Ressourcen-Attributen und anderen Zeichenfolgen.

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

Wir haben zwei Objekte der obersten Ebene in einer Vorlage nicht behandelt: AWSTemplateFormatVersion und Beschreibung. AWSTemplateFormatVersion ist einfach die Version des Vorlagenformats – wenn Sie es nicht angeben, CloudFormation verwendet 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 finden Sie unter Formatversion und Beschreibung.

Natürlich gibt es erweiterte Vorlagen- und Stack-Features. 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 angeben, dass eine Ressource nach der anderen erstellt werden muss.

  • Mit dem DeletionPolicy Attribut können Sie angeben, wie das Löschen einer Ressource verarbeiten CloudFormation soll.

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

AWS::CloudFormation::Stack Mit können Sie einen anderen Stack als Ressource in Ihrer Vorlage verschachteln.