Die vergangene Dekade verzeichnet einen sehr deutlichen Trend in der IT-Branche: Cloud Computing. Das pay-as-you-go Modell und das automatisierte Skalieren von Anwendungen, angepasst an die Bedürfnisse des Nutzers, haben viele Unternehmen überzeugt Teile ihrer IT-Infrastruktur in die Cloud zu migrieren.
Unglücklicherweise eignen sich die oft monolithischen Codestrukturen der bestehenden Anwendungen nicht ohne weiteres für den Betrieb in der Cloud. Um die Vorteile der Cloud voll auszunutzen, können solche Softwarepakete in kleinere, untereinander kommunizierende, Microservices aufgebrochen werden.
Dies erzeugt allerdings auch weitere Herausforderungen für die Entwickler: Auch nach erfolgreichen Integrationstests offenbaren sich fehlerhafte Kommunikationen zwischen den Microservices unter Umständen erst nach dem Deployment. Das macht ein kontinuierliches Deployment unumgänglich, wenn Fehler früh erkannt und behoben werden sollen. Allerdings kann das Deployment vieler kommunizierender Microservices schnell an Komplexität gewinnen.
Automatisierte Continuous Integration/Continuous Deployment (CI/CD) Lösungen entlasten die Entwickler bei der Aufgabe den Code zu verwalten, zu testen und zu deployen. Natürlich sollten auch diese CI/CD Lösungen automatisch mit der Größe des Projekts skalieren, mehr dazu in unserem Blogbeitrag „Spinning Up an Elastic CI-Pipeline using Jenkins and Kubernetes“. Der Einsatz dieser etablierten Tools erlaubt zwar vollständige Kontrolle über die CI/CD Pipeline, erhöht allerdings auch den Aufwand diese aufzusetzen und zu administrieren.
Aus diesem Grund bietet Amazon eine Reihe Cloud-nativer Development Tools an, die das Aufsetzen einer vollständigen CI/CD Pipeline erleichtern (siehe Abbildung 1). Dabei ist es dem Entwickler überlassen, wieviel der Administration einer solchen CI/CD Pipeline er selbst übernehmen will und wieviel er dem Automatismus überlassen will. Im Folgenden stellen wir die AWS Services für die CI/CD Pipeline kurz vor und erläutern ihre Zusammenhänge.
AWS CodeCommit
AWS CodeCommit ist ein auf Git basierendes Coderepository. Es integriert mit anderen Services der AWS Cloud, zum Beispiel AWS IAM für das Management der Benutzer oder AWS CloudWatch für das Überwachen des Repository. Cross-Account Zugänge können Nutzern außerhalb des übergeordneten AWS Accounts den Zugriff auf das Repository erlauben. Amazon stellt die Hardware bereit und skaliert sie automatisch mit der Größe des Projekts. Alle Daten werden mithilfe des AWS KMS Dienstes automatisch verschlüsselt. Events können konfiguriert werden, damit Entwickler oder andere Services über AWS SNS und AWS Lambda automatisch benachrichtigt werden, wenn zum Beispiel Code gepusht oder Pull Requests erstellt werden. Diese Events erlauben auch das Auslösen der automatisierten CI/CD Pipeline.
AWS CodeBuild
AWS CodeBuild erlaubt das vollautomatisierte Kompilieren und Testen des Codes. Dazu startet der Dienst Docker Container, die entweder von Amazon bereitgestellt oder selbst verwaltet sind. AWS CodeCommit, GitHub, Bitbucket oder AWS S3 stellen den Code bereit. Auch AWS CodeBuild nutzt die üblichen Vorteile der AWS Cloud: Die von AWS bereitgestellte Hardware skaliert automatisch mit der Anzahl an angeforderten Builds, Verschlüsselung der Daten erfolgt unter der Nutzung von AWS KMS und AWS IAM verwaltet die Berechtigungen der Nutzer. AWS CloudWatch hilft bei der Überwachung des Service und sammelt die Logs der Buildprozesse. Selbstkonfigurierte Events leiten weitere CI/CD Schritte ein oder senden wichtige Informationen an Entwickler.
Ein wichtiger Teil von AWS CodeBuild ist die Konfiguration des Buildprozesses in Form der buildspec.yml Datei, die im Rootverzeichnis des Projekts liegt. Hier können genaue Anweisungen für das Aufsetzen der Buildumgebung, das Kompilieren und das Testen des Codes angegeben werden.
AWS CodeDeploy
AWS CodeDeploy hilft bei dem Deployment der Anwendungen auf EC2 oder On-Premises Instanzen sowie in AWS Lambda Funktionen. Die appspec.yml Datei enthält dabei die genauen Anweisungen für das Stoppen vorheriger Anwendungsversionen, das Konfigurieren der Anwendungsumgebung und das Starten der neuen Anwendungsversion. Unterschiedliche Deploymentstrategien, wie zum Beispiel Canary oder Blue/Green Deployments, erlauben eine Testperiode der Anwendung innerhalb einer vollständigen Produktionsumgebung. Sollten an dieser Stelle Komplikationen auftauchen, sorgen automatische Rollbacks für das Deployment der letzten funktionstüchtigen Version. Auch hier können Events konfiguriert werden, um die Entwickler über Ablauf und eventuelle Komplikationen des Deployments auf dem Laufenden zu halten.
AWS CloudFormation
AWS CloudFormation übernimmt die Aufgabe der Ressourcenbereitstellung für die Anwendungsumgebung. Dies beschränkt sich nicht nur auf Deployments selbstentwickelter Anwendungen, sondern schließt auch generelle Cloudarchitekturen mit ein. Daher gehört AWS CloudFormation nicht direkt zum AWS Development Toolstack. In einem CloudFormation-Template ist eine komplette Cloud-Infrastruktur in Form von YML oder JSON Code definiert. Hier können alle AWS-Ressourcen vollständig konfiguriert werden. Parameter erlauben das Generalisieren solcher Infrastrukturen, zum Beispiel für Development und Production Umgebungen. Outputs geben Informationen aus, die auch von weiteren CloudFormation Templates referenziert werden können. Dies erlaubt das Wiederverwenden genereller Building Blocks in komplizierten Infrastrukturen.
AWS Elastic Beanstalk
AWS Elastic Beanstalk erstellt vollautomatisiert vollständige Deploymentumgebungen. Dabei nutzt es implizit AWS CloudFormation zur Ressourcenbereitstellung und AWS CodeDeploy für das Deployment der Anwendung innerhalb der erstellten Infrastruktur. Dem Entwickler wird damit die Aufgabe abgenommen, selbst ein CloudFormation Template für die Ressourcenbereitstellung zu erstellen. Zudem wird die Integration von CodeDeploy automatisiert. Der Nachteil ist die geringere Flexibilität bei der Architektur der Cloud-Infrastruktur.
AWS CodePipeline
AWS CodePipeline orchestriert den kompletten CI/CD Workflow. CodePipeline definiert sogenannte Stages, die die einzelnen Schritte des CI/CD Workflows repräsentieren (siehe Abbildung 2). Beginnend mit einem Coderepository (CodeCommit, GitHub oder S3) verfolgt CodePipeline automatisiert Events, die den Buildprozess starten. Im Falle eines solchen Events gibt CodePipeline den Quellcode aus dem Coderepository als Artifacts über S3 an die Build-Stage weiter. Hier übernehmen Build Tools wie Jenkins oder AWS CodeBuild das Building und Testing entsprechend der Spezifikationen der Entwickler. Etwaige Buildartifacts, wie zum Beispiel Binaries, werden wiederum an die Deployment-Stage weitergegeben. AWS Elastic Beanstalk, AWS Cloudformation oder AWS CodeDeploy präsentieren Optionen, um die fertige Anwendung zu deployen. Es können zusätzliche Stages hinzugefügt werden, zum Beispiel um manuelle Bestätigungen durch Projektleiter einzuführen. Sollte eine der Stages fehlschlagen bricht der CI/CD Workflow sofort ab.
AWS CodeStar
AWS CodeStar ist ein Service, der alle bisher genannten Services nutzt, um eine vollständige CI/CD Pipeline zu erstellen. In nur wenigen Handgriffen innerhalb der AWS Console wird eine vollständige AWS CodePipeline aufgesetzt, inklusive zugehörigem Coderepository und AWS CodeBuild Tool. Die Deployment-Stage nutzt, je nach verwendetem Projekttemplate (für eine Übersicht siehe Abbildung 3), AWS CodeDeploy, AWS CloudFormation, oder AWS Elastic Beanstalk. Das Template stellt ebenfalls bereits buildspec.yml und, falls erforderlich, appspec.yml Dateien bereit. CloudWatch ist automatisch integriert und liefert Usagereports in Form eines Dashboards innerhalb der AWS Console. Unterliegende Konfigurationen, wie CodePipeline Stages oder Buildanweisungen innerhalb der buildspec.yml, können nachträglich variiert werden. Somit ist AWS CodeStar ein idealer Startpunkt für neue Projekte. Der Nachteil hier ist ebenfalls, dass man durch die vorhandenen Projekttemplates auf wenige Projektarten beschränkt ist.
Fazit
Mit einer Reihe grundlegender Services bietet AWS alle Tools für eine komplette CI/CD Pipeline. Alle Services skalieren automatisch mit der Größe des Projekts und arbeiten nach dem pay-as-you-go Modell. Durch übergeordnete Orchestration Services wie AWS CodePipeline und AWS CodeStar bietet AWS die Möglichkeit die Last der Konzeption und Administration einer CI/CD Pipeline von den Entwicklern zu nehmen. Durch die unterschiedlichen Levels an Orchestration, gegeben durch diese beiden Services und durch AWS Elastic Beanstalk, können Entwickler selbst bestimmen, wie feingranuliert sie Ihre CI/CD Pipeline kontrollieren wollen und sich damit besser auf das Wesentliche konzentrieren – das Entwickeln ihrer Anwendung.