Einen CloudFormation Stack aktualisieren - 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.

Einen CloudFormation Stack aktualisieren

Anmerkung

Dieses Tutorial baut auf Konzepten aus dem Anwendungen auf Amazon bereitstellen EC2 Tutorial auf. Wenn Sie dieses Tutorial noch nicht abgeschlossen haben, empfehlen wir, dies zunächst zu tun, um das EC2 Bootstrapping mit zu verstehen. CloudFormation

In diesem Thema wird ein einfacher Ablauf der Aktualisierungen eines laufenden Stacks veranschaulicht. Wir führen Sie durch die folgenden Schritte:

  1. Den ersten Stack erstellen — Erstellen Sie einen Stack mit einem Amazon Linux 2-AMI, installieren Sie das Apache Web Server und eine einfache PHP-Anwendung mithilfe der CloudFormation Hilfsskripte.

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

  3. key pair hinzufügen — Fügen Sie der Instance ein EC2 Amazon-Schlüsselpaar hinzu und aktualisieren Sie dann die Sicherheitsgruppe, um SSH-Zugriff auf die Instance zu ermöglichen.

  4. Instance-Typ aktualisieren — Ändern Sie den Instance-Typ der zugrunde liegenden EC2 Amazon-Instance.

  5. AMI aktualisieren — Ändern Sie das Amazon Machine Image (AMI) für die EC2 Amazon-Instance in Ihrem Stack.

Anmerkung

CloudFormation ist kostenlos, aber die EC2 Amazon-Ressourcen, die Sie erstellen, werden Ihnen in Rechnung gestellt. Wenn Sie jedoch noch keine Erfahrung damit haben AWS, können Sie das kostenlose Kontingent nutzen, um die Kosten während dieses Lernprozesses zu minimieren oder ganz zu vermeiden.

Schritt 1: Erstellen Sie den ersten Stack

Wir beginnen mit der Erstellung eines Stacks, den wir im Rest dieses Themas verwenden können. Wir haben eine einfache Vorlage bereitgestellt, mit der eine einzelne Instanz einer PHP-Webanwendung gestartet wird, die auf einem Amazon Linux 2-AMI gehostet wird Apache Web Server und dort ausgeführt wird.

DieApache Web Server, PHP und die einfache PHP-Anwendung werden alle von den CloudFormation Hilfsskripten installiert, die standardmäßig auf dem Amazon Linux 2-AMI installiert sind. Der folgende Vorlagenausschnitt zeigt die Metadaten, die die zu installierenden Pakete und Dateien beschreiben, in diesem Fall die Apache Web Server und die PHP-Infrastruktur aus dem Yum Repository für das Amazon Linux 2-AMI. Das Snippet zeigt auch den Services Abschnitt, der sicherstellt, dass der läuft. Apache Web Server

WebServerInstance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] php: [] files: /var/www/html/index.php: content: | <?php echo '<h1>Hello World!</h1>'; ?> mode: '000644' owner: apache group: apache services: systemd: httpd: enabled: true ensureRunning: true

Die Anwendung selbst ist ein Beispiel für „Hello World“, das vollständig in der Vorlage 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 einzelne Dateien referenzieren und Dateien erweitern.zip, um die Anwendungsartefakte auf der EC2 Amazon-Instance zu erstellen. .tar

Die Vorlage aktiviert und konfiguriert den cfn-hup Daemon so, dass er auf Änderungen an der in den Metadaten für die EC2 Amazon-Instance definierten Konfiguration wartet. 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 aus aktualisieren. CloudFormation Der folgende Ausschnitt aus derselben EC2 Amazon-Ressource in der Vorlage zeigt die Teile, die konfiguriert cfn-hup werden müssen, um cfn-init alle zwei Minuten aufzurufen, um Aktualisierungen der Metadaten zu bemerken und anzuwenden. Andernfalls wird der cfn-init nur einmal beim Start ausgeführt.

files: /etc/cfn/cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} # The interval used to check for changes to the resource metadata in minutes. Default is 15 interval=2 mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region} runas=root services: systemd: cfn-hup: enabled: true ensureRunning: true files: - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf

Um den Stack zu vervollständigen, enthält die UserData Eigenschaft im Properties Abschnitt der EC2 Amazon-Instance-Definition das cloud-init Skript, das cfn-init die Installation der Pakete und Dateien aufruft. Weitere Informationen finden Sie in der Referenz zu CloudFormation Hilfsskripten im CloudFormation Template Reference Guide. Die Vorlage erstellt auch eine EC2 Amazon-Sicherheitsgruppe.

AWSTemplateFormatVersion: 2010-09-09 Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' InstanceType: Description: WebServer EC2 instance type Type: String Default: t3.micro AllowedValues: - t3.nano - t3.micro - t3.small - t3.medium - t3a.nano - t3a.micro - t3a.small - t3a.medium - m5.large - m5.xlarge - m5.2xlarge - m5a.large - m5a.xlarge - m5a.2xlarge - c5.large - c5.xlarge - c5.2xlarge - r5.large - r5.xlarge - r5.2xlarge - r5a.large - r5a.xlarge - r5a.2xlarge ConstraintDescription: must be a valid EC2 instance type. Resources: WebServerInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe # Get the latest CloudFormation package yum update -y aws-cfn-bootstrap # Run cfn-init /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init' # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup' # Signal success or failure /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] php: [] files: /var/www/html/index.php: content: | <?php echo "<h1>Hello World!</h1>"; ?> mode: '000644' owner: apache group: apache /etc/cfn/cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} # The interval used to check for changes to the resource metadata in minutes. Default is 15 interval=2 mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region} runas=root services: systemd: 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 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: Value: !Sub 'http://${WebServerInstance.PublicDnsName}' Description: URL of the web application
Um einen Stack von dieser Vorlage aus zu starten
  1. Kopieren Sie die 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 an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole unter https://console.aws.amazon.com/cloudformation.

  3. Wählen Sie Stack erstellen, Mit neuen Ressourcen (Standard) aus.

  4. Wählen Sie „Bestehende Vorlage auswählen“.

  5. Wählen Sie unter Vorlage angeben die Option Vorlagendatei hochladen aus, suchen Sie nach der Datei, die Sie im ersten Schritt erstellt haben, und klicken Sie dann auf Weiter.

  6. Geben Sie auf der Seite „Stack-Details angeben“ den Namen des Stacks einUpdateTutorial.

  7. Behalten Sie unter Parameter alle Parameter bei und wählen Sie zweimal Weiter aus.

  8. Wählen Sie auf dem Bildschirm Überprüfen und erstellen die Option Senden aus.

Sobald der Status Ihres Stacks lautetCREATE_COMPLETE, wird auf dem Tab „Ausgaben“ die URL Ihrer Website angezeigt. Wenn Sie den Wert der WebsiteURL Ausgabe wählen, werden Sie sehen, dass Ihre neue PHP-Anwendung funktioniert.

Schritt 2: Aktualisieren Sie die 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:

files: /var/www/html/index.php: content: | <?php echo "<h1>Hello World!</h1>"; echo "<p>This is an updated version of our application.</p>"; ?> mode: '000644' owner: apache group: apache

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

Aktualisieren Sie jetzt den Stack.

Um den Stack mit Ihrer aktualisierten Vorlage zu aktualisieren
  1. Wählen Sie in der CloudFormation Konsole Ihren UpdateTutorial Stack aus.

  2. Wählen Sie Update, Direktes Update durchführen.

  3. Wählen Sie Bestehende Vorlage ersetzen.

  4. Wählen Sie unter Vorlage angeben die Option Eine Vorlagendatei hochladen und Ihre geänderte Vorlagendatei hochladen aus, und klicken Sie dann auf Weiter.

  5. Behalten Sie auf der Seite „Stack-Details angeben“ alle Parameter bei und wählen Sie zweimal „Weiter“.

  6. Überprüfen Sie auf der Seite Überprüfen die Änderungen. Unter Änderungen sollten Sie sehen, dass die WebServerInstance Ressource aktualisiert CloudFormation wird.

  7. Wählen Sie Absenden aus.

Wenn sich Ihr Stack im UPDATE_COMPLETE Status befindet, können Sie den WebsiteURL Ausgabewert erneut auswählen, um zu überprüfen, ob die Änderungen an Ihrer Anwendung wirksam wurden. Standardmäßig wird der cfn-hup Daemon alle 2 Minuten ausgeführt, sodass es bis zu 2 Minuten dauern kann, bis sich die Anwendung ändert, sobald der Stack aktualisiert wurde.

Rufen Sie die CloudFormation Konsole auf, um zu sehen, welche Ressourcen aktualisiert wurden. Betrachten Sie auf der Registerkarte Events die Stack-Ereignisse. In diesem speziellen Fall wurden die Metadaten für die EC2 Amazon-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 Stapelressourcen wurde modifiziert. CloudFormation aktualisiert nur die Ressourcen im Stapel, die von Änderungen am Stapel betroffen sind. Solche Änderungen können direkt sein, z. B. Änderungen an Eigenschaften oder Metadaten, oder sie können auf Abhängigkeiten oder Datenflüsse durch RefGetAtt, oder andere systeminterne Vorlagenfunktionen zurückzuführen sein. Weitere Informationen finden Sie unter Intrinsische Funktionsreferenz.

Dieses einfache Update veranschaulicht den Prozess. Sie können jedoch viel komplexere Änderungen an den Dateien und Paketen vornehmen, die auf Ihren EC2 Amazon-Instances bereitgestellt werden. 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.

packages: yum: httpd: [] php: [] mysql: [] php-mysql: [] mysql-server: [] mysql-libs: [] ... services: systemd: 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

Sie können die CloudFormation Metadaten aktualisieren, um auf neue Versionen der von der Anwendung verwendeten Pakete zu aktualisieren. In den vorherigen Beispielen ist die Versionseigenschaft für jedes Paket leer, was bedeutet, dass die neueste Version des Pakets installiert werden cfn-init soll.

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"

Schritt 3: SSH-Zugriff mit einem key pair hinzufügen

Sie können auch eine Ressource in der Vorlage aktualisieren, um Eigenschaften hinzuzufügen, die ursprünglich nicht in der Vorlage angegeben wurden. Um dies zu veranschaulichen, fügen wir einer vorhandenen EC2 Instance ein EC2 Amazon-Schlüsselpaar hinzu und öffnen dann Port 22 in der EC2 Amazon-Sicherheitsgruppe, sodass Sie Secure Shell (SSH) für den Zugriff auf die Instance verwenden können.

Um SSH-Zugriff zu einer vorhandenen EC2 Amazon-Instance hinzuzufügen
  1. Fügen Sie der Vorlage zwei zusätzliche Parameter hinzu, um den Namen eines vorhandenen EC2 Amazon-Schlüsselpaars und einen SSH-Standort zu übergeben.

    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 that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){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 zur EC2 Amazon-Instance hinzu.

    WebServerInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType KeyName: !Ref KeyName SecurityGroupIds: - !Ref WebServerSecurityGroup
  3. Fügen Sie Port 22 und den SSH-Standort zu den Eingangsregeln für die EC2 Amazon-Sicherheitsgruppe hinzu.

    WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 and SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
  4. Aktualisieren Sie den Stack mit den gleichen Schritten wie unter beschrieben. Schritt 2: Aktualisieren Sie die Anwendung

Schritt 4: Aktualisieren Sie den Instanztyp

Lassen Sie uns nun demonstrieren, wie Sie die zugrunde liegende Infrastruktur aktualisieren, indem Sie den Instanztyp ändern.

Der Stack, den wir bisher erstellt haben, verwendet eine EC2 t3.micro-Amazon-Instance. Nehmen wir an, dass Ihre neu erstellte Website mehr Traffic erhält, als eine t3.micro-Instance verarbeiten kann, und Sie möchten jetzt zu einem Amazon-Instance-Typ m5.large wechseln. EC2 Wenn sich die Architektur des Instance-Typs ändert, muss die Instance mit einem anderen AMI erstellt werden. Sowohl t3.micro als auch m5.large verwenden jedoch dieselben CPU-Architekturen und laufen unter Amazon Linux 2 (x86_64). AMIs Weitere Informationen finden Sie unter Kompatibilität bei der Änderung des Instance-Typs im EC2 Amazon-Benutzerhandbuch.

Lassen Sie uns die Vorlage verwenden, 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 auf der Seite „Stack-Details angeben“ ändern.

Um den Stack mit einem neuen Parameterwert zu aktualisieren
  1. Wählen Sie in der CloudFormation Konsole Ihren UpdateTutorial Stack aus.

  2. Wählen Sie Update, Direktes Update durchführen.

  3. Wählen Sie „Bestehende Vorlage verwenden“ und anschließend „Weiter“.

  4. Ändern Sie auf der Seite „Stack-Details angeben“ den Wert des InstanceTypeTextfeldes von t3.micro zum5.large. Wählen Sie dann zweimal Weiter aus.

  5. Überprüfen Sie auf der Seite Überprüfen die Änderungen. Unter Änderungen sollten Sie sehen, dass die WebServerInstance Ressource aktualisiert CloudFormation wird.

  6. Wählen Sie Absenden aus.

Sie können den Instance-Typ einer EBS-gestützten Amazon-Instance dynamisch ändern, indem Sie die EC2 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-Managementkonsole, öffnen Sie die EC2 Amazon-Konsole und suchen Sie dort nach Ihrer Instance.

Schritt 5: AMI aktualisieren

Lassen Sie uns nun unseren Stack aktualisieren, um Amazon Linux 2023 zu verwenden, die nächste Generation von Amazon Linux.

Die Aktualisierung des AMI ist eine wichtige Änderung, die den Austausch der Instance erfordert. Wir können 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 EC2 Amazon-Instance, auf der das neue AMI ausgeführt wird.

Schauen wir uns an, wie wir unsere Stack-Vorlage aktualisieren könnten, um Amazon Linux 2023 zu verwenden. Zu den wichtigsten Änderungen gehören die Aktualisierung des AMI-Parameters und der Wechsel vom Paketmanager yum zum dnf Paketmanager.

AWSTemplateFormatVersion: 2010-09-09 Parameters: LatestAmiId: Description: The latest Amazon Linux 2023 AMI from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64' InstanceType: Description: WebServer EC2 instance type Type: String Default: t3.micro AllowedValues: - t3.nano - t3.micro - t3.small - t3.medium - t3a.nano - t3a.micro - t3a.small - t3a.medium - m5.large - m5.xlarge - m5.2xlarge - m5a.large - m5a.xlarge - m5a.2xlarge - c5.large - c5.xlarge - c5.2xlarge - r5.large - r5.xlarge - r5.2xlarge - r5a.large - r5a.xlarge - r5a.2xlarge ConstraintDescription: must be a valid EC2 instance type. 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 that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType KeyName: !Ref KeyName SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe # Get the latest CloudFormation package dnf update -y aws-cfn-bootstrap # Run cfn-init /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init' # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup' # Signal success or failure /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} Metadata: AWS::CloudFormation::Init: config: packages: dnf: httpd: [] php: [] files: /var/www/html/index.php: content: | <?php echo "<h1>Hello World!</h1>"; echo "<p>This is an updated version of our application.</p>"; echo "<p>Running on Amazon Linux 2023!</p>"; ?> mode: '000644' owner: apache group: apache /etc/cfn/cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} # The interval used to check for changes to the resource metadata in minutes. Default is 15 interval=2 mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region} runas=root services: systemd: 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 CreationPolicy: ResourceSignal: Timeout: PT5M WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 and SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation Outputs: WebsiteURL: Value: !Sub 'http://${WebServerInstance.PublicDnsName}' Description: URL of the web application

Aktualisieren Sie den Stack mit den gleichen Schritten wie unter beschriebenSchritt 2: Aktualisieren Sie die Anwendung.

Sobald die neue Instanz ausgeführt wird, werden die anderen Ressourcen im Stack so CloudFormation aktualisiert, dass sie auf die neue Ressource verweisen. Wenn alle neuen Ressourcen erstellt sind, wird die alte Ressource gelöscht, ein Vorgang, der als UPDATE_CLEANUPbekannt ist. 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 Ereignistabelle enthalten die Beschreibung „Die angeforderte Aktualisierung hat eine Änderung an einer unveränderlichen Eigenschaft zur Folge und erzeugt somit eine neue physische Ressource“, die darauf hinweist, dass eine Ressource ersetzt wurde.

Alternative: Wenn Sie Anwendungscode in das AMI geschrieben haben, den Sie aktualisieren möchten, können Sie denselben Stack-Aktualisierungsmechanismus verwenden, um das AMI zu aktualisieren, um Ihre neue Anwendung zu laden.

Um das AMI mit benutzerdefiniertem Anwendungscode zu aktualisieren
  1. Erstellen Sie Ihr neues AMI, das Ihre Anwendungs- oder Betriebssystemänderungen enthält. Weitere Informationen finden Sie unter Erstellen eines Amazon EBS-backed AMI im EC2 Amazon-Benutzerhandbuch.

  2. Aktualisieren Sie Ihre Vorlage, um die neue AMI-ID zu integrieren.

  3. Aktualisieren Sie den Stack mit den gleichen Schritten wie unter beschriebenSchritt 2: Aktualisieren Sie die Anwendung.

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.

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. 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 den Ressourceneigenschaften, wie z. B. das Ändern des AMI auf einer EC2 Amazon-Instance, werden von den zugrunde liegenden Diensten nicht unterstützt. Bei veränderlichen Änderungen CloudFormation wird der Typ Update oder Modify APIs 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: