AWS CloudFormation, Teil 1 Infrastruktur-Bereitstellung mit Amazon Web Services

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Amazon Web Services bietet zahlreiche Möglichkeiten, das Deployment von Infrastruktur, Plattformen oder komplexen mehrstufigen Anwendungen zu automatisieren. Die wichtigsten sind CloudFormation, Elastic Beanstalk und OpsWorks. Folgender Beitrag wirft einen Blick auf Cloud Formation.

Anbieter zum Thema

Der CloudFormation-Designer gibt einen Überblick über die Beziehungen von AWS-Ressourcen.
Der CloudFormation-Designer gibt einen Überblick über die Beziehungen von AWS-Ressourcen.
(Bild: Thomas Drilling / AWS)

Automatisierung ist in der Cloud allgegenwärtig. Schließlich ist Cloud Computing im Grunde nichts anderes, als die API-gesteuerte Automatisierung des Deployments virtueller Maschinen, Container oder Anwendungen auf Basis von Self-Service-Portalen.

Die drei wichtigsten Automatisierungs-Framework in AWS widmen sich

  • dem Bereitstellen der Infrastruktur (Infrastruktur as Code) mit CloudFormation,
  • dem Bereitstellen von Plattform-Stacks mit OpsWorks (Chef) sowie
  • dem automatisieren Bereitstellen eines Webserver- oder Worker-Environments für das Ausführen eigenen Codes mit Beanstalk,

wobei die Komplexität der Nutzung aus Anwendersicht ansteigt.

Das bedeutet: mit CloudFormation ist alles möglich, OpsWorks fördert das Bereitstellen von mehrstufigen Stacks etwa für eine Node.js.-Anwendung und das auf Docker-Containern basierende Beanstalk widmet sich eher klassischen LAMP-Plattformen für PHP, Ruby, Tomcat oder Java. Hierbei steht allerdigns im Vordergrund steht, dass Entwickler sich auf Ihren Anwendungen konzentrieren und diese in Beanstalk hochladen können, ohne sich Gedanken um die dazu benötigte Infrastruktur machen zu müssen. Dieser Teil unserer Artikel-Serie befasst sich mit AWS CloudFormation.

AWS CloudFormation

Mit AWS CloudFormation können AWS-Nutzer ihre Infrastruktur auf Basis einer „Beschreibungssprache“ definieren und dann vorlagenbasiert ausrollen. Das bietet mehrere Vorteile. Auf diese Weise erzeugte Deployments sind konsistent, was z. B. verwendete Security-Gruppen (Firewalls), Subnetze, Zugriffsberechtigungen (IAMs) und vieles mehr betrifft. Dies ist allgemein der Sicherheit förderlich, erleichtert aber auch Audits, das Einhalten von unternehmensinternen Compliance-Vorschriften usw.

Administratoren können mit CloudFormation nach dem „Infrastructure-as-Code“-Prinzip so genannte „Sammlungen“ von zusammengehörigen AWS-Ressourcen erstellen und verwalten. Solche Vorlagen (CloudFormation-Templates) beschreiben die bereitzustellenden AWS-Ressourcen, einschließlich Abhängigkeiten und Laufzeitparametern, welche die jeweilige Anwendung zum Ausführen erwartet. Darüber hinaus können AWS-Nutzer nicht nur Ihre eigenen Vorlagen (Templates) erzeugen und verwalten, sondern auch anderen Nutzern zur Verfügung stellen oder sich bei Bedarf aus einem von AWS bereitgestellten CloudFormation-Template-Fundus bedienen.

Der Administrator muss sich bei Verwendung CloudFormation auch nicht um die richtige Reihenfolge beim Bereitstellen von AWS-Ressourcen sorgen und braucht sich anschließend nur noch um etwaige Kontrollen oder das Aktualisieren seines Ressourcen-Stacks zu kümmern. Zudem können AWS-Nutzer mit CloudFormation nahezu jede AWS-Ressource bereitstellen und nicht nur LAMP-Stacks oder Node.JS-Umgebungen. Erleichtert wird das Schreiben des Code-Gerüsts außerdem dadurch, dass CloudFormation Vorlagen auch visualisieren kann, die der Nutzer direkt im AWS CloudFormation Designer grafisch bearbeitet.

Wie bei OpsWorks spricht man übrigens auch bei dem zu einem CloudFormation-Template gehörige Ressourcensatz von einem „Stack“, wobei es durchaus möglich ist, CloudFormation und OpsWorks gemeinsam zu einzusetzen und beispielsweise CloudFormation zum Modellieren, Provisionieren und ggf. zum Versionieren einer Applikation auf AWS einzusetzen und OpsWorks für das Konfigurations-Management und das Ausrollen der für Skalierung und Monitoring benötigten Ressourcen.

CloudFormation-Vorlagen

Eine CloudFormation-Vorlage ist technisch betrachtet zunächst eine gewöhnliche Text-Datei im JSON- oder YAML-Format. Diese Datei enthält eine Beschreibung der AWS-Infrastruktur, die zum Ausführung einer bestimmten Applikation oder eines Service erforderlich ist.

Im Template sind außerdem die „Beziehungen“ der Ressourcen untereinander beschrieben, etwa welche EC2-Instancen in verwendeten Elastic Load Balancer registriert sind. Auch „Bedingungen“ lassen sich hier beschrieben, etwa dass ein EBS-Volume in der gleichen Availability Zone sein muss, wie das Image, mit dem es verbunden ist.

Eine der wesentlichen Eigenschaften von CloudFormation-Templates liegt in der Wiederverwendbarkeit, die mit Hilfe spezieller Vorlagenparameter realisiert werden kann und quasi in der Natur von Vorlagen liegt. Dank dieser speziellen Vorlagenparameter können AWS-Nutzer eine einzelne Vorlage mit unterschiedlichen Konfigurationswerten benutzen, wie z. B. der Anzahl für die Anwendung bereitzustellender Instanzen und so für mehrere Deployments verwenden.

Ein CloudFormation-Template für den Aufbau eines Stacks.
Ein CloudFormation-Template für den Aufbau eines Stacks.
(Bild: Thomas Drilling / AWS)

Innerhalb ein und derselben Vorlage werden sämtliche AWS-Ressourcen ausschließlich mit Hilfe logischer Namen identifiziert, sodass sich aus der gleichen Vorlage problemlos mehrere Stacks erstellen lassen, ohne dass der Admin Namenskonflikte befürchten muss. Zudem lassen sich auch Ausgabe-Eigenschaften zur Kommunikation mit den Bereitstellungsergebnissen oder mit Konfigurationsinformationen im Template verwenden. So könnte ein Template z. B. die URL des Elastic Load Balancer-Endpoints zurückliefern, den der Nutzer zum Verbinden mit der neu instanziierten Anwendung verwenden muss.

Das Generieren von Vorlagen lässt sich darüber hinaus auch mit Hilfe einer Programmiersprache auf Basis der CloudFormation-API bzw. des AWS SDKs und auch mit Hilfe von der AWS-CLI automatisieren. Dies ist auch in der sehr umfassenden Template-Referenz und in der CloudFormation-Dokumentation beschrieben.

CloudFormation-Stacks mit CloudFormer oder manuell erstellen

Die Startseite von CloudFormation.
Die Startseite von CloudFormation.
(Bild: Thomas Drilling / AWS)

Am einfachsten gelingt der Einstieg in AWS CloudFormation durch das Experimentieren mit einer der zahlreichen Sample-Vorlagen. Hier klickt man z. B. in der AWS Management Console auf der CloudFormation-Startseite auf „Create New Stack“. Möchte man dagegen direkt mit dem Erstellen eigener Templates im grafischen CloudFormation Designer starten, klickt man auf „Design template“. Ferner gibt es an vierter Stelle noch die Option „Launch CloudFormer“. Mit CloudFormer lässt sich ein Template einfach auf Basis bestehender AWS-Ressourcen erstellen.

CloudFormer

Eine lesenswerte Einführung in CloudFormer findet sich im AWS DevOps-Blog. Übrigens ist CloudFormer selbst ebenfalls ein AWS CloudFormation Stack. Der Anwender nutzt also CloudFormer, indem er den CloudFormer-Stack aus seiner AWS-Umgebung starten.

Der CloudFormer-Stack initiiert eine t2.medium Amazon-EC2-Instanz und basiert auf einem Amazon-Linux-AMI, das auch in den Community-AMIs zu finden ist. Hat man mit CloudFormer ein CloudFormation-Template erzeugt, kann man es z. B. in einem S3-Bucket speichern und den CloudFormer-Stack danach wieder herunterfahren.

Eigene Stacks

Nutzer, die ohne CloudFormer eigene Stacks von Grund auf neu oder aus von AWS bereitgestellten CF-Templates erstellen möchten, verwenden auf der CloudFormation-Startseite „Create new stack“ oder „Create new StackSet“. Wie auf der CF-Startseite haben Nutzer auch hier mit der Schaltfläche „Design template“ noch einmal die Gelegenheit, zum grafischen Designer zu wechseln.

Template für einen Wordpress-Stack.
Template für einen Wordpress-Stack.
(Bild: Thomas Drilling / AWS)

Ansonsten wählt der Nutzer um Bereich „Choose a template“ entweder ein Template aus dem Vorlagen-Repertoire von AWS („Select a sample template“) oder greift mit „Choose File“ auf ein eigenes CloudFormation-Template zu, das der Nutzer z. B. vorher hochgeladen bzw. in einem S3-Bucket gespeichert hat, welchen er zum Hosten seiner CloudFormation-Templates nutzt. Auch dieses Template hätte mit CloudFormer aus einer bestehenden Anwendung generiert sein können.

Wordpress-Template im CloudFormation-Designer.
Wordpress-Template im CloudFormation-Designer.
(Bild: Thomas Drilling / AWS)

Das Beispiel der Abbildung verwendet „Single Instance Samples -> WordPress blog“. Im Bereich „Tools“ stünde im Übrigen aber auch ein CloudFormer-Template bereit. Optional hätte man auch hier wieder auf den Link „View/Edit template in Designer“ klicken können, um das gewählte Template für den Wordpress-Stack direkt im Designer anzuzeigen bzw. anzupassen.

Die genauen Stack-Details.
Die genauen Stack-Details.
(Bild: Thomas Drilling / AWS)

Im Assistenten hingegen vergibt man bei „Specify Details“ zuerst einmal den Stack-Namen und definiert einige elementare Parameter, etwa zur Kommunikation mit der für „Wordpress“ benötigten MySQL-Datenbank. Diese benötigt einen Instanz-Typ für die unterliegende ECX2-Instanz und Dinge wie DB-Passwort, DB-Root-Passwort oder den DB-User. Ferner ist ggf. bei „Key-Name“ der Name für den zum Verbinden mit der DB-EC2-Instanz verwendenden SSH-KeyPairs festzulegen.

Konfigurationsübersicht für den Wordpress-Stack.
Konfigurationsübersicht für den Wordpress-Stack.
(Bild: Thomas Drilling / AWS)

Im Schritt „Options“ lassen sich dann wie bei den meisten AWS-Ressourcen bei Bedarf noch Tags vergeben. Mit Hilfe von Tags kann der Nutzer dann z. B. später im EC2-Dashboard auf einen Blick erkennen, welche Ressourcen von CloudFormation provisioniert wurden und welche manuell. Darüber hinaus kann der Nutzer in diesem Dialog dem CloudFormation-Stack eine IAM-Rolle zuweisen, damit CloudFormation über die erforderlichen Berechtigungen zum Erzeugen der benötigten Ressourcen wie z. B. Subnetze oder Security-Gruppen verfügt.

Alternativ kann man aber auch im Abschnitt „Advanced“ eine Stack-Policy in Form eines JSON-Dokuments einfügen. Details dazu finden sich in den Security-Best-Practises für CloudFormation. Wird hier keine IAM-Rolle angegeben, verwendet CloudFormation die Berechtigungen, die mit dem Konto verknüpft sind, über das der Stack gerade erzeugt wird.

Die einzelnen Ereignisse bei der Stack-Erzeugung lassen sich in der Event-Konsole verfolgen.
Die einzelnen Ereignisse bei der Stack-Erzeugung lassen sich in der Event-Konsole verfolgen.
(Bild: Thomas Drilling / AWS)

Anschließend kann der Nutzer im Schritt „Review“ einen Blick auf die Zusammenfassung werfen und den Stack, sollten keine Anpassungen erforderlich sein, mit „Create Stack“ erstellt. Nach Abschluss des Konfigurationsassistenten landet der Nutzer in der Stacks-Ansicht des CloudFormation-Dashboard und zwar initial im Tab „Events“ für den in Erstellung befindlichen Stack.

Das CF-Template im Stacks-Dashboard.
Das CF-Template im Stacks-Dashboard.
(Bild: Thomas Drilling / AWS)

Während sich im Reiter „Events“ sämtliche Ereignisse im Zusammenhang mit der Erzeugung des Stacks verfolgen lassen, kann man z. B. das verwendete Template im gleichnamigen Reiter „Template“ einsehen oder mit dem betreffenden Link bearbeiten.

CloudFormation Designer

Optional oder ergänzend können Anwender AWS-Ressourcen im CloudFormation-Designer anzeigen. Dies ist vor allem hilfreich, um Beziehungen anzeigen, wozu sich das „Layout“ beliebig „anordnen“ lässt, um die jeweils bestmögliche Aussagekraft zu bieten. Jedes Template lässt sich wahlweise per Drag and Drop oder mit dem im Designer integrierten JSON-Editor bearbeiten. Alle Änderungen, die der Nutzer am Diagramm vornimmt, verändern dann automatisch das JSON-Dokument der Vorlage.

CloudFormation-Stacks von der Kommandozeile

CloudFormation-Stacks lassen sich per CLI und über die AWS-SDK natürlich auch programmatisch erzeugen. Da es sich bei einem CloudFormation-Template um eine gewöhnliche JSON-Datei handelt, genügt dazu ein einfacher Editor. Das folgende Beispiel-Template beschreibt eine Flotte an EC2-Instance „hinter“ einem Load Balancer. Der Code in der Vorlage startet stets mit der „AWSTemplateFormatVersion“, gefolgt von einer Beschreibung ...

{
   "AWSTemplateFormatVersion" : "2010-09-09",
   "Description" : "An example template",

… und einem Parameter-Block. Bei einem Parameter handelt es sich um einen Wert, der beim Hochladen der Vorlage bereitgestellt werden kann, etwa zum Vorgeben eines Default-Wertes. Dies sind jedoch die einzigen Werte, die beim Erstellen oder Aktualisieren des Stacks überschrieben werden können. Am häufigsten kommen solche Parameter beim Festlegen des Instanz-Typs einer EC2-Instanz zum Einsatz:

"Parameters" : {
   "InstanceType" : {
      "Type" : "String",
      "Default" : "t2.micro",
      "Description" : "Type of EC2 instance to launch"
   },

Dann folgen z. B. die Blöcke für die einzelnen Ressourcen in der Form …

   "Resources" : {
      "IPAddress" : {
         "Type" : "AWS::EC2::EIP",
         "Properties" : {
            "InstanceId" : {
               "Ref" : "Webserver"
            },
         "Domain" : "vpc"
         },
      },

Dieses und andere Templates stellt AWS übrigens zum Herunterladen zur Verfügung. Validieren lässt sich das Template dann mit

aws cloudformation validate-template --template-body file://cf-lb-ec2-servers.json

Zum Ausrollen des Stacks auf Basis dieses Templates dient dann das Kommando

aws cloudformation create-stack --stack-name loadbalanced-ec2.servers --template-body file://cfn-lb-ec2-servers.json --profile test

Mit Hilfe der Option --parameters lassen sich bei Bedarf zusätzliche Parameter zur Wiederverwendung angeben, z. B.:

aws cloudformation create-stack --stack-name loadbalanced-ec2.servers --template-body file://cfn-lb-ec2-servers.json --parameters ParameterKey=InstanceType,ParameterValue=t2.medium --profile test

Ab diesem Zeitpunkt lässt sich das Deployment des Stacks in der AWS Management Console verfolgen. Trotzdem kann der Nutzer alle Informationen zum Stack aber auch weiterhin über die Kommandozeile abrufen, wie z. B.:

aws cloudformation list-stacks --profile testaws cloudformation describe-stack-events --stack-name loadbalanced-ec2.servers --profile testaws cloudformation describe-stacks --stack-name loadbalanced-ec2.servers –profile test

Fazit

Bei CloudFormation steht wie bei OpsWorks das konsistente und reproduzierbare Deployment im Vordergund. Man muss also zum Erstellen in der Praxis häufig weitgehend ähnlicher Deployments nicht erst mehr oder weniger umständlich durch die AWS Management Console klicken.

Mit CloudFormation verwendet man vielmehr wiederverwendbare (weil parametrisierbare) Templates, auf deren Basis AWS CloudFormation automatisch die gewünschten Ressourcen erzeugt. Darüber hinaus lassen sich mit Cloud Former auch Templates aus bestehenden Ressourcen generieren, was ebenfalls der Umsetzung von DevOps-Prinzipien im Unternehmen begünstigt.

(ID:44917793)