Clouds – einfaches Management von CloudFormation Templates

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:

  1. Group Name: Ein sprechender Gruppenname, hier „Cloudformation Templates“
  2. Die Tags, die man sammeln will. Hier werden nur bereits vorhandene Tags zur Auswahl angezeigt. Im Beispiel „Project“
  3. Der Inhalt des Tags, im Beispiel „Cloudformation“
  4. Unter Regionen gibt man an, ob man über alle Regionen zusammenfassen will.
  5. 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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.