Schrittweiser Walkthrough: Aktualisierung eines Stacks - 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.

Schrittweiser Walkthrough: Aktualisierung eines Stacks

Mit CloudFormation können Sie die Eigenschaften für Ressourcen in Ihren vorhandenen Stacks aktualisieren. Diese Änderungen können von einfachen Konfigurationsänderungen wie der Aktualisierung des Alarmschwellenwerts bei einem CloudWatch Alarm bis hin zu komplexeren Änderungen wie der Aktualisierung des Amazon Machine Image (AMI) reichen, das auf einer Amazon EC2 EC2-Instance ausgeführt wird. Viele der AWS Ressourcen in einer Vorlage können aktualisiert werden, und wir fügen weiterhin Unterstützung für weitere hinzu.

Dieser Abschnitt führt Sie durch eine einfache Verarbeitung von Aktualisierungen für einen ausgeführten Stack. Es zeigt, wie die Verwendung von Vorlagen es ermöglicht, ein Versionskontrollsystem für die Konfiguration Ihrer AWS Infrastruktur zu verwenden, genauso wie Sie die Versionskontrolle für die Software verwenden, die Sie ausführen. Wir führen Sie durch die folgenden Schritte:

  1. Erstellen des anfänglichen Stack— Erstellen Sie einen Stack mit einem Amazon Linux-Basisami, installieren Sie den Apache Web Server und eine einfache PHP-Anwendung mithilfe der CloudFormation Hilfsskripte.

  2. Aktualisieren der Anwendung— Aktualisieren Sie eine der Dateien in der Anwendung und stellen Sie die Software mithilfe von bereit CloudFormation.

  3. Aktualisieren des Instance-Typs – Änderung des Instance-Typs der zugrundeliegenden Amazon EC2 Instance.

  4. Aktualisieren der AMI auf einer Amazon EC2 Instance – Änderung des Amazon Machine Images (AMI) für die Amazon-EC2-Instance in Ihrem Stack.

  5. Hinzufügen eines Schlüsselpaares zu einer Instance – Hinzufügen eines Amazon-EC2-Schlüsselpaars zur Instance und anschließende Aktualisierung der Sicherheitsgruppe für den SSH-Zugriff auf die Instance.

  6. Ändern der Stack-Ressourcen – Hinzufügen und Entfernen von Instances zum und aus dem Stack sowie Umwandlung in eine automatisch skalierte und ausgeglichene Anwendung durch Aktualisierung der Vorlage.

Eine einfache Anwendung

Wir beginnen mit der Erstellung eines Stack, den wir für den Rest dieses Abschnitts verwenden können. Wir habe eine Beispielvorlage bereitgestellt, mit der eine PHP-Webanwendung mit einzelner Instance auf einem Apache Web Server gehostet und auf einer Amazon Linux AMI ausgeführt wird.

Der Apache Web Server, PHP und die einfache PHP-Anwendung werden alle durch die CloudFormation Hilfsskripte installiert, die standardmäßig auf dem Amazon Linux AMI installiert sind. Der folgenden Vorlagenausschnitt zeigt die Metadaten, die die zu installierenden Pakete und Dateien beschreiben, in diesem Fall den Apache Web Server und die PHP-Infrastruktur aus dem Yum-Repository für die Amazon Linux AMI. Der Ausschnitt zeigt auch den Abschnitt „Services”, der gewährleistet, dass der Apache Web Server ausgeführt wird. Im Abschnitt Eigenschaften der Amazon EC2 EC2-Instance-Definition enthält die UserData Eigenschaft das CloudInit Skript, das cfn-init aufruft, um die Pakete und Dateien zu installieren.

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo '<p>", { "Ref" : "WelcomeMessage" }, "</p>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, }, : "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } } }, "Properties": { : "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "yum install -y aws-cfn-bootstrap\n", : "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", : ]]}} } },

Die Anwendung selbst ist ein zweizeiliges Beispiel mit „Hello World”, das innerhalb der Vorlage vollständig definiert ist. Bei einer realen Anwendung können die Dateien auf Amazon S3 oder einem anderen Repository gespeichert und in der Vorlage referenziert werden. GitHub CloudFormation kann Pakete (wie RPMs oder RubyGems) herunterladen und auf einzelne Dateien verweisen und Dateien erweitern.zip, um die Anwendungsartefakte auf der Amazon EC2 EC2-Instance zu erstellen. .tar

Die Vorlage ermöglicht und konfiguriert den Daemon „cfn-hup” so, dass dieser auf Änderungen an der Konfiguration empfängt, die in den Metadaten für die Amazon EC2 Instance festgelegt sind. Mithilfe des cfn-hup-Daemons können Sie Anwendungssoftware aktualisieren, z. B. die Version von Apache oder PHP, oder Sie können die PHP-Anwendungsdatei selbst von aktualisieren. CloudFormation Der folgende Codeausschnitt aus derselben Amazon EC2-Ressource in der Vorlage zeigt die Teile, die benötigt werden, um „cfn-hup” so zu konfigurieren, dass sobald eine Änderung der Metadaten erkannt wird, zur Aktualisierung „cfn-init” ausgelöst wird:

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { : "files" : { : "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackName" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, : }, "Properties": { : "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ : "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", : ]]}} } },

Zur Vervollständigung des Stack erstellt die Vorlage eine Amazon EC2-Sicherheitsgruppe.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT5M" } } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]] } } } }

In diesem Beispiel wird eine einzelne Amazon EC2 EC2-Instance verwendet, aber Sie können dieselben Mechanismen für komplexere Lösungen verwenden, die Elastic Load Balancing und Amazon EC2 Auto Scaling Gruppen verwenden, um eine Sammlung von Anwendungsservern zu verwalten. Es gibt jedoch einige spezielle Überlegungen für Auto-Scaling-Gruppen. Weitere Informationen finden Sie unter Aktualisieren von Auto-Scaling-Gruppen.

Erstellen des anfänglichen Stack

In diesem Beispiel verwenden wir die, AWS Management Console um einen ersten Stack aus der Beispielvorlage zu erstellen.

Warnung

Wenn Sie dieses Verfahren abschließen, werden AWS Live-Dienste bereitgestellt. Ihnen werden die Standard-Nutzungspreise berechnet, solange diese Services ausgeführt werden.

Um den Stapel aus dem zu erstellen AWS Management Console
  1. Kopieren Sie die vorherige Vorlage und speichern Sie sie lokal auf Ihrem System als Textdatei. Notieren Sie sich den Speicherort, denn Sie benötigen die Datei in einem späteren Schritt.

  2. Melden Sie sich bei der CloudFormation Konsole unter https://console.aws.amazon.com/cloudformation an.

  3. Wählen Sie Create New Stack.

  4. Geben Sie im Assistenten Create New Stack auf dem Bildschirm Select Template UpdateTutorial in das Feld Name ein. Wählen Sie auf derselben Seite Upload a template to Amazon S3 (Eine Vorlage in Amazon S3 hochladen) aus, navigieren Sie zu der Datei, die Sie im ersten Schritt heruntergeladen haben, und klicken Sie dann auf Next (Weiter).

  5. Geben Sie auf dem Bildschirm Specify Parameters in das Feld Instance Type t1.micro ein. Wählen Sie anschließend Weiter.

  6. Wählen Sie auf dem Bildschirm Options (Optionen) die Option Next (Weiter) aus.

  7. Überprüfen Sie auf dem Bildschirm Review (Überprüfen) die eingegebenen Einstellungen und wählen Sie anschließend Create (Erstellen) aus.

Nachdem der Status Ihres Stack zu CREATE_COMPLETE geändert wurde, zeigt die Ausgabe- Registerkarte die URL Ihrer Website an. Wenn Sie den Wert der WebsiteURL-Ausgabe auswählen, sehen Sie Ihre neue PHP-Anwendung im Einsatz.

Aktualisieren der Anwendung

Jetzt, da wir den Stack bereitgestellt haben, wollen wir die Anwendung aktualisieren. Wir nehmen eine einfache Änderung am Text vor, der durch die Anwendung ausgedruckt wird. Dazu fügen wir wie in diesem Vorlagenausschnitt dargestellt einen Echo-Befehl in die index.php-Datei ein:

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { : "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo '<p>Updated version via UpdateStack</p>';\n ", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, : } },

Verwenden Sie einen Text-Editor, um die Vorlagendatei, die Sie lokal gespeichert haben, zu bearbeiten.

Nun aktualisieren wir den Stack.

Um den Stack von der zu aktualisieren AWS Management Console
  1. Melden Sie sich bei der CloudFormation Konsole an unter: https://console.aws.amazon.com/cloudformation.

  2. Wählen Sie im CloudFormation Dashboard den Stack aus, den Sie zuvor erstellt haben, und wählen Sie dann Stack aktualisieren aus.

  3. Wählen Sie im Assistenten Update Stack (Stack aktualisieren) auf dem Bildschirm Select Template (Vorlage auswählen) Upload a template to Amazon S3 (Eine Vorlage in Amazon S3 hochloaden) aus, wählen Sie die geänderte Vorlage aus und dann Next (Weiter).

  4. Wählen Sie auf dem Bildschirm Options (Optionen) die Option Next (Weiter) aus.

  5. Wählen Sie Next (Weiter) aus, da der Stack über keine Richtlinie verfügt. Alle Ressourcen können ohne überschreibende Richtlinie aktualisiert werden.

  6. Überprüfen Sie auf dem Bildschirm Review (Überprüfen) die eingegebenen Einstellungen, und wählen Sie anschließend Update (Aktualisieren) aus.

Wenn Sie den Stack von aus aktualisieren AWS Management Console, werden Sie feststellen, dass die Parameter, die zur Erstellung des ersten Stacks verwendet wurden, auf der Seite „Parameter“ des Assistenten „Stack aktualisieren“ bereits ausgefüllt sind. Wenn Sie den aws cloudformation update-stack-Befehl verwenden, geben Sie dieselben Werte für die Parameter ein, die Sie ursprünglich für die Erstellung des Stack verwendet haben.

Sobald Ihr Stapel den Zustand UPDATE_COMPLETE erreicht, können Sie erneut den WebsiteURL-Ausgabewert auswählen und prüfen, ob die Änderungen an Ihrer Anwendung in Kraft getreten sind. Standardmäßig wird die „cfn-hup”-Daemon alle 15 Minuten ausgeführt. Es kann bis zu 15 Minuten bis zur Änderung der Anwendung dauern, nachdem der Stapel aktualisiert wurde.

Um zu sehen, welche Ressourcen aktualisiert wurden, rufen Sie die CloudFormation Konsole auf. Betrachten Sie auf der Registerkarte Events die Stack-Ereignisse. In diesem speziellen Fall wurden die Metadaten für die Amazon EC2 EC2-Instance WebServerInstance aktualisiert, was CloudFormation dazu führte, dass auch die anderen Ressourcen (WebServerSecurityGroup) neu bewertet wurden, um sicherzustellen, dass keine weiteren Änderungen vorgenommen wurden. Keine der anderen Stack-Ressourcen wurde geändert. CloudFormation aktualisiert nur die Ressourcen im Stack, die von Änderungen am Stack betroffen sind. Solche Änderungen können direkt sein, wie etwa Eigenschafts- oder Metadatenänderungen, oder sie können auf Abhängigkeiten oder Datenflüsse durch Ref GetAtt, oder andere systeminterne Vorlagenfunktionen zurückzuführen sein.

Dieses einfache Update zeigt den Prozess. Sie können jedoch viel komplexere Änderungen an den Dateien und Paketen, die Ihren Amazon EC2 Instances bereitgestellt werden, vornehmen. Sie können der Instance beispielsweise eine MySQL Instance und den PHP-Support für MySQL hinzufügen. Hierzu fügen Sie einfach die zusätzlichen Pakete und Dateien sowie die zusätzlichen Services für die Konfiguration ein und aktualisieren den Stack, um die Änderungen bereitzustellen. Im folgenden Vorlagenausschnitt sind die Änderungen rot hervorgehoben:

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [], "php-mysql" : [], "mysql-server" : [], "mysql-libs" : [], "mysql" : [] } }, : "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]}, "mysqld" : { "enabled" : "true", "ensureRunning" : "true" } } } } } }, "Properties": { : } }

Sie können die CloudFormation Metadaten aktualisieren, um sie auf neue Versionen der von der Anwendung verwendeten Pakete zu aktualisieren. In den vorherigen Beispielen ist die Versionseigenschaft der einzelnen Pakete leer. Dies bedeutet, dass „cfn-init” die neueste Version des Pakets installieren sollte.

"packages" : { "yum" : { "httpd" : [], "php" : [] }

Sie können optional eine Versionszeichenfolge für ein Paket festlegen. Wenn Sie die Versionszeichenfolge nachfolgenden Stack-Aktualisierungsaufrufen ändern, wird die neue Version des Pakets bereitgestellt. Hier ist ein Beispiel für die Verwendung von Versionsnummern für RubyGems Pakete. Alle Pakete, die Versioning unterstützen, können bestimmte Versionen haben.

"packages" : { "rubygems" : { "mysql" : [], "rubygems-update" : ["1.6.2"], "rake" : ["0.8.7"], "rails" : ["2.3.11"] } }

Aktualisieren von Auto-Scaling-Gruppen

Wenn Sie in Ihrer Vorlage Auto Scaling Scaling-Gruppen und nicht Amazon EC2 EC2-Instance-Ressourcen verwenden, funktioniert die Aktualisierung der Anwendung genauso, bietet jedoch CloudFormation keine Synchronisation oder Serialisierung zwischen den Amazon EC2 EC2-Instances in einer Auto Scaling Scaling-Gruppe. Der „cfn-hup”-Daemon auf den einzelnen Hosts wird unabhängig ausgeführt und aktualisiert die Anwendung nach einem eigenen Zeitplan. Wenn Sie „cfn-hup” verwenden, um die Konfiguration einer Instance zu aktualisieren, führt jede Instance die „cfn-hup”-Hooks nach einem eigenen Zeitplan aus; es gibt dann keine Koordination zwischen den Instances im Stack. Beachten Sie Folgendes:

  • Wenn die „cfn-hup”-Änderungen auf alle Amazon EC2 Instances in der Auto-Scaling-Gruppe gleichzeitig ausgeführt werden, ist Ihr Service während einer Aktualisierung möglicherweise nicht verfügbar.

  • Wenn die „cfn-hup”-Änderungen zu verschiedenen Zeiten ausgeführt werden, werden möglicherweise alte und neue Versionen der Software gleichzeitig ausgeführt.

Um diese Probleme zu vermeiden, sollten Sie ein fortlaufendes Update für Ihre Instances in einer Auto-Scaling-Gruppe erzwingen. Weitere Informationen finden Sie unter UpdatePolicy Attribut.

Ändern von Ressourceneigenschaften

Mit CloudFormation können Sie die Eigenschaften einer vorhandenen Ressource im Stack ändern. In den folgenden Abschnitten werden die verschiedenen Aktualisierungen beschrieben, die spezifische Probleme lösen. Es kann jedoch jede Eigenschaft jeder Ressource nach Bedarf geändert werden, die eine Aktualisierung im Stack unterstützt.

Aktualisieren des Instance-Typs

Der Stack, den wir bisher erstellt haben, verwendet eine Amazon-EC2-Instance des Typs „t1.micro”. Nehmen wir an, dass Ihre neu erstellte Website mehr Datenverkehr erhält, als eine t1.micro-Instance verarbeiten kann, und Sie möchten nun eine Amazon-EC2-Instance des Typs „m1.small” verwenden. Wenn sich die Architektur des Instance-Typs ändert, wird die Instance mit einer anderen AMI erstellt. Wenn Sie die Zuweisungen in der Vorlage prüfen, werde Sie feststellen, dass sowohl „t1.micro” als auch „m1.small” über dieselben Architekturen verfügen und dieselben Amazon Linux AMIs verwenden.

"Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} }

Verwenden wir die Vorlage, die wir im vorherigen Schritt geändert haben, um den Instance-Typ zu ändern. Da InstanceType es sich um einen Eingabeparameter für die Vorlage handelte, müssen wir die Vorlage nicht ändern. Wir können den Wert des Parameters im Stack-Aktualisierungsassistenten auf der Seite „Parameter angeben“ ändern.

So aktualisieren Sie den Stack aus AWS Management Console
  1. Melden Sie sich unter https://console.aws.amazon.com/cloudformation bei der CloudFormation Konsole an.

  2. Wählen Sie im CloudFormation Dashboard den Stack aus, den Sie zuvor erstellt haben, und wählen Sie dann Stack aktualisieren aus.

  3. Wählen Sie im Assistenten Update Stack (Stack aktualisieren) auf dem Bildschirm Select Template (Vorlage auswählen) Use current template (Aktuelle Vorlage verwenden) aus und dann Next (Weiter).

    Die Seite zum Festlegen der Details wird mit den Parametern angezeigt, die zum Erstellen des anfänglichen Stack verwendet wurden; die Werte sind im Abschnitt Specify Parameters bereits eingetragen.

  4. Ändern Sie den Wert des InstanceTypeTextfeldes von t1.micro zum1.small. Wählen Sie anschließend Weiter.

  5. Wählen Sie auf dem Bildschirm Options (Optionen) die Option Next (Weiter) aus.

  6. Wählen Sie Next (Weiter) aus, da der Stack über keine Richtlinie verfügt. Alle Ressourcen können ohne überschreibende Richtlinie aktualisiert werden.

  7. Überprüfen Sie auf dem Bildschirm Review (Überprüfen) die eingegebenen Einstellungen, und wählen Sie anschließend Update (Aktualisieren) aus.

Sie können den Instance-Typ einer EBS-gestützten Amazon EC2 EC2-Instance dynamisch ändern, indem Sie die Instance starten und stoppen. CloudFormation versucht, die Änderung zu optimieren, indem der Instance-Typ aktualisiert und die Instance neu gestartet wird, sodass sich die Instance-ID nicht ändert. Wird die Instance jedoch neu gestartet, ändert sich die öffentliche IP-Adresse der Instance. Um sicherzustellen, dass die Elastic IP-Adresse nach der Änderung korrekt gebunden ist, CloudFormation wird auch die Elastic IP-Adresse aktualisiert. Sie können die Änderungen in der CloudFormation Konsole auf der Registerkarte Ereignisse sehen.

Um den Instance-Typ von zu überprüfen AWS Management Console, öffnen Sie die Amazon EC2 EC2-Konsole und suchen Sie dort Ihre Instance.

Aktualisieren der AMI auf einer Amazon EC2 Instance

Betrachten wir nun, wie wir das Amazon Machine Image (AMI) ändern können, das auf der Instance ausgeführt wird. Wir initiieren die AMI-Änderung, indem wir den Stack so aktualisieren, dass ein neuer Amazon EC2 Instance-Typ wie t2.medium (ein HVM64 Instance-Typ) verwendet wird.

Wir verwenden wie im vorherigen Abschnitt unsere vorhandene Vorlage, um den Instance-Typ mit unserem Beispiel-Stack zu ändern. Ändern Sie im Stack-Aktualisierungsassistenten auf der Seite „Specify Parameters” den Wert des Instance-Typs.

In diesem Fall können wir die Instance nicht einfach starten und stoppen, um das AMI zu ändern; CloudFormation betrachtet dies als Änderung einer unveränderlichen Eigenschaft der Ressource. Um eine unveränderliche Eigenschaft zu ändern, CloudFormation muss eine Ersatzressource gestartet werden, in diesem Fall eine neue Amazon EC2 EC2-Instance, auf der das neue AMI ausgeführt wird.

Nachdem die neue Instance ausgeführt wurde, werden die anderen Ressourcen im Stack so CloudFormation aktualisiert, dass sie auf die neue Ressource verweisen. Wenn alle neuen Ressourcen erstellt wurden, wird die alte Ressource gelöscht. Dieser Vorgang wird als bezeichnetUPDATE_CLEANUP. Dieses Mal werden Sie feststellen, dass sich Instance-ID und Anwendungs-URL der Instance im Stack infolge der Aktualisierung geändert haben. Die Ereignisse in der Event-Tabelle enthalten die Beschreibung „Requested update has a change to an immutable property and hence creating a new physical resource”, um anzugeben, dass eine Ressource ersetzt wurde.

Wenn in das AMI, das Sie aktualisieren möchten, Anwendungscode geschrieben wurde, können Sie zum Aktualisieren des AMI und zum Laden Ihrer neuen Anwendung denselben Stack-Aktualisierungsmechanismus verwenden.

So aktualisieren Sie das AMI für eine Instance in Ihrem Stack
  1. Erstellen Sie Ihre neuen AMIs mit Ihrer Anwendung oder den Betriebssystemänderungen. Weitere Informationen finden Sie unter Creating Your Own AMIs im Amazon EC2 EC2-Benutzerhandbuch.

  2. Aktualisieren Sie Ihre Vorlage, um die neuen AMI-IDs zu verwenden.

  3. Aktualisieren Sie den Stack, entweder AWS Management Console wie unter erklärt Aktualisieren der Anwendung oder mithilfe des AWS Befehls aws cloudformation update-stack.

Wenn Sie den Stack aktualisieren, wird CloudFormation erkannt, dass sich die AMI-ID geändert hat, und löst dann ein Stack-Update auf dieselbe Weise aus, wie wir das obige initiiert haben.

Aktualisieren der Amazon EC2-Startkonfiguration für eine Auto-Scaling-Gruppe

Wenn Sie Auto-Scaling-Gruppen anstatt Amazon EC2 Instances verwenden, werden die ausgeführten Instances etwas anders aktualisiert. Mit Auto Scaling-Ressourcen wird die Konfiguration der Amazon EC2 Instances, wie der Instance-Typ oder die AMI-ID, in der Auto Scaling-Startkonfiguration verkapselt. Sie können an der Startkonfiguration auf dieselbe Weise Änderungen vornehmen wie an den Amazon EC2 Instance-Ressourcen in den vorherigen Abschnitten. Das Ändern der Startkonfiguration wirkt sich jedoch nicht auf die ausgeführten Amazon EC2 Instances in der Auto-Scaling-Gruppe aus. Eine aktualisierte Startkonfiguration gilt nur für neue Instances, die nach der Aktualisierung erstellt werden.

Wenn Sie möchten, dass die Änderung für alle Instances in Ihrer Auto-Scaling-Gruppe auf Ihre Startkonfiguration übernommen wird, verwenden Sie ein Aktualisierungsattribut. Weitere Informationen finden Sie unter UpdatePolicy Attribut.

Hinzufügen von Ressourceneigenschaften

Bis jetzt haben wir das Ändern von vorhandenen Eigenschaften einer Ressource in einer Vorlage angeschaut. Sie können auch Eigenschaften hinzufügen, die ursprünglich nicht in der Vorlage angegeben waren. Um dies zu veranschaulichen, werden wir ein Amazon EC2-Schlüsselpaar zu einer vorhandenen EC2 Instance hinzufügen und Port 22 in der Amazon EC2-Sicherheitsgruppe öffnen, sodass Sie mithilfe von Secure Shell (SSH) auf die Instance zugreifen können.

Hinzufügen eines Schlüsselpaares zu einer Instance

So fügen Sie für eine vorhandene Amazon EC2 Instance eine SSH-Zugriffsberechtigung hinzu
  1. Fügen Sie in der Vorlage zwei zusätzliche Parameter für den Namen eines vorhandenen Amazon EC2-Schlüsselpaars und eines SSH-Standorts hinzu.

    "Parameters" : { "KeyName" : { "Description" : "Name of an existing Amazon EC2 key pair for SSH access", "Type": "AWS::EC2::KeyPair::KeyName" }, "SSHLocation" : { "Description" : " The IP address range that can be used to SSH to the EC2 instances", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } : },
  2. Fügen Sie die KeyName Eigenschaft der Amazon EC2 EC2-Instance hinzu.

    "WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { : "KeyName" : { "Ref" : "KeyName" }, : } },
  3. Fügen Sie Port 22 und den SSH-Speicherort den Regeln für eingehenden Datenverkehr der Amazon EC2-Sicherheitsgruppe hinzu.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP and SSH", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}}, {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } },
  4. Aktualisieren Sie den Stack, entweder AWS Management Console wie unter erklärt Aktualisieren der Anwendung oder mithilfe des AWS Befehls aws cloudformation update-stack.

Ändern der Stack-Ressourcen

Die Anforderungen der Anwendung können sich im Laufe der Zeit ändern, CloudFormation sodass Sie den Satz von Ressourcen, aus denen der Stack besteht, ändern können. Um dies zu veranschaulichen, nehmen wir die einzelne Instance-Anwendung aus Hinzufügen von Ressourceneigenschaften und konvertieren Sie durch Aktualisierung des Stacks in eine automatisch skalierte, lastenverteilte Anwendung.

So erstellen Sie eine einfache, einzelne Instance-PHP-Anwendung mit einer Elastic IP-Adresse. Wir werden die Anwendung nun in eine hochverfügbare, automatisch skalierte und lastverteilte Anwendung verwandeln, indem wir ihre Ressourcen während der Aktualisierung ändern.

  1. Fügen Sie eine Elastic Load Balancer-Ressource hinzu.

    "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }
  2. Konvertieren Sie die EC2 Instance in der Vorlage in eine Auto Scaling-Startkonfiguration. Die Eigenschaften sind identisch, sodass wir nur die Typennamen ändern müssen:

    "WebServerInstance": { "Type" : "AWS::EC2::Instance",

    auf:

    "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration",

    Aus Gründen der Übersichtlichkeit in der Vorlage haben wir den Namen der Ressource von WebServerInstancein geändert LaunchConfig, sodass Sie den Ressourcennamen, auf den cfn-init und cfn-hup verweisen, aktualisieren müssen (suchen Sie einfach nach WebServerInstance und ersetzen Sie ihn durch, außer cfn-signal). LaunchConfig Für cfn-signal müssen Sie die Auto Scaling Scaling-Gruppe (WebServerGroup) signalisieren, nicht die Instanz, wie im folgenden Snippet gezeigt:

    "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n"
  3. Fügen Sie eine Auto-Scaling-Gruppe-Ressource hinzu.

    "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }
  4. Aktualisieren Sie die Sicherheitsgruppendefinition, um den Datenverkehr vom Load Balancer an die Instances zu sperren.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]}, "SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } }
  5. Aktualisieren Sie die Ausgabewerte, um den DNS-Namen des Elastic Load Balancer als Speicherort der Anwendung auszugeben:

    "WebsiteURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]]}, "Description" : "Application URL" }

    auf:

    "WebsiteURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]]}, "Description" : "Application URL" }

Das folgende Beispiel zeigt die vollständige Vorlage als Referenz. Wenn Sie diese Vorlage verwenden, um den Stack zu aktualisieren, verwandeln Sie Ihre einfache, einzelne Instance-Anwendung in eine hoch verfügbare, Multi-AZ-Anwendung mit automatischer Skalierung und Lastausgleich. Nur die Ressourcen, die aktualisiert werden müssen, werden geändert. Alle weiteren Datenspeicher für diese Anwendung bleiben unverändert. Jetzt können Sie es verwenden, um Ihre Stacks CloudFormation zu erweitern oder zu verbessern, wenn sich Ihre Anforderungen ändern.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "SSHLocation" : { "Description" : " The IP address range that can be used to SSH to the EC2 instances", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." }, "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }, "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }, "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo 'Updated version via UpdateStack';\n ", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "KeyName" : { "Ref" : "KeyName" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]},"SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]] } } } }

Verfügbarkeit und Auswirkungen

Verschiedene Eigenschaften haben unterschiedliche Auswirkungen auf die Ressourcen im Stack. Sie können CloudFormation es verwenden, um jede Eigenschaft zu aktualisieren. Bevor Sie jedoch Änderungen vornehmen, sollten Sie die folgenden Fragen berücksichtigen:

  1. Wie wirkt sich die Aktualisierung auf die Ressource selbst aus? Durch die Aktualisierung eines Schwellenwerts für einen Alarm wird beispielswiese der Alarm während der Aktualisierung inaktiv. Wie wir gesehen haben, erfordert das Ändern des Instanztyps, dass die Instanz gestoppt und neu gestartet wird. CloudFormation verwendet die Aktualisierungs- oder Änderungsaktionen für die zugrunde liegenden Ressourcen, um Änderungen an Ressourcen vorzunehmen. Um die Auswirkung von Updates zu verstehen, sollten Sie die Dokumentation für die spezifischen Ressourcen einsehen.

  2. Ist die Änderung veränderlich oder unveränderlich? Einige Änderungen an Ressourceneigenschaften, z. B. das Ändern des AMI auf einer Amazon EC2 Instance, werden von den zugrundeliegenden Services nicht unterstützt. Bei veränderlichen Änderungen CloudFormation werden die APIs vom Typ Update oder Modify für die zugrunde liegenden Ressourcen verwendet. Bei unveränderlichen Eigenschaftsänderungen CloudFormation werden neue Ressourcen mit den aktualisierten Eigenschaften erstellt und diese dann mit dem Stack verknüpft, bevor die alten Ressourcen gelöscht werden. Obwohl CloudFormation versucht wird, die Ausfallzeit der Stack-Ressourcen zu reduzieren, ist das Ersetzen einer Ressource ein mehrstufiger Prozess, der einige Zeit in Anspruch nimmt. Während der Stack-Neukonfiguration ist Ihre Anwendung nicht voll betriebsbereit. Beispielsweise kann sie keine Anforderungen erfüllen oder auf eine Datenbank zugreifen.

Zugehörige Ressourcen

Weitere Informationen zur Verwendung CloudFormation zum Starten von Anwendungen und zur Integration mit anderen Konfigurations- und Bereitstellungsdiensten wie Puppet und Opscode Chef finden Sie in den folgenden Whitepapers:

Bei der in diesem Abschnitt verwendeten Vorlage handelt es sich um eine „Hello World”-PHP-Anwendung. Die Vorlagenbibliothek enthält auch eine ElastiCache Amazon-Beispielvorlage, die zeigt, wie eine PHP-Anwendung ElasticCache mithilfe von cfn-hup und cfn-init integriert werden kann, um auf Änderungen in der Amazon ElastiCache Cache-Cluster-Konfiguration zu reagieren, die alle von Update Stack ausgeführt werden können.