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.
Übersicht der Vorlagen
Dieses Thema bietet eine Einführung in die wichtigsten Bestandteile einer Vorlage und deren Verwendung.
Sie können die Abschnitte auf dieser Seite verwenden, um Folgendes über Vorlagen zu erfahren:
-
Deklarieren von Ressourcen und deren Eigenschaften.
-
Referenzieren anderer Ressourcen mit der
Ref
Funktion und Ressourcenattributen unter Verwendung derFn::GetAtt
Funktion. -
Verwendung von Parametern zur Angabe von Werten zum Zeitpunkt der Stack-Erstellung und Verwendung von Einschränkungen zur Validierung der Parametereingabe.
-
Verwenden von Zuweisungen zur Bestimmung bedingter Werte.
-
Verwendung der
Fn::Join
Funktion zum Konstruieren von Werten auf der Grundlage von Parametern, Ressourcenattributen und anderen Zeichenketten. -
Verwenden von Ausgabewerten zum Erfassen von Informationen zu Stack-Ressourcen
Themen
Über Vorlagen
Eine CloudFormation Vorlage ist eine Deklaration der AWS Ressourcen, aus denen ein Stapel besteht. Die Vorlage ist eine Textdatei, die bestimmten Formatierungsregeln folgt und entweder den JavaScript Object Notation (JSON) oder den YAML-Standard verwendet. Da es sich bei Vorlagen um Textdateien handelt, können Sie sie in jedem Texteditor erstellen und bearbeiten und sie zusammen mit dem Rest Ihres Quellcodes in Ihrem Quellcodeverwaltungssystem verwalten.
In der Vorlage deklarieren Sie die AWS Ressourcen, die Sie erstellen möchten. Sie definieren jede Ressource als eine Reihe von Eigenschaften und Werten unter Verwendung der Syntaxregeln des ausgewählten Formats (JSON oder YAML).
Vorlagen haben unterschiedliche Abschnitte, aber der einzige erforderliche Abschnitt ist der Resources
Abschnitt, in dem mindestens eine Ressource deklariert werden muss.
Beispiele, die die vollständige Struktur einer Vorlage mit allen verfügbaren Abschnitten zeigen, finden Sie unterVorlagenformate. Eine Liste der Ressourcen, mit denen Sie etwas erstellen können CloudFormation, finden Sie unterAWS Referenz zu Ressourcen- und Eigenschaftstypen.
Ressourcen: Hello Bucket!
Dieser Resources
Abschnitt enthält eine Liste der Ressourcen, die Sie erstellen möchten. Jede Ressource muss ein Type
Attribut haben, das definiert, um welche Art von AWS Ressource es sich handelt. Das Attribut Type
hat ein spezielles Format:
AWS::
ProductIdentifier
::ResourceType
Der Ressourcentyp für einen Amazon S3 S3-Bucket lautet beispielsweiseAWS::S3::Bucket
.
Werfen wir einen Blick auf eine grundlegende Vorlage. Die folgende Vorlage deklariert eine einzelne Ressource vom Typ AWS::S3::Bucket:
mit dem NamenHelloBucket
.
JSON
{ "Resources": { "HelloBucket": { "Type": "AWS::S3::Bucket" } } }
YAML
Resources: HelloBucket: Type: 'AWS::S3::Bucket'
Wenn Sie diese Vorlage verwenden, um einen Stack zu erstellen, CloudFormation wird ein Amazon S3 S3-Bucket erstellt. Das Erstellen eines Buckets ist einfach, da ein Bucket mit Standardeinstellungen erstellt werden CloudFormation kann. Für andere Ressourcen, z. B. eine Amazon EC2 EC2-Instance oder eine Auto Scaling Scaling-Gruppe, CloudFormation sind weitere Informationen erforderlich. 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::Instance
Ressource, und andere sind optional. Einige Eigenschaften haben Standardwerte, wie z. B. die AccessControl
Eigenschaft der AWS::S3::Bucket
Ressource, 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
undWebsiteConfiguration
. Die WebsiteConfiguration
Eigenschaft hat zwei Untereigenschaften: IndexDocument
undErrorDocument
. 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 CloudFormation ist die Möglichkeit, eine Reihe von Ressourcen zu erstellen, die zusammenarbeiten, um eine Anwendung oder Lösung zu erstellen. Der Name einer Ressource in der Vorlage ist ein logischer Name. Bei der Erstellung der Ressource CloudFormation wird ein physischer Name generiert, der auf der Kombination aus dem logischen Namen, dem Stacknamen 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 Distribution erstellen, die von einem S3-Bucket oder einer EC2-Instance unterstützt wird, die EC2-Sicherheitsgruppen verwendet, und all diese Ressourcen können in derselben Vorlage erstellt werden. CloudFormation verfügt über eine Reihe systemeigener Funktionen, mit denen Sie auf andere Ressourcen und deren Eigenschaften verweisen können. Sie können die Ref
Funktion verwenden, um auf eine identifizierende Eigenschaft einer Ressource zu verweisen. Häufig ist dies der physische Name der Ressource. Manchmal kann es sich jedoch auch um eine Kennung handeln, z. B. die IP-Adresse für eine AWS::EC2::EIP
Ressource oder einen Amazon-Ressourcennamen (ARN) für ein Amazon SNS-Thema. Eine Liste der von der Ref
Funktion zurückgegebenen Werte finden Sie unter Ref-Funktion. Die folgende Vorlage enthält eine AWS::EC2::Instance
Ressource. Die SecurityGroups
Eigenschaft der Ressource ruft die Ref
Funktion auf, um auf die AWS::EC2::SecurityGroup
Ressource zu verweisenInstanceSecurityGroup
.
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
Eigenschaftenliste.
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 auf eine bestehende EC2-Sicherheitsgruppe statt auf eine in einer Vorlage deklarierte Sicherheitsgruppe verweist. Sie verwenden literale Zeichenketten, um auf vorhandene AWS Ressourcen 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 von Ihnen verwendete key pair kann je nach Region variieren, in der Sie den Stack erstellen, oder Sie möchten die Vorlage möglicherweise mit einer anderen Person teilen, damit diese sie mit ihren verwenden kann AWS-Konto. 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 Eingabeparameter verweisen, die bei der Erstellung des Stacks angegeben wurden. Die folgende Vorlage fügt einen Parameters
Abschnitt hinzu, der den KeyName
Parameter enthält, der verwendet wird, um die KeyName
Eigenschaft für die AWS::EC2::Instance
Ressource 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 praktisch, wenn der Parameter oder der zurückgegebene Wert für eine Ressource genau Ihren Wünschen entspricht. Möglicherweise benötigen Sie jedoch andere Attribute einer Ressource. Wenn Sie beispielsweise eine CloudFront Distribution mit einem S3-Ursprung erstellen möchten, müssen Sie den Bucket-Standort mithilfe einer Adresse im DNS-Stil angeben. Eine Reihe von Ressourcen haben zusätzliche Attribute, deren Werte Sie in Ihrer Vorlage verwenden können. Um diese Attribute zu erhalten, verwenden Sie die Funktion Fn:: GetAtt. Die folgende Vorlage erstellt eine CloudFront Verteilungsressource, die den DNS-Namen einer S3-Bucket-Ressource angibt, wobei die Fn::GetAtt
Funktion verwendet wird, um das DomainName
Bucket-Attribut 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 benötigt 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 deklarieren Parameter im Parameters
Abschnitt einer Vorlage. Ein Parameter enthält eine Liste von Attributen, die seinen Wert sowie Einschränkungen für diesen Wert definieren. Das einzige erforderliche Attribut istType
, String
Number
, oder ein AWS-spezifischer Typ. Sie können auch ein Description
Attribut hinzufügen, das beschreibt, welche Art von Wert Sie angeben sollten. Der Name und die Beschreibung des Parameters werden auf der Seite „Parameter angeben“ angezeigt, wenn Sie die Vorlage im Assistenten zum Erstellen von Stacks verwenden.
Das folgende Vorlagenfragment ist ein Parameters
Abschnitt, der die auf der Seite „Parameter angeben“ verwendeten Parameter deklariert.
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
CloudFormation Verwendet für Parameter mit Standardwerten die Standardwerte, sofern Benutzer keinen anderen Wert angeben. 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. Ist dies nicht der Fall, CloudFormation schlägt die Erstellung des Stacks fehl und es wird eine Ausnahme ausgelöst:
Parameters: [KeyName] must have values
Bei AWS-spezifischen Parametertypen werden Eingabewerte anhand vorhandener Werte im Benutzer AWS-Konto und in der Region, in der der Stack erstellt wird, CloudFormation validiert, 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 anderes Beispiel für einen AWS-spezifischen Parametertyp istAWS::EC2::VPC::Id
, bei dem Benutzer eine gültige VPC-ID angeben müssen. Zusätzlich zur Vorabvalidierung zeigt die AWS Konsole eine Dropdownliste mit gültigen Werten für AWS-spezifische Parametertypen an, z. B. gültige EC2-Schlüsselpaarnamen oder VPC-IDs, wenn Benutzer den Create Stack Wizard 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
, wird der als Sternchen (*****) maskierte Parameterwert für alle Aufrufe CloudFormation zurückgegeben, die den Stack oder die Stack-Ereignisse beschreiben, mit Ausnahme von 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:
-
Der Vorlagenbereich.
Metadata
CloudFormation transformiert, modifiziert oder redigiert keine Informationen, die Sie in denMetadata
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 Parameterspeicher oder. AWS Secrets Manager
Weitere Informationen finden Sie unter Keine Anmeldeinformationen in Vorlagen einbetten Best Practice.
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 Vorlagenfunktionen, die helfen können: den Mappings
Abschnitt und den AWS::Region
Pseudo-Parameter.
Der AWS::Region
Pseudo-Parameter ist ein Wert, der als Region CloudFormation aufgelöst wird, in der der Stapel erstellt wird. Pseudo-Parameter werden aufgelöst, CloudFormation wenn Sie den Stack erstellen. 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 einen Mappings
Abschnitt mit einer Zuordnung namensRegionMap
, 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 RegionMap
ist jede Region einem Name-Wert-Paar zugeordnet. Das Name-Wert-Paar ist ein Etikett und der Zuweisungswert. In der RegionMap
ist AMI das Label und die AMI-ID ist der Wert. Um einen Wert mithilfe einer Map zurückzugeben, verwenden Sie die FindInMap Funktion Fn:: und übergeben dabei den Namen der Map, den Wert, mit dem der zugeordnete Wert gesucht wurde, und die Bezeichnung des zugewiesenen Werts, den Sie zurückgeben möchten. Im obigen Beispiel Ec2Instance
verwendet die ImageId
Eigenschaft der Ressource die Fn::FindInMap
Funktion, um ihren Wert zu bestimmen, indem sie RegionMap
als zu verwendende Map, AWS::Region
als Eingabewert für die Zuordnung und AMI als Label zur Identifizierung des Werts angibt, dem zugeordnet werden soll. Wenn diese Vorlage beispielsweise zur Erstellung eines Stacks in der Region USA West (Nordkalifornien) verwendet ImageId
würde, wäre sie auf gesetztami-655a0a20
.
Tipp
Mit dem AWS::Region
-Pseudoparameter können Sie die Region herausfinden, in welcher der Stack erstellt wird. Einige Ressourcen, wieAWS::EC2::Instance
, undAWS::AutoScaling::AutoScalingGroup
, verfügen über eine EigenschaftAWS::ElasticLoadBalancing::LoadBalancer
, die Verfügbarkeitszonen 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 WordPress Vorlagenfragment erstellt die Fn::Join
Funktion beispielsweise die Target
Untereigenschaft der HealthCheck
Eigenschaft für die ElasticLoadBalancer
Ressource, indem sie den WebServerPort
Parameter mit anderen Literalzeichenfolgen verkettet, 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 Fn::Join
Funktion verwendet zwei Parameter: ein Trennzeichen, das die Werte voneinander trennt, die Sie verketten möchten, und ein Array von Werten in der Reihenfolge, in der sie angezeigt werden sollen. Im obigen Beispiel gibt die Fn::Join
Funktion eine leere Zeichenfolge als Trennzeichen und HTTP:, den Wert des WebServerPort
Parameters, und ein/-Zeichen als die zu verkettenden Werte an. Bei WebServerPort
einem Wert von 8888 würde die Target
Eigenschaft auf den folgenden Wert gesetzt:
HTTP:8888/
Weitere Informationen zur Funktion Fn::Join
finden Sie unter Fn::Join.
Die Fn::Join
Funktion ist auch nützlich, um Ausgabewerte für den Stack zu deklarieren. Der Outputs
Abschnitt in der Vorlage enthält Deklarationen für die Werte, die nach der Erstellung des Stacks verfügbar sein sollen. Eine Ausgabe ist eine praktische Möglichkeit zum Erfassen wichtiger Informationen über Ihre Ressourcen oder Eingabeparameter. Beispielsweise könnten wir die folgenden Ausgaben für eine Vorlage deklarieren, die eine WordPress Site erstellt.
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 Value
Attribut, das die Deklaration des als Ausgabewert zurückgegebenen Werts enthält, und optional eine Beschreibung des Werts. Im vorherigen Beispiel InstallURL
ist die Zeichenfolge, die von einem Fn::Join
Funktionsaufruf zurückgegeben wurde, der den DNS-Namen der Ressource ElasticLoadBalancer
verkettethttp://
, und. /wp-admin/install.php
Der Ausgabewert sollte folgendermaßen oder ähnlich aussehen:
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.
aws-region
.elb.amazonaws.com/wp-admin/install.php
Nachdem wir unseren Stack erstellt haben, können wir diesen Link verwenden, um zur Installationsseite für den WordPress Blog zu gelangen, den wir erstellt haben. CloudFormation generiert die Ausgabewerte, nachdem die Erstellung des Stacks abgeschlossen ist. Sie können Ausgabewerte auf der Outputs
Registerkarte der CloudFormation Konsole oder mithilfe des describe-stacks CLI-Befehls anzeigen.
Weitere Informationen
Wir sind die grundlegenden Aspekte einer Vorlage und ihre Verwendung durchgegangen.
Wir haben zwei Abschnitte der obersten Ebene in einer Vorlage nicht behandelt: AWSTemplateFormatVersion
undDescription
.
AWSTemplateFormatVersion
ist einfach die Version des Vorlagenformats. Wenn Sie es nicht angeben, CloudFormation wird die neueste Version verwendet. Weitere Informationen finden Sie unter Formatversion.
Das Description
ist eine gültige JSON- oder YAML-Zeichenfolge. Diese Beschreibung wird auf der Seite „Parameter angeben“ des Assistenten „Stack erstellen“ angezeigt. Weitere Informationen finden Sie unter Beschreibung.
Natürlich gibt es erweiterte Vorlagen- und Stack-Features. Hier finden Sie eine Liste ein paar der wichtigen Funktionen, die Sie interessieren werden:
-
DependsOn— Verwenden Sie dieses Attribut, um anzugeben, dass eine Ressource nach der anderen erstellt werden muss.
-
DeletionPolicy— Verwenden Sie dieses Attribut, um anzugeben, wie mit dem Löschen einer Ressource umgegangen werden CloudFormation soll.
-
Metadata— Verwenden Sie dieses Attribut, um strukturierte Daten mit einer Ressource anzugeben.