Clouds - einfaches Management von CloudFormation Templates
This content is more than 4 years old and the cloud moves fast so some information may be slightly out of date.
Infrastruktur als Code ist eine (Heraus)Forderung von DevOps. Die Infrastrukturbeschreibungssprache von AWS heißt CloudFormation. Hat man sich erstmal eingearbeitet, greift man immer häufiger zum Texteditor statt zur Console, um AWS Ressourcen zu erstellen. Und eh man es sich versieht, hat man eine unüberschaubare Anzahl von Cloudformation Templates. Und dann steht man vor der Aufgabe, diese zu verwalten. Hier wollen wir ein paar Möglichkeiten dafür vorstellen.
Verwaltung mit der AWS Console
Die WebGui von AWS ist zu Anfang der schnellste und einfachste Weg für die Verwaltung. Wie bei den meisten AWS Diensten wird eine einfache Liste angezeigt.
Umständlich wird es, wenn man viele Stacks hat. Hier im Beispiel sieht man nicht alle 12 Templates, man muss runterscrollen.
Hilfreich ist es, den angezeigten Listenbereich zu maximieren. Dazu gibt es rechts in der Mitte die Symbole zur Größenanpassung des LIstenbereichs:
Mit dem linken Symbol vergrößert sich der Listenbereich.
Arbeiten in verschiedenen Regionen - Resource Groups
Hier sieht man immer nur die Stacks in einer Region. Versieht man jedoch alle Templates mit Tags, z.B. “Project = Cloudformation” so kann man überregional in den “Resource Groups” Templates verschiedener Regionen ansehen:
Beim Erstellen der Resource Group sind folgende Attribute zu befüllen:
- Group Name: Ein sprechender Gruppenname, hier “Cloudformation Templates”
- Die Tags, die man sammeln will. Hier werden nur bereits vorhandene Tags zur Auswahl angezeigt. Im Beispiel “Project”
- Der Inhalt des Tags, im Beispiel “Cloudformation”
- Unter Regionen gibt man an, ob man über alle Regionen zusammenfassen will.
- Unter Resource Types gibt man nun Cloudformation Stacks an.
Als Ergebnis sieht man alle Ressourcen, die in diesem Fall den Tag “Project” gleich “Cloudformation” haben. Ich habe hier zwei Stacks in unterschiedlichen Regionen angelegt und kann diese hier zentral sehen:
Für Profis - Verwaltung mit der Kommandozeile CLI
Will man weiter automatisieren, so kommt man an der aws cli (command line interface) nicht vorbei. Die Beispiele sind - soweit nicht anders angegeben- mit der bash Shell erstellt. Hier kann ich mir mit einem einfache Befehl alle Stacks der aktuellen Region anzeigen lassen:
aws cloudformation list-stacks
Angezeigt wird jeweils ein vollen Datensatz der Stacks.
{
"StackId": "arn:aws:cloudformation:eu-central-1:123453403305:stack/MOBILEHUB-1663486314-Development/2b3f8290-1075-11e7-80a2-500c52a6ce62",
"StackName": "MOBILEHUB-1663486314-Development",
"CreationTime": "2017-03-24T09:35:08.096Z",
"DeletionTime": "2017-03-31T08:52:47.891Z",
"StackStatus": "DELETE_COMPLETE"
}
Um nur eine Liste der Namen zu bekommen, kann man die query Funktion der AWS Kommandozeile nutzen:
aws cloudformation list-stacks --query "StackSummaries\[*\].StackName"
Mitunter werden hier mehr Stacks angezeigt, als eigentlich aktiv sind. Das liegt daran, dass auch Stacks mit Status gelöscht enthalten sind:
"StackStatus": "DELETE_COMPLETE",
Filtern der cli Ausgabe
Die Ausgabe kann ich mit einem Filter bereinigen:
aws cloudformation list-stacks --query "StackSummaries\[?StackStatus == 'CREATE_COMPLETE'\]"
Um auch hier wieder nur eine Liste der Namen zu bekommen, gebe ich die gewünschten Ausgabeattribute mit an:
aws cloudformation list-stacks --query "StackSummaries\[?StackStatus == 'CREATE_COMPLETE'\].{Name:StackName}"
Ganz rund wird es dann, wenn ich noch das Ausgabeformat anpasse:
aws cloudformation list-stacks --query "StackSummaries\[?StackStatus == 'CREATE_COMPLETE'\].{Name:StackName}" --output table
Mögliche Formate sind:
- text
- Json
- Table
Das sieht dann in etwa so aus:
Hier sind noch ein paar Stacks von der Vorbereitung auf das AWS Usergroup Treffen Hannover enthalten. Es ging wie man sehen kann um Codestar, Lambda und codebuild.
Alle Stacks - Alle Regionen
Dennoch beschränkt sich hier die Ausgabe auf eine Region. Das kann man mit einem kleinen Shell Script lösen:
#!/bin/bash
for R in us-east-1 us-east-2 eu-west-1 eu-central-1
do
export AWS\_DEFAULT\_REGION=$R
aws cloudformation list-stacks --query "StackSummaries\[?StackStatus == 'CREATE_COMPLETE'\].{Name:StackName}" --output table
done
Im Beispiel werden für die vier Regionen east1+2, Irland und Frankfurt alle Stacks ausgegeben.
Noch einfacher - Verwaltung mit dem Tool “clouds”
Für eine individuelle Automatisierung kann der manuelle Weg zum Zusammenbau von cli Scripten der beste Weg sein, er ist aber auch steinig. Es gibt bereits verschiedene Tools, die das Leben einfacher machen. Eins davon ist “clouds”. Das Prinzip des Tools sieht vor, dass alle CloudFormation Stacks lokal auf der Festplatte in einem Unterverzeichnis names “stacks” liegen. Diese lokalen Kopien synchronisiert man dann mit dem AWS CloudFormation Service. Hier ein Beispiel für die Verwendung:
Installation von clouds
Mit dem pip Installer beschränkt sich die Installation auf:
pip install clouds-aws
Wichtig ist das Setzen der Region Umgebungsvariable, hier für bash. Für Frankfurt dann bitte eu-central-1 statt us-west-1 verwenden.
export AWS\_DEFAULT\_REGION=us-west-1
Konfiguration
clouds geht von dem Unterverzeichnis “stacks” aus. Zusätzlich erstellen wir noch zwei Template Verzeichnisse.
mkdir stacks
mkdir stacks/mystack1
mkdir stacks/mystack2
Erstellen von Templates
Jetzt muss ich noch dafür sorgen, dass syntaktisch korrekter Inhalt in den Templates enthalten ist. Man kann dazu vi oder jeden anderen Editor nehmen.
touch stacks/mystack1/template.json
vi stacks/mystack2/template.json
Ein Beispielstack mit einer EC2 Instanz gibt es im Abschnitt “Basic Amazon EC2 Instance” auf dieser Seite: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/deploying.applications.html
In diesem Stack wird noch ein Parameter verwendet. Auch damit kann clouds umgehen. Die Parameter werden im selben Verzeichnis wie die Templates in die Datei “parameters.yaml” geschrieben.
vi stacks/mystack2/parameters.yaml
Ich habe meinen Key “mykeyname-us-west-1” genannt. Die parameters.yaml enthält also:
KeyName: "mykeyname-us-west-1"
Templateliste
Jetzt habe ich lokale Templates. Dies zeigt clouds mit “list” an:
Eingabe:
clouds list
Ausgabe:
stack list and stack status:
mystack1 LOCAL-ONLY
mystack2 LOCAL-ONLY
Stack mit lokalem Template erstellen
Um die Template-Erstellung komme ich in keiner Variante - Konsole-cli oder clouds herum. Nach dem Erstellen wird es jetzt mit clouds einfacher. Der Name des Stacks ist durch den Namen des Unterverzeichnisses von “stacks” festgelegt. Daher kann ich jetzt “mystack2” einfach erstellen:
clouds update mystack2 -c
Der Befehl “update” aktualisiert den AWS CloudFormation Stack aus der lokalen Datei. Mit dem Parameter “-c” (create) wird der Stack angelegt, wenn er noch nicht existiert.
Um zu sehen, wie der Stack angelegt wird und ob es eventuell Probleme gibt, lasse ich mir die Protokolldatei anzeigen:
clouds events -f mystack2
Die Ausgabe sieht dann in etwa so aus:
2017-06-25/09:19:05 CREATE\_IN\_PROGRESS AWS::CloudFormation::Stack mystack2 User Initiated
2017-06-25/09:19:10 CREATE\_IN\_PROGRESS AWS::EC2::SecurityGroup WebServerSecurityGroup
2017-06-25/09:19:11 CREATE\_IN\_PROGRESS AWS::EC2::SecurityGroup WebServerSecurityGroup Resource creation Initiated
2017-06-25/09:19:12 CREATE_COMPLETE AWS::EC2::SecurityGroup WebServerSecurityGroup
2017-06-25/09:19:15 CREATE\_IN\_PROGRESS AWS::EC2::Instance WebServerInstance
2017-06-25/09:19:16 CREATE\_IN\_PROGRESS AWS::EC2::Instance WebServerInstance Resource creation Initiated
2017-06-25/09:19:33 CREATE_COMPLETE AWS::EC2::Instance WebServerInstance
2017-06-25/09:19:36 CREATE_COMPLETE AWS::CloudFormation::Stack mystack2
Mit dem Template arbeiten
Ich kann nun das Template lokal bearbeiten und jeweils mit dem update Befehl als Stackupdate ausführen. Den aktuellen Status alle Stacks in der aktuellen Region kann ich mir dann mit
clouds list
Anzeigen lassen. Will ich den Detailstatus eines Stack sehen, z.B. “mystack2”, so ist “describe” das Kommando:
clouds describe mystack2
Die Ausgabe solle in etwa so aussehen:
Parameters:
InstanceType: m1.small
KeyName: mykeyname-us-west-1
SSHLocation: 0.0.0.0/0
Outputs:
WebsiteURL: http://ec2-13-56-11-84.us-west-1.compute.amazonaws.com
Resources:
WebServerInstance: AWS::EC2::Instance (i-056ebb015af809521)
WebServerSecurityGroup: AWS::EC2::SecurityGroup (mystack2-WebServerSecurityGroup-84E66682CPUR)
Stacks löschen
Das Löschen von Stacks ist dann mit “delete” möglich. Den “-f” force switch sollte man mit Bedacht verwenden, da der Stack dann ohne Nachfrage gelöscht wird. Ein kleiner Vertipper könnte da große Folgen haben. Hier verwende ich ihn, um das Beispiel abzuschließen:
clouds delete mystack2 --force
Fazit
Es gibt auch noch weitere Tools wie z.B. “awless”, die einen Teil der Funktionalität abbilden. Clouds bietet meiner Meinung nach einen sehr vielversprechenden Ansatz. Alle Funktionen, die ich bei früheren Projekten selber mit Scripten auf der Kommandozeile gebaut habe, sind enthalten.
Wenn man vor der Grundlagenentscheidung steht, wie Infrastruktur auf aws gebaut wird, sollte man sich auch Terraform und sparkeformation anschauen. Steht Cloudformation als Basis fest und werden keine umfangreichen Programmierungen von Templates benötigt, ist clouds definitiv eine echte Hilfe!