23. May 2018 10:05
Keine Kommentare

DevOps mit AWS und CodePipeline

Es kann einer langer Weg sein vom Commit in der Git-Versionskontrolle bis zum finalen Release auf dem Produktionssystem. Viele Stolperfallen lauern und menschliche Fehler sind vorprogrammiert. Von den Mühen des Deployments kann ich aus den mittlerweile über 15 Jahren meiner Website einige Geschichten erzählen. Von Damals als ein Deployment noch mit FTP und später mit SSH und RSync geschah. Heute ist das anders und warum dieses anders irgendwie beruhigend anders ist, möchte ich in diesem Artikel beschreiben.

DevOps mit AWS

Wie viele Website-Betreiber habe auch ich meine Website aus vielen sehr guten Gründen in die Cloud, genauer gesagt in die Hände von Amazon Web Services in Frankfurt am Main, gelegt. Hier skaliert meine Website nicht nur automatisch, hat einen intelligenten Lastverteiler und eine skalierbare Datenbank, sondern wird auch automatisch aus dem Git-Repository bei AWS CodeCommit geladen. Fangen wir aber einmal ganz von Vorne an.

Was ist DevOps und wozu braucht man das bei AWS?

Der Begriff DevOps ist ein Modebegriff und soll eine Zusammensetzung aus "Development" (also Entwicklung) und "Operations" (techn. Betrieb) sein. Gemeint ist damit der gesamte Zyklus von der Code-Entwicklung, über Review, Build, Testing und Packaging bis zu hin zum Release, der Konfiguration und dem Monitoring. Seit jeher gibt es gewisse Differenzen zwischen Menschen, die Software entwickeln, und Menschen, die Software betreiben. Mit Prozessoptimierung durch Maßnahmen, die sich hinter dem Begriff DevOps verstecken, sollen hier Barrieren abgebaut werden. In meinem Fall ist das natürlich irrelevant, da ich meine Website sowohl vollständig selbst programmiere als auch betreibe.

39,90 €
Jetzt bestellen »
Das DevOps-Handbuch: Teams, Tools und Infrastrukturen erfolgreich umgestalten (Das Handbuch)
Gewöhnlich versandfertig in 24 Stunden

AWS-Systemlandschaft meiner Website

Eine recht lange Zeit gab sich meine Website mit einem einzigen Server zufrieden und lief dort auch, bis auf einige sehr nervige Ausfälle in Rechenzentren, immer tadellos. In den letzten 15 Jahren hat diese Website auch drei unterschiedliche Rechenzentren gesehen. Erst in London, dann in Amsterdam, später in Berlin und nun Frankfurt am Main. Heute, bei AWS in Frankfurt, besteht meine Website aus den folgenden Komponenten.

  • Elastischer Lastverteiler (ELB)
  • Zielgruppe mit EC2 Instanzen (Target Group)
  • Automatische Skalierungsgruppe (Auto Scaling Group)
  • Startkonfiguration (Launch Config)
  • Systemabbild mit Basiskonfiguration (AMI)
  • Relationales Datenbankmanagementsystem (RDS)
  • Zwischenspeicher für temporäre Daten (ElastiCache)
  • Automatisierte Software-Verteilung (CodeDeploy)
  • Continuous Delivery und Pipelining (CodePipeline)
  • Versionskontrolle mit Git (CodeCommit)

Erster Kontaktpunkt für jeden Nutzer, der auf meine Website zugreift, ist der Lastverteiler. Dieser verteilt dann wundervoll die Anfragen an die, in der Skalierungsgruppe vorhandenen, EC2 Instanzen bzw. Server. Wenn der Lastverteiler die konfigurierte Maximallast erreicht, wird die Skalierungsgruppe völlig selbstständig neue Server hochfahren. Diese sind dann Duplikate der bestehenden Systeme. Die AWS Cloud hat meine Website also vollends im Griff, skaliert automatisch und überwacht selbstständig. Aber?

Deployment in komplexer Systemlandschaft

Eine kleine Anpassung an einem der CSS-Dateien meiner Website kann man bei einer solchen Systemkonfiguration schnell zum unkontrollierbaren Mammutprojekt werden. Instanzen herunter fahren, neu hoch fahren, neue Systemabbilder generieren. Es gibt dutzende Möglichkeiten hier Updates einzuspielen. Keine von diesen ist ratsam oder weckt besondere Freude in mir. Überhaupt habe ich wenig Lust meine Software ständig auf Server zu kopieren, testen zu müssen und irgendwelche Laufzeitfehler zu beheben. Genau dafür gibt es AWS CodeDeploy.

AWS CodeDeploy

AWS CodeDeploy für das Deployment

Mit AWS CodeDeploy lässt sich ein fertiges Paket einfach hochladen oder von S3 übertragen. Es wird anschließend auf die EC2 Instanzen innerhalb der Skalierungsgruppe (Auto Scaling Group) installiert. Hierbei lässt sich dann noch auswählen, wie die Installation stattfinden soll. Meine geringe Anspruchslosigkeit sowie eine gewisse Einfachheit meiner Website (immerhin nur PHP und MySQL sowie Memcache) haben mich zu "Alles auf Einmal" bzw. "CodeDeployDefault.AllAtOnce" verleitet. Je nach Transaktionssicherheit sollte man sich hier entscheiden, wie stabil die Applikation beim Deployment weiter laufen soll. Die Gesamtkonstruktion führt in der Realität mit dem ELB, EC2 Instanzen und CodeDeploy schonmal dazu, dass Nutzer praktisch vom Deployment weder beeinträchtigt werden noch sonst irgendwie etwas mitbekommen. Wie CodeDeploy konkret im Detail funktioniert, erläutere ich im nächsten Schritt mit dem kompletten DevOps Prozess inkl. CodeCommit, CodeDeploy und CodePipeline.

DevOps komplett: CodePipeline mit CodeCommit und CodeDeploy

Als grundlegend fauler Mensch, ist mir selbst der Prozess mit CodeDeploy noch deutlich zu aufwendig. Gleichwohl erwähnt werden muss, dass allein CodeDeploy schon bedeutende Vorteile und Annehmlichkeiten bietet. Meine Erwartungshaltung ist jedoch, dass ich meinen funktionierenden Code in den Master-Branch meines Git-Repositories einchecke und dieser anschließend voll automatisch in die Produktionssysteme übergeht, wenn er denn einwandfrei funktioniert. Genau das macht CodePipeline in absoluter Perfektion!

Wie man den DevOps Prozess in AWS konfiguriert

Idealerweise fängt man mit der Konfiguration der Systemlandschaft inkl. System-Image "AMI" sowie Lastverteiler etc. an. Wer nur den DevOps-Prozess mit CodePipeline aufsetzen möchte, kann sich auch einer einzelnen EC2-Instanz bedienen. Nachdem dies aufgesetzt ist, sollte man zuerst mit CodeDeploy beginnen. Wenn CodeDeploy einwandfrei funktioniert, kann mit CodePipeline weiter gemacht werden. CodeCommit als Git-Repository in AWS ist in diesem Prozess zwar einfach, da in AWS vorhanden, aber nicht zwingend notwendig.

CodeDeploy mit AppSpec-Datei richtig konfigurieren

Damit CodeDeploy funktioniert, muss eine sog. AppSpec-Datei erstellt werden. In dieser AppSpec-Datei befindet sich die Information, welche Dateien übertragen werden sollen und was nach sowie vor dem Deployment sonst noch alles geschehen soll. Ich habe hier nachfolgend einmal meine AppSpec-Datei als Beispiel.

Die Version ist 0.0 und muss auch so behalten werden. Das System "linux" ist selbsterklärend und nachfolgend in der Sektion "files" meiner appspec.yml Datei finden sich Quellordner und deren Ziel sowie Quelldateien und deren Ziel. Hier ist mit äußerster Vorsicht zu walten! Der Parser der appspec.yml Datei ist nicht sehr fehlertolerant was fehlende Slashes an Ordnern angeht. Ich hatte hier mit einigen Konfigurationsproblemen zu kämpfen. Es empfiehlt sich in jedem Fall das genaue studieren der Dokumentation. Die nachfolgende "permissions"-Sektion gibt an, welche Dateiberechtigung vergeben werden soll. Ich bin da großzügig. Der spannende Teil kommt zum Schluss: die Hooks. Hooks sind Skripte, die bei einem bestimmten Ereignis aufgerufen werden. "BeforeInstall" wird vor der Installation aufgerufen und "AfterInstall" entsprechend danach. Bei mir sieht das Skript "aws-ec2-configure.sh" im "AfterInstall"-Hook wie folgt aus.

Nach erfolgreichem Deployment wird dieses Skript ausgeführt, erstellt die temporären Verzeichnisse für meine Smarty Template-Engine unter PHP und vergibt großzügig Dateiberechtigungen. Ich erachte diese Hooks als recht wichtig, da etwaige notwendige Konfigurationen am System nicht zwangsläufig ausschließlich von der Applikation ausgeführt werden können oder sollten, das AMI System-Image durch viele Deployments verändert bzw. verunreinigt wird und die einfache AppSpec-Datei nicht alle Systemkonfigurationen erlaubt. Mit diesen Utensilien und dem Setup ist man auch schon bereit für das Deployment mit CodeDeploy. Wenn alles einwandfrei funktioniert sind die letzten Schritte zum kompletten DevOps-Prozess inklusive Continuous Delivery jetzt recht einfach!

CodePipeline und Git

CodePipeline mit CodeCommit, GitHub oder S3

Den Wermutstropfen gleich vorweg: CodePipeline funktioniert nur mit CodeCommit, dem Git-Hosting von AWS, GitHub oder S3. Wer sein eigenes Git irgendwo herum liegen hat, kann dieses nicht direkt und unmittelbar an CodePipeline anbinden. Dank der Feinheiten von Git kann man aber natürlich CodeCommit auch zusammen mit dem eigenen Git-Repository nutzen. Wer GitHub nutzt, wird hier ebenfalls bedient.

Was Pipelining ist und wie sie funktioniert

Pipeline zu Deutsch Rohrleitung bezeichnet den Eingang von Programmcode auf der einen Seite und den Ausgang eines fertigen Programmpakets zur Installation auf der anderen Seite. Meine Pipeline ist recht einfach: der Code kommt aus CodeCommit und wird bei jedem neuen Commit in den Master-Branch automatisch ins Deployment übertragen. Zusätzlich bietet AWS noch Testing, manuelle Freigaben über SNS, Build mit diversen Systemen wie AWS CodeBuild, Jenkins oder Solano an. Für das Testing sind mit Jenkins, CodeBuild, Nouvola, BlazeMeter & Co auch einige Dienste anderer Anbieter vertreten.

CodePipeline History

Wie man seine Pipeline mit CodePipeline aufbauen sollte

CodePipeline selbst habe ich als recht einfach in der Hanhabung erfahren. Es empfiehlt  sich auch hier erstmal klein anzufangen. Zusätzliche Stages bzw. Stufen kann man auch nach und nach aufbauen. Desto höher die Komplexität am Anfang ist, desto fehleranfälliger wird es. Mir ist hier insbesondere das Zusammenspiel mit CodeDeploy durchaus schwer gefallen. Im Git-Repository müssen sich wirklich alle Skripte inkl. der Skripte für die Hooks befinden, was mir ein wenig bitter aufstieß. Generell habe ich ungern Deployment-Skripte im Git-Repository meiner Applikation. Kann aber im Grunde auch gut damit leben.

Funktionerende AWS CodePipeline

Abschließendes Fazit zu DevOps mit AWS

Wenn ich einen Bug auf meiner Website fixen möchte, behebe ich den Lokal, teste nochmal durch und pushe dann mein lokales Repository in CodeCommit. Der Rest geht wie von Zauberhand ganz allein und dauert etwa 10 Minuten. Kosten für die ganze Veranstaltung mit CodeCommit, CodePipeline und CodeDeploy habe ich bisher keine gehabt. Der gesamte Prozess für meine Website mit etwa 40 Megabyte Repository und ca. 20 Megabyte Deployment-Paket ist damit bisher bei mir kostenfrei. Am Anfang war ich auch recht skeptisch was den Prozess angeht. Diese Skepsis würde ich heute mit Unwissenheit und Berührungsängsten begründen. Ich kann CodeDeploy, CodePipeline und CodeCommit nur jedem wärmstens empfehlen. Nie wieder Server fummeln!

Bücher zum Thema „DevOps“

Die nachfolgenden Bücher behandeln das Thema "DevOps" und werden von Amazon empfohlen. Viele dieser Bücher habe ich selbst gelesen und teilweise auch zur Recherche für diesen Artikel genutzt.
39,90 €
Jetzt bestellen »
Das DevOps-Handbuch: Teams, Tools und Infrastrukturen erfolgreich umgestalten (Das Handbuch)
Gene Kim, O'Reilly
69,90 €
Jetzt bestellen »
Skalierbare Container-Infrastrukturen: Das Handbuch für Administratoren und DevOps-Teams. Inkl. Container-Orchestrierung mit Docker, Rocket, Kubernetes, Rancher & Co.
Oliver Liebel, Rheinwerk Computing
17,90 €
Jetzt bestellen »
Projekt Phoenix: Der Roman über IT und DevOps - Neue Erfolgsstrategien für Ihre Firma
Gene Kim, O'Reilly
11,40 €
Jetzt bestellen »
Innovationsorientiertes IT-Management mit DevOps: IT im Zeitalter von Digitalisierung und Software-defined Business (essentials)
Rainer Alt, Springer Gabler

Diese Artikel könnten Dich auch interessieren

Besucher, die diesen Beitrag gelesen haben, haben sich auch die unten aufgeführten Beiträge angesehen. Schau' doch einfach mal in die Artikel rein.
5 Besucher haben auch das gelesen
4 Besucher haben auch das gelesen
2 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen

Kommentare zum Thema „DevOps mit AWS und CodePipeline“

Wenn Du möchtest, kannst Du hier Kommentare zum Thema hinterlassen und Dich mit anderen Nutzern austauschen. Damit Du kommentieren kannst, musst Du Dich nur anmelden und schon kann es losgehen.
Jetzt zum Kommentieren anmelden