Schrittweiser Walkthrough: Aktualisierung eines Stacks - AWS CloudFormation

Schrittweiser Walkthrough: Aktualisierung eines Stacks

Mit AWS CloudFormation können Sie die Eigenschaften für Ressourcen in Ihren bestehenden Stacks aktualisieren. Diese Änderungen können einfach Konfigurationsänderungen sein, beispielsweise die Aktualisierung des Schwellenwerts für einen CloudWatch-Alarm, oder komplexerer Art sein, beispielsweise die Aktualisierung des Amazon Machine Image (AMI), das auf einer Amazon EC2 Instance ausgeführt wird. Viele der AWS-Ressourcen in einer Vorlage können aktualisiert werden, und wir bieten stets neuen Support für weitere Ressourcen.

Dieser Abschnitt führt Sie durch eine einfache Verarbeitung von Aktualisierungen für einen ausgeführten Stack. Sie erfahren, wie Sie unter Verwendung von Vorlagen ein Versionskontrollsystem für die Konfiguration Ihrer AWS-Infrastruktur verwenden können, genau wie bei der Versionskontrolle für die Software, die Sie verwenden. Wir führen Sie durch die folgenden Schritte:

  1. Erstellen des anfänglichen Stack—Erstellung eines Stack mit einem grundlegenden Amazon Linux-AMI sowie Installation des Apache Web Server und einer einfachen PHP-Anwendung unter Verwendung der AWS CloudFormation-Hilfsskripte.

  2. Aktualisieren der Anwendung—Aktualisierung einer der Dateien in der Anwendung, und Bereitstellung der Software mittels 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-Systemabbild (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.

Apache Web Server, PHP und die einfache PHP-Anwendung wurden mithilfe der CloudFormation-Hilfsskripts installiert, die standardmäßig auf der 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 „Properties” der Amazon EC2 Instance-Definition enthält die UserData-Eigenschaft das CloudInit-Skript, das „cfn-init” zum Installieren der Pakete und Dateien auslöst.

"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 Beispiel mit zwei Zeilen im Stil „Hello, World”, das in der Vorlage vollständig definiert ist. Bei einer realen Anwendung können die Dateien in Amazon S3, GitHub oder einem anderen Repository gespeichert und aus der Vorlage referenziert werden. CloudFormation kann Pakete (wie RPMs oder RubyGems) herunterladen und auf einzelne Dateien verweisen und .zip- und .tar-Dateien erweitern, um die Anwendungsartefakte in der Amazon EC2-Instance zu erstellen.

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. Durch die Verwendung der „cfn-hup”-Daemon können Sie Anwendungssoftware wie die Version von Apache oder PHP oder die PHP-Anwendungsdatei selbst von AWS CloudFormation aktualisieren. 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" ]}]] } } } }

Dieses Beispiel verwendet eine einzelne Amazon EC2 Instance, aber Sie können dieselben Mechanismen auf mehr komplexere Lösungen anwenden, die Elastic Load Balancers und Auto Scaling-Gruppen zur Verwaltung einer Sammlung von Anwendungsservern verwenden. 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 und erstellen den anfänglichen Stack aus der Beispielvorlage.

Warnung

Mit diesem Verfahren werden Live-AWS-Services bereitgestellt. Ihnen werden die Standard-Nutzungspreise berechnet, solange diese Services ausgeführt werden.

So erstellen Sie den Stack aus 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 unter https://console.aws.amazon.com/cloudformation in der CloudFormation-Konsole 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 Next.

  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.

So aktualisieren Sie den Stack aus AWS Management Console

  1. Melden Sie sich an die AWS CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation an.

  2. Wählen Sie im AWS CloudFormation-Dashboard den Stack aus, den Sie zuvor erstellt haben, und klicken Sie dann auf Update Stack (Stack aktualisieren).

  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 aus der AWS Management Console aktualisieren, werden Sie feststellen, dass die Parameter, die zum Erstellen des anfänglichen Stack verwendet wurden, vorab auf der Seite Parameters des Update Stack-Assistenten eingetragen wurden. 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.

In der AWS CloudFormation-Konsole wird Ihnen die Ressourcengruppe angezeigt, die aktualisiert wurde. Betrachten Sie auf der Registerkarte Events die Stack-Ereignisse. In diesem Fall wurden die Metadaten für die Amazon EC2 Instance (WebServerInstance) aktualisiert, wodurch AWS CloudFormation auch die weitern Ressourcen (WebServerSecurityGroup) neu bewertet hat, um sicherzustellen, dass keine Änderungen vorgenommen wurden. Keine der anderen Stapelressourcen wurde modifiziert. AWS CloudFormation aktualisiert nur die Ressourcen im Stapel, die von Änderungen am Stapel betroffen sind. Solche Änderungen können direkte Änderungen wie Änderungen der Eigenschaften oder Metadaten sein, oder sie können aufgrund von Abhängigkeiten oder Datenströmen über Ref, GetAtt oder andere intrinsische Vorlagenfunktionen hervorgerufen werden.

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 auf neue Versionen der Pakete, die von der Anwendung verwendet werden, 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. Es folgt 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 anstelle von Amazon EC2 Instance-Ressourcen Auto Scaling-Gruppen in Ihrer Vorlage verwenden, erfolgt die Aktualisierung der Anwendung genauso. AWS CloudFormation stellt in einer Auto Scaling-Gruppe jedoch keine Synchronisierung oder Serialisierung über die Amazon EC2 Instances bereit. 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 AWS 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 EC2Instance 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 ein Eingabeparameter für die Vorlage war, müssen wir die Vorlage nicht ändern; wir können stattdessen den Wert des Parameters im Stack-Aktualisierungsassistenten auf der Seite zum Festlegen der Parameter ändern.

So aktualisieren Sie den Stack aus AWS Management Console

  1. Melden Sie sich an die AWS CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation an.

  2. Wählen Sie im CloudFormation-Dashboard den Stack aus, den Sie zuvor erstellt haben, und wählen Sie dann Update Stack (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 im Textfeld InstanceType von t1.micro in m1.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 vom EBS unterstützten Amazon EC2-Instance dynamisch ändern, indem Sie die Instance starten und stoppen. AWS CloudFormation versucht, die Änderung zu optimieren, indem es den Instance-Typ aktualisiert und die Instance neu startet, so dass 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 ordnungsgemäß gebunden ist, aktualisiert AWS CloudFormation auch die Elastic IP-Adresse. Sie können die Änderungen in der AWS CloudFormation-Konsole auf die Registerkarte für Ereignisse sehen.

Um den Instance-Typ über die AWS Management Console zu prüfen, öffnen Sie die Amazon 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 beenden, um das AMI zu ändern. AWS CloudFormation betrachtet dies als eine Änderung an einer unveränderlichen Eigenschaft der Ressource. Um eine Änderung an einer unveränderlichen Eigenschaft vorzunehmen, muss AWS CloudFormation eine Ersatz-Ressource starten, in diesem Fall eine neue Amazon EC2 Instance mit einem neuen AMI.

Sobald die neue Instance ausgeführt wird, aktualisiert AWS CloudFormation die anderen Ressourcen im Stack so, dass sie auf die neue Ressource verweisen. Sobald alle neuen Ressourcen erstellt sind, wird die alte Ressource gelöscht. Dieser Vorgang wird UPDATE_CLEANUP genannt. 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 Erstellen eigener AMIs in Amazon EC2-Benutzerhandbuch für Linux-Instances.

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

  3. Aktualisieren Sie den Stack entweder über die AWS Management Console wie unter Aktualisieren der Anwendung beschrieben oder mithilfe des AWS-Befehls aws cloudformation update-stack.

Wenn Sie den Stack aktualisieren, erkennt CloudFormation, dass die AMI-ID geändert wurde und initiiert dann auf dieselbe Weise wie im obigen Beispiel beschrieben eine Stack-Aktualisierung.

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 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 über die AWS Management Console wie unter Aktualisieren der Anwendung beschrieben oder mithilfe des AWS-Befehls aws cloudformation update-stack.

Ändern der Stack-Ressourcen

Anwendungsanforderungen können sich im Laufe der Zeit ändern, ermöglicht Ihnen AWS CloudFormation die Änderung mehrerer Ressourcen, die den Stack ausmachen. 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",

    Zur Deutlichkeit in der Vorlage haben wir den Namen der Ressource von WebServerInstance in LaunchConfig geändert, Sie müssen also den von „cfn-init” und „cfn-hup” referenzierten Ressourcennamen aktualisieren (nach WebServerInstance suchen und durch LaunchConfig ersetzen, mit Ausnahme von cfn-signal). Für cfn-signal, müssen Sie wie im folgenden Codeausschnitt dargestellt die Auto Scaling-Gruppe (WebServerGroup) und nicht die Instance signalisieren:

    "# 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 mit AWS CloudFormation je nach Bedarf Ihre Stacks vergrößern oder erweitern.

{ "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 verwenden, um eine beliebige Eigenschaft zu aktualisieren. Bevor Sie jedoch Änderungen vornehmen, sollten Sie sich folgende Fragen stellen:

  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 Instance-Typs, dass die Instance gestoppt und neu gestartet wird. AWS CloudFormation verwendet die Aktionen „Aktualisieren“ oder „Ändern“ für die zugrundeliegenden Ressourcen, um Änderungen an den 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 verwendet CloudFormation APIs für Aktualisierungen oder Änderungen für die zugrundeliegenden Ressourcen. Bei unveränderlichen Eigenschaftsänderungen, erstellt CloudFormation neue Ressourcen mit den aktualisierten Eigenschaften und verknüpft sie dann mit dem Stack, bevor die alten Ressourcen gelöscht werden. Obwohl CloudFormation versucht, die Ausfallzeit der Stack-Ressourcen zu reduzieren, umfasst das Ersetzen einer Ressource mehrere Schritte und beansprucht Zeit. 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 von CloudFormation zum Starten von Anwendungen und zur Integration von anderen Konfigurations- und Bereitstellungsservices wie Puppet und Opscode Chef finden Sie in folgenden Whitepaper-Dokumenten:

Bei der in diesem Abschnitt verwendeten Vorlage handelt es sich um eine „Hello World”-PHP-Anwendung. Die Vorlagenbibliothek verfügt außerdem über eine Amazon ElastiCache-Beispielvorlage, die die Integration einer PHP-Anwendung in ElasticCache mithilfe von „cfn-hup” und „cfn-init” zeigt, um auf Änderungen in der Konfiguration des Amazon ElastiCache-Cache-Cluster zu reagieren, die durch die Aktualisierung des Stack ausgeführt werden können.