{"id":12032,"date":"2020-09-30T20:05:04","date_gmt":"2020-09-30T18:05:04","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=12032"},"modified":"2023-08-06T21:42:00","modified_gmt":"2023-08-06T19:42:00","slug":"admin-panel-web-app-in-der-aws-cloud","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/09\/30\/admin-panel-web-app-in-der-aws-cloud\/","title":{"rendered":"Admin Panel (Web App) in der AWS Cloud"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Einleitung<\/h2>\n\n\n\n<p>Im Rahmen der Vorlesung \u201eSoftware Development for Cloud Computing\u201c haben wir uns als Gruppe dazu entschieden aufbauend auf teilweise bereits vorhandener Codebasis an einem Startup-Projekt weiterzuarbeiten. Der Hauptfokus lag bei uns auf dem Ausbau von DevOps-Aspekten und auf dem eines stabilen und sicheren Systems, welches auch in der Production-Environment eingesetzt werden kann. Bei einem umfangreichen Projekt wie diesem spielen nat\u00fcrlich auch \u00dcberlegungen zu Skalierbarkeit und Kosten eine recht gro\u00dfe Rolle. Punkte und Ziele wie diese werden wir sp\u00e4ter im Beitrag noch genauer betrachten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. \u00dcber das Projekt<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/8wC5m1echmIwAaYk8kSapM4qgDsb2b4nMQK-lgDW3EIH7DOG8mO9qVxYKy6vvqr7WaTPtYiZx-FJy05Ms4a7aaSzDtPJpKYzV_2rDrlXjEjERcK0spGRyodO2-WWlwGQr8kiGHLa.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Im Rahmen einer Startup-Idee war es das Ziel, eine Art Admin-Panel zu erstellen, auf dem Restaurants u. a. ihre w\u00f6chentlich wechselnden Gerichte eintragen und managen k\u00f6nnen. Dabei werden dann automatisch N\u00e4hrwertangaben, rechtliche Kennzeichnungen wie Allergene und weitere Informationen \u00fcber Nahrungsmittel hinzugef\u00fcgt und verwaltet. Sp\u00e4ter sollen Kunden automatisch ein Men\u00fc, das speziell auf ihren Ern\u00e4hrungsplan angepasst ist, erstellt bekommen. Das gesunde und auf sie abgestimmte Essen bekommen die Kunden dann frisch geliefert.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/uu_hklsJWVOhpVqRBGEZLBe53r0t5FjmpzBjyVGYXBBfaetzqYzy8OrgQwuHKSB59hBo3pFsA3_zZFHhDo7sjkfepKnM_Tb8saf6q7IZyThi0jTyRIMY9VDXxE0QLxeRxessjBz3.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Das Admin-Panel wurde als SPA mit Vue.js im Frontend und mit einer GraphQL-API auf Basis von Go realisiert. F\u00fcr die Speicherung von Daten nutzen wir PostgreSQL. Dar\u00fcber hinaus verwenden wir Services von AWS zur Authentifizierung von Benutzern und f\u00fcr die Ablage von User-Uploads. Die folgende Grafik zeigt eine vereinfachte Darstellung der einzelnen Services und Beziehungen untereinander.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/PN6jr3EuHHKyPxA-T_q13eFlvGEu-hjFkbK_DXQ7TSs2_b3EnX1Rxdv76MdveMoKzJSh5PcK_xk_0U5_8yyz7tfmjmJaucrSsQ9X6WmPUEHWncmN1WPAc7ZZwRPtxRDIfx-NTcVj.png\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3. Cloud-Architektur<\/h2>\n\n\n\n<p>In diesem Kapitel erkl\u00e4ren wir, mit welchen AWS Services wir die grundlegende Architektur der Applikation in die Cloud gebracht haben. Wir haben uns f\u00fcr AWS als Cloud-Anbieter entschieden, da es den mit Abstand gr\u00f6\u00dften Marktanteil genie\u00dft und einer der ganz ersten Anbieter von Cloud-Computing-Diensten war. Diese Attribute bringen mit sich, dass f\u00fcr AWS die meisten Ressourcen online oder als Literatur zur Verf\u00fcgung stehen. Dadurch versprachen wir uns einen leichteren Einstieg in das Themengebiet. Zudem hat AWS die gr\u00f6\u00dfte und global verteilteste Infrastruktur. Auch das Angebot an Cloud-Diensten ist bei AWS mit Abstand mit gr\u00f6\u00dften und dar\u00fcber hinaus noch sehr diversifiziert, wodurch wir in dieser \u00d6kosph\u00e4re alles finden w\u00fcrden, was wir jemals brauchten. Vergleichbare Dienste anderer Cloud-Anbieter sind oft auch nicht so ausgereift und entwickelt wie bei AWS.<\/p>\n\n\n\n<p>Die gesamte Cloud-Architektur haben wir dabei mit Terraform bereitgestellt. Terraform erm\u00f6glicht das Provisionieren von Ressourcen in der Cloud in einer Templating-Syntax. Dies wird gemeinhin als Infrastructure as Code (IaC) bezeichnet. Die Vorteile sind vielseitig:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die \u00dcbersicht der Ressourcen bleibt erhalten und geht nicht im Wirrwarr der AWS Konsole verloren.<\/li>\n\n\n\n<li>Die Infrastruktur kann wie Programmcode versioniert werden und bringt damit die \u00fcblichen Vorteile eines Versionskontrollsystems mit sich.<\/li>\n\n\n\n<li>Ressourcen k\u00f6nnen \u00fcber das Terraform CLI hochgefahren und wieder heruntergefahren werden und machen die \u00dcbertragung auf andere Cloud-Accounts damit sehr einfach.<\/li>\n\n\n\n<li>Die Abstrahierung von Terraform Code in Modulen und verschiedene syntaktische Hilfsmittel erlaubten es uns eine Unterteilung zwischen der Development-, Staging- und Production-Umgebung komfortabel zu pflegen.<\/li>\n<\/ul>\n\n\n\n<p>Der folgende Code zeigt die Datei <code class=\"\" data-line=\"\">main.tf<\/code> f\u00fcr unsere Staging-Umgebung. Von hier aus steuern wir \u00fcber selbst erstellte Terraform-Module die Provisionierung unserer ben\u00f6tigten Services an. Die Abstraktion in Module macht es uns m\u00f6glich, diese Konfigurationen f\u00fcr jede Umgebung separat vorzunehmen und dabei nicht unn\u00f6tig Code zu wiederholen.<\/p>\n\n\n\n<script src=\"https:\/\/gitlab.mi.hdm-stuttgart.de\/-\/snippets\/61.js\"><\/script>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/qw9ZkWnvR4M?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span>\n<\/div><figcaption class=\"wp-element-caption\">Kurzer \u00dcberblick zum Cloud-Ansatz<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Frontend (Client)<\/h3>\n\n\n\n<p>Beim Frontend handelt es sich um ein kompiliertes Vue.js-Projekt, also um nicht mehr als statische Dateien. Das Vorgehen bei der Bereitstellung in der AWS Cloud ist daher sehr einfach und direkt: Statische Dateien werden in ein \u00f6ffentliches S3-Bucket hochgeladen. Das allein reicht sogar schon um eine Webseite zu betreiben. Es ist aber sehr empfehlenswert einen CDN-Dienst davor zu schalten, im Fall von AWS: CloudFront.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/7mGQOO7PiWTTtvvI5vp8Wn330GxJHvT5rt3sl5XWamPT_Sws5NM8tZfEzK1AvDbmtFyLolfJmYde0sCpuV7zlXQGIOzXb01OzO2pdIVxIc__mo0dyjHMBYPyE-TM_EoM9dX1QmJY.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Quelle: <a href=\"https:\/\/aws.amazon.com\/de\/blogs\/networking-and-content-delivery\/amazon-s3-amazon-cloudfront-a-match-made-in-the-cloud\/\">https:\/\/aws.amazon.com\/de\/blogs\/networking-and-content-delivery\/amazon-s3-amazon-cloudfront-a-match-made-in-the-cloud\/<\/a><\/p>\n\n\n\n<p>CloudFront dient zum Erreichen gecachter statischer Dateien und verf\u00fcgt \u00fcber ein global verteiltes Netzwerk an Servern. Das bedeutet, dass sich die Latenz verringert, da das Frontend vom n\u00e4chstgelegensten CloudFront-Standort geholt wird, anstatt vom Standort des S3-Buckets. Au\u00dferdem k\u00fcmmert sich CloudFront f\u00fcr uns um SSL, DDoS Protection und mehr.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Backend (API &amp; Datenbank)<\/h3>\n\n\n\n<p>Die Wahl des Cloud-Stacks f\u00fcr das Backend einer Webanwendung ist sehr viel komplizierter als f\u00fcr das Frontend. Die Auswahl geht von EC2-Instanzen \u00fcber Kubernetes, Elastic Beanstalk bis hin zu Serverless-Funktionen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3.2.1 Der richtige Service f\u00fcr das API<\/h4>\n\n\n\n<p>Die Frage hin zum Serverless-Stack sollte man sich am Anfang der Programmierung stellen. Lambda-Funktionen bieten viele Vorteile, vor allem in Hinsicht auf Kosten, zudem gro\u00dfe Sicherheit im Hinblick auf Skalierung. Wir entschieden uns dagegen. Ein Grund daf\u00fcr war, dass wir f\u00fcr eine Admin-API keine unerwartet hohen, sondern eher konstant bleibende Anfragen erwarteten. Der Hauptgrund war aber wahrscheinlich die unzureichend entwickelte \u00d6kosph\u00e4re rund um Entwicklertools f\u00fcr ein zunehmend komplexes Software-Projekt.<\/p>\n\n\n\n<p>EC2-Instanzen, welche im Grunde nur virtuelle Maschinen sind, schienen uns nicht spezialisiert genug f\u00fcr einen Service, der einfach nur unsere Docker-Images ausf\u00fchren soll und au\u00dferdem noch zu m\u00e4chtig. Diese Option schied also direkt aus.<\/p>\n\n\n\n<p>AWS selber bewirbt Elastic Beanstalk (EB) sehr stark als Wahl zur Bereitstellung von Webanwendungen. Wir k\u00f6nnen technisch nicht genau argumentieren, warum wir uns gegen diese L\u00f6sung entschieden haben. Allerdings sind wir bei unserer Recherche auf sehr viel Kritik gegen\u00fcber diesen Dienst gesto\u00dfen. Professionelle DevOps-Engineers rateten immer gegen EB und stattdessen zu einem Container-Service.<\/p>\n\n\n\n<p>Hierbei bieten sich zwei Optionen: Der Industrie-Standard Kubernetes und der kleine Bruder, speziell von AWS entwickelte Elastic Container Service (ECS). Keiner von uns hatte viel Erfahrung mit Kubernetes, wir h\u00f6rten nur, es sei m\u00e4chtiger und flexibler in der Konfiguration, daf\u00fcr aber auch teurer. Nichts davon k\u00f6nnten wir gebrauchen. Der ECS macht daf\u00fcr genau das, was wir wollen: Er betreibt Instanzen unseres API-Images, kann dies verbunden mit einem Load Balancer horizontal skalieren und ist sogar mit Auto-Scaling-Policies verkn\u00fcpfbar.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3.2.2 Datenbank<\/h4>\n\n\n\n<p>Zum Betreiben unserer Postgres-Datenbank nutzen wir einen eigenen spezialisierten Service, was auch sehr zu empfehlen ist. Im Falle von AWS ist das der Relational Database Service (RDS), zumindest f\u00fcr relationale Datenbanken. Die Hardware ist speziell f\u00fcr Datenbankzugriffe abgerichtet, System-Updates und Backup-Automatisierungen sind mit inbegriffen. Auch Aspekte wie Skalierung und Ausfallsicherheit (hohe Verf\u00fcgbarkeit durch Replikas) k\u00f6nnen mit diesem Dienst einfach realisiert werden.<\/p>\n\n\n\n<p>RDS bietet mit Aurora auch einen speziellen Typ Engine an, der die Autoskalierung von Datenbanken erm\u00f6glicht. Das Angebot ist recht neu und definitiv sehr interessant. Es soll au\u00dferdem eine h\u00f6here Performance (3x schneller bei Postgres-Datenbanken) bieten. Wir haben uns dagegen entschieden bzw. noch nicht daf\u00fcr entschieden, aus zwei Gr\u00fcnden:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>RDS Aurora ist schon in der Basis-Skalierung deutlich teurer als eine einfache RDS-Instanz.<\/li>\n\n\n\n<li>Bislang unterst\u00fctzt Aurora Postgres nur in der Version 10 und wir w\u00fcrden die Features verlieren, die sich uns mit Postgres 12 bieten.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">3.2.3 VPC<\/h4>\n\n\n\n<p>Aus Sicherheitsgr\u00fcnden wollen wir die Datenbank nicht ans Internet anschlie\u00dfen. Sie soll nur von unseren API-Diensten erreichbar sein. Das bedeutet, wir m\u00fcssen uns eine VPC einrichten, eine Virtual Private Cloud.<\/p>\n\n\n\n<p>Die VPC besteht zum einen aus einem Private Subnet, hierin lebt unser ECS und unsere Datenbank, und zum anderen aus einem Public Subnet, hier erm\u00f6glicht ein NAT Gateway die Verbindung nach au\u00dfen. Eine harte Bedingung des ganzen ist die Distribution auf mindestens zwei Availability Zones, darum sind es, um genau zu sein, jeweils zwei Private Subnets, Public Subnets und NAT Gateways.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/fcM4A9xs-Z4UxxWacMxLHUdbhpVPPzJ2c1OfYZhpxKINnbaNDgewrRQj_969ETOmo4m9SYwAN92tp7xWS2v7kAexrY0afP2f7YlvBf1fVimDLjXRD1lEsR_WHXSMArs4XITqLyVo.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Quelle: <a href=\"https:\/\/user-images.githubusercontent.com\/884507\/34551896-a3a838a6-f0d2-11e7-8858-c4de887fb225.png\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/user-images.githubusercontent.com\/884507\/34551896-a3a838a6-f0d2-11e7-8858-c4de887fb225.png\">https:\/\/user-images.githubusercontent.com\/884507\/34551896-a3a838a6-f0d2-11e7-8858-c4de887fb225.png<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 User Uploads CDN<\/h3>\n\n\n\n<p>Eine Sub-Architektur in unserer Infrastruktur will noch getrennt betrachtet werden. Die Rede ist vom sogenannten \u201cServerless-Image-Handler\u201d, hier\u00fcber wickeln wir ab, wie von Benutzern hochgeladene Bilddateien aufgerufen werden.<\/p>\n\n\n\n<p>Wenn Benutzer eigene Bilder hochladen, geht die Anfrage \u00fcber unsere API und wird dann in einen S3-Bucket abgelegt. Diese Bilder werden an verschiedenen Stellen aufgerufen, z.B. in der Detail- und Listenansicht von Rezepten. Da die Bilder von Benutzern hochgeladen werden, ist die Bild- und Dateigr\u00f6\u00dfe variabel und auch nicht optimiert. Bei der Listenansicht ist uns dann aufgefallen, das wir ja 15 Bilder gleichzeitig laden und sie eigentlich nur in eine Gr\u00f6\u00dfe von 80&#215;60 Pixeln f\u00fcr das Thumbnail ben\u00f6tigen. Also potenziell mehrere Megabyte an Datentraffic nur zum Laden der Listenansicht.<\/p>\n\n\n\n<p>Bei der Suche nach einer L\u00f6sung sind wir dann relativ schnell auf den \u201cServerless-Image-Handler\u201d gesto\u00dfen, eine Komplettl\u00f6sung von AWS in Form eines CloudFormation-Stacks.<\/p>\n\n\n\n<p>Diese L\u00f6sung involviert einen CloudFront-Endpunkt, einen API Gateway, eine Lambda-Funktion und nat\u00fcrlich das S3-Bucket, in dem die Bilddateien abgelegt sind. Es funktioniert dabei wie folgt: Das Bild wird von dem CloudFront-Endpunkt angefragt. Die Anfrage beinhaltet den Namen des S3-Objekts und die gew\u00fcnschte Skalierung. CloudFront leitet die Anfrage an das API Gateway, welches eine Lambda triggert. In dieser Lambda wird das Objekt aus dem S3-Bucket geholt, skaliert und komprimiert. Schlie\u00dflich wird die optimierte Bilddatei an den Client zur\u00fcck\u00fcbermittelt. Von nun an befindet sie sich au\u00dferdem im CloudFront-Cache und kann bei der n\u00e4chsten Anfrage sogar deutlich schneller abgerufen werden.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/FHGIhOACAEjNoq7Ejr9UlQXnfI8Byg1-DfimiNtbOR3oGGuYlfNgRi2PAD05mppwHJ0mCPOnMsvvhjE8KFv9nF3EqIIiOSxOGwyIt2CU4PYJku4ruJNV8wp-hwvbpv3hjHzZjrvu.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Quelle: <a href=\"https:\/\/aws.amazon.com\/de\/solutions\/implementations\/serverless-image-handler\/\" title=\"https:\/\/aws.amazon.com\/de\/solutions\/implementations\/serverless-image-handler\/\">https:\/\/aws.amazon.com\/de\/solutions\/implementations\/serverless-image-handler\/<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. CI\/CD<\/h2>\n\n\n\n<p>Der Aufbau einer CI\/CD-Pipeline ist meist recht komplex und herausfordernd. Hier kann man nur raten, wie man es aufbauen soll, damit es von Anfang an solide und \u201clanglebig\u201d ist. Man muss dabei auch im Hinterkopf behalten und sich genau \u00fcberlegen, wie alles zusammenspielen soll, wenn sp\u00e4ter mit mehreren Leuten zusammengearbeitet werden soll. Prinzipiell gibt es nicht die eine richtige L\u00f6sung f\u00fcr eine CI\/CD, denn die Anforderungen daran sind auch vom jeweiligen Projekt abh\u00e4ngig. Selbstverst\u00e4ndlich bietet ein Versionskontrollsystem wie bspw. Git oder SVN in erster Linie die Basis f\u00fcr eine CI\/CD-Pipeline. Bei unserer Pipeline war es uns zum einen wichtig, vorprogrammierte Tests ausf\u00fchren zu k\u00f6nnen (CI) und zum anderen, das Deployment auf unsere Staging-Environment, als auch auf unsere Production-Environment zu automatisieren (CD).<\/p>\n\n\n\n<p>Bevor man sich mit dem Thema auseinandersetzt, sollte man \u00fcberlegen, was man f\u00fcr das Projekt braucht, um beispielsweise Tests ausf\u00fchren zu k\u00f6nnen. In unserem Fall nutzen unsere Integration-Tests eine eigene Datenbank.<\/p>\n\n\n\n<p>Zum automatisierten Testen sollte man dabei m\u00f6glichst Production-nahe Bedingungen herstellen, da sich sonst anstrengende Bugs einschleichen k\u00f6nnen, die man erst in Production bemerkt, obwohl die eigene Test-Suite diesen Fall schon abgedeckt h\u00e4tte. Diese Fehler zu finden ist dann sehr m\u00fchsam, da man normalerweise davon ausgeht, dass etwas, was erfolgreich getestet wurde, auch funktioniert. Man m\u00f6chte also die Umgebung (Betriebssystem, Abh\u00e4ngigkeiten, Konfiguration, &#8230;) identisch halten.<\/p>\n\n\n\n<p>F\u00fcr das Testing in unserer CI-Pipeline nutzen wir daher Docker und Docker-Compose. Dies erm\u00f6glicht uns, das Testing auf dem Image des Projekts auszuf\u00fchren, anstatt in der Laufzeitumgebung des CI-Runners. Die Vorteile der Konsistenz tauscht man hier gegen h\u00f6here Kosten und Wartezeit beim Ausf\u00fchren der CI.<\/p>\n\n\n\n<p>Der CD-Teil unserer CI, also das Continuous Deployment, wird bei uns im Anschluss auf das Testing f\u00fcr Commits im develop- und master-Branch ausgef\u00fchrt. Das Docker Image wird hier entsprechend getaggt und in die Registry von AWS hochgeladen. Abschlie\u00dfend wird mithilfe der AWS CLI der ECS Cluster neu gestartet, wodurch das neue Image Anwendung findet. Bei unserem Vue.js-Projekt werden die kompilierten Dateien wiederum nur mit dem S3-Bucket synchronisiert und der CloudFront Cache invalidiert, um CD zu realisieren.<\/p>\n\n\n\n<p>Alles ist so darauf eingerichtet, dass unsere Staging-Umgebung dem Stand des Branches develop entspricht und unsere Production-Umgebung dem von master.<\/p>\n\n\n\n<p>Im Folgenden zum Zwecke der Veranschaulichung, seht ihr die CircleCI-Konfiguration f\u00fcr unser API-Repository. Wir haben auch jeweils weitere Pipelines konfiguriert f\u00fcr unser Cloud-Repository (bestehend aus TerraForm Dateien) und dem Repository, welches unser Vue.js-Frontend enth\u00e4lt.<\/p>\n\n\n\n<script src=\"https:\/\/pastebin.com\/raw\/qvMvqXEC\"><\/script>\n<script src=\"https:\/\/pastebin.com\/raw\/vnr6z759\"><\/script>\n\n\n\n<script src=\"https:\/\/gitlab.mi.hdm-stuttgart.de\/-\/snippets\/62.js\"><\/script>\n\n\n\n<p>Wir haben uns u.a. aufgrund positiver pers\u00f6nlicher Erfahrungen f\u00fcr CircleCI entschieden. Dieser Dienst verf\u00fcgt \u00fcber eine hervorragende Dokumentation und Support. Des Weiteren ist er sehr m\u00e4chtig in seiner Konfiguration. Bevor wir CircleCI nutzten, versuchten wir eine CI mit GitHub Actions aufzubauen. Der Dienst war zu dem Zeitpunkt noch sehr neu bzw. ist es immer noch. Wir hatten gro\u00dfe Probleme bei der Einrichtung einer CI mit Docker-Compose und eine generell schlechte Erfahrung gemacht. Das einzige Problem bei CircleCI, welches uns erst im sp\u00e4teren Verlauf bewusst wurde, ist dass es sehr kostspielig ist, und das auch im Vergleich mit \u00e4hnlich starken CI-Diensten. In der Zukunft wollen wir eventuell auf GitLab CI wechseln und w\u00fcrden uns dabei auch \u00fcberlegen, den CI-Runner selbst auf der AWS-Plattform zu hosten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Weitere Services<\/h2>\n\n\n\n<p>Die AWS Cloud bietet noch eine Vielzahl weiterer Services, u.a. auf der Ebene von Software-as-a-Service (SaaS), aus der wir uns bedienen.<\/p>\n\n\n\n<p>F\u00fcr die Authentifizierung von Admins bzw. Mitarbeitern und Kunden verwenden wir Cognito User-Pools. Cognito ist die AWS Komplettl\u00f6sung f\u00fcr Authentifizierung. Hier\u00fcber k\u00f6nnen auch Verifikationsmails, 2FA-Verfahren, Passwort-vergessen-Dialoge und mehr konfiguriert werden. Den E-Mailversand von Cognito haben wir bspw. mit einem weiteren Service von AWS verbunden: Simple Email Service (SES).&nbsp;<\/p>\n\n\n\n<p>Ein weiterer wichtiger AWS Service, den wir nutzen, ist Route 53. Hier\u00fcber setzen wir unsere DNS-Regeln und richten uns Subdomains f\u00fcr diverse CloudFront-Endpunkte und das API Backend ein.<\/p>\n\n\n\n<p>Wir verwenden au\u00dferdem noch die Amazon Translate API zum Internationalisieren von Texten auf der Webseite und Lambda-Funktionen als Verbindungsst\u00fcck zwischen verschiedenen AWS Services.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Fazit<\/h2>\n\n\n\n<p>Wir haben in diesem Projekt nat\u00fcrlich sehr viel gelernt. Cloud-Computing, die AWS Cloud oder der Ansatz von Infrastructure as Code waren f\u00fcr uns alle vor diesem Projekt Neuland. Dementsprechend mussten wir uns in sehr viele Themen einarbeiten und das Projekt hat sich \u00fcber die Zeit auch immer wieder gewandelt. Heute sind wir aber sehr zufrieden mit unseren Entscheidungen \u00fcber Infrastruktur und vor allem \u00fcber unsere DevOps-Prozesse und die Integrationen zu Team Software, wie Jira oder Slack, die die Entwicklung sehr viel angenehmer gestalten.<\/p>\n\n\n\n<p>Was die eigentliche Infrastruktur angeht, denken wir, werden wir nochmal besser dar\u00fcber reflektieren k\u00f6nnen, wenn die Anwendung tats\u00e4chlich in Production geht. Dann sehen wir uns bestimmt nochmal versch\u00e4rft mit anderen Themen, wie Logging und Monitoring, konfrontiert.<\/p>\n\n\n\n<p>Letztendlich m\u00f6chten wir euch dazu motivieren, euch auch intensiver mit dem Thema Cloud &amp; DevOps zu besch\u00e4ftigen. Es hat uns sehr viel Zeit und Anstrengung gekostet, die Konzepte von Cloud-Computing zu verstehen und uns bei den vielen Services zurechtzufinden. Mittlerweile f\u00fchlen wir uns in dieser Welt aber sehr wohl. Mit dem angeh\u00e4uften Wissen sehen wir uns in der Lage skalierbare Anwendungen auf Enterprise-Niveau zu ver\u00f6ffentlichen und zu verwalten. Auch die viele Arbeit, die wir in unsere DevOps-Strategie gesteckt haben, macht sich in der Entwicklung bezahlt und hilft uns, nachhaltig gute und zuverl\u00e4ssige Software zu schreiben.<\/p>\n\n\n\n<p><em>Von Marcel Gregoriadis, Julian Fritzmann, Sandro Schaier &amp; Jan Groenhoff.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Einleitung Im Rahmen der Vorlesung \u201eSoftware Development for Cloud Computing\u201c haben wir uns als Gruppe dazu entschieden aufbauend auf teilweise bereits vorhandener Codebasis an einem Startup-Projekt weiterzuarbeiten. Der Hauptfokus lag bei uns auf dem Ausbau von DevOps-Aspekten und auf dem eines stabilen und sicheren Systems, welches auch in der Production-Environment eingesetzt werden kann. Bei [&hellip;]<\/p>\n","protected":false},"author":973,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[120,262,650],"tags":[],"ppma_author":[831],"class_list":["post-12032","post","type-post","status-publish","format-standard","hentry","category-cloud-technologies","category-rich-media-systems","category-scalable-systems"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":11711,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/09\/29\/perfekter-gluhwein-fur-zuhause-thermometer-mit-raspberry-pi-und-aws\/","url_meta":{"origin":12032,"position":0},"title":"Perfekter Gl\u00fchwein f\u00fcr Zuhause: Thermometer mit Raspberry Pi und AWS","author":"jg129","date":"29. September 2020","format":false,"excerpt":"Abstract Kein anderes Getr\u00e4nk ist mit Weihnachtsm\u00e4rkten so verbunden wie Gl\u00fchwein. Und so trinkt sich der ausschweifende Weihnachtsmarktbesucher im Laufe der Adventszeit von Stand zu Stand bis er schlie\u00dflich am Ende des Jahres seinen Lieblingsstand gefunden hat. Doch auch daheim kann der perfekte Gl\u00fchwein gelingen.\u00a0 Wir zeigen, wie man sich\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/lh3.googleusercontent.com\/rbu36fXExVo14XfyUicXbIFjAgh1bvNnXHlaUVRfqLevpyZx4KVyjeuYdgItPx6y39R8L9Ub_hug03LYM3AIAW_F14vhBiXOZlt92qIpN0Y2h0H-czZ65ERnn3qUoWVh7JfI5ihA","width":350,"height":200,"srcset":"https:\/\/lh3.googleusercontent.com\/rbu36fXExVo14XfyUicXbIFjAgh1bvNnXHlaUVRfqLevpyZx4KVyjeuYdgItPx6y39R8L9Ub_hug03LYM3AIAW_F14vhBiXOZlt92qIpN0Y2h0H-czZ65ERnn3qUoWVh7JfI5ihA 1x, https:\/\/lh3.googleusercontent.com\/rbu36fXExVo14XfyUicXbIFjAgh1bvNnXHlaUVRfqLevpyZx4KVyjeuYdgItPx6y39R8L9Ub_hug03LYM3AIAW_F14vhBiXOZlt92qIpN0Y2h0H-czZ65ERnn3qUoWVh7JfI5ihA 1.5x"},"classes":[]},{"id":23517,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/29\/multiplayer-game-with-aws-stadtlandfluss\/","url_meta":{"origin":12032,"position":1},"title":"Multiplayer Game with AWS |\u00a0StadtLandFluss","author":"gi004","date":"29. August 2022","format":false,"excerpt":"Dieser Blogbeitrag soll einen Einblick in die Entwicklung unserer Webanwendung mit den unten definierten Funktionen geben sowie unsere L\u00f6sungsans\u00e4tze, Herausforderungen und Probleme aufzeigen.\u00a0 Cloud Computing VorlesungProjekt Idee & InspirationZielEinblick in das Spiel \u2013 DemoFrameworks - Cloud Services - InfrastructureArchitekturCloud KomponentenAWS ServicesDynamo DBS3LambdaAmazon API- GatewayAmazon CloudWatchTestingCI\/CD PipelineSchwierigkeitenFazit Cloud Computing Vorlesung Ziel\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":22460,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/himbeer-tarte-und-harte-fakten-im-interview-mit-ansible-k3s-infrastructure-as-code-und-raspberry-pi\/","url_meta":{"origin":12032,"position":2},"title":"\u201cHimbeer Tarte und harte Fakten\u201d: Im Interview mit Ansible, k3s, Infrastructure as Code und Raspberry Pi","author":"Aliena Leonhard","date":"28. February 2022","format":false,"excerpt":"Why so serious? - Ein Artikel von Sarah Schwab und Aliena Leonhard im Rahmen der Vorlesung Systems Engineering and Management. Die Idee, ein fiktives Interview zu erstellen, entstammt daraus komplexe Sachverhalte unterhaltsam und verst\u00e4ndlich zu machen. Wir sind heute zu Gast in der Tech-Sendung \u201cHimbeer Tarte und harte Fakten\u201d.\u00a0 Heute\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/stan-slade-BM27BzBrhVM-unsplash-2-scaled.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/stan-slade-BM27BzBrhVM-unsplash-2-scaled.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/stan-slade-BM27BzBrhVM-unsplash-2-scaled.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/stan-slade-BM27BzBrhVM-unsplash-2-scaled.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/stan-slade-BM27BzBrhVM-unsplash-2-scaled.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/stan-slade-BM27BzBrhVM-unsplash-2-scaled.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":23579,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/","url_meta":{"origin":12032,"position":3},"title":"Google Geodata Visualizer","author":"sk331","date":"30. August 2022","format":false,"excerpt":"Ein Projekt von Kai Kustermann, Michael Litschko, Sarah Mauff und Sebastian K\u00f6pp Einleitung Im Sommersemester 2022 haben wir uns als 4-k\u00f6pfige Gruppe dazu entschlossen, einen Google Geodata Visualizer zu erstellen. Das Projekt ist aus der Idee einer McDonald\u2019s-Achievement-Card entstanden. Die Idee war eine Website, die dem Benutzer anzeigt, welche McDonald\u2019s\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":23679,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/31\/jobsuche-portal\/","url_meta":{"origin":12032,"position":4},"title":"Jobsuche Portal","author":"ag164","date":"31. August 2022","format":false,"excerpt":"SS22 - Dev4Cloud Projekt - von Robin H\u00e4rle und Anton Gerdts Ideenfindung \u00a0\u00a0\u00a0 Zu Beginn der Ideenfindungsphase f\u00fcr unser Projekt sahen wir uns die verschiedenen Apis auf Bund.dev an, um uns von der Thematik der verf\u00fcgbaren Daten inspirieren zu lassen. Wir entschieden uns ohne lange abzuw\u00e4gen daf\u00fcr ein Jobsuche-Portal mit\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21163,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/15\/cloud-basierter-password-manager\/","url_meta":{"origin":12032,"position":5},"title":"Cloud basierter Password Manager","author":"bs103","date":"15. September 2021","format":false,"excerpt":"von Benjamin Schweizer (bs103) und Max Eichinger (me110) Abstract K\u00f6nnen Passwort Manager Anbieter meine Passw\u00f6rter lesen? Wir wollten auf Nummer sichergehen und haben unseren Eigenen entwickelt. Dieser Artikel zeigt auf welche Schritte wir hierf\u00fcr unternehmen mussten.Dabei haben wir unser Frontend mittels Flutter und unser Backend in AWS umgesetzt. Au\u00dferdem gehen\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=1050%2C600&ssl=1 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":831,"user_id":973,"is_guest":0,"slug":"ss447","display_name":"ss447","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/07fb1e41e1d15fb8e1fd4fba210d6540d79287e44f8979436722ae6e27cfcd35?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/973"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=12032"}],"version-history":[{"count":14,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12032\/revisions"}],"predecessor-version":[{"id":25383,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12032\/revisions\/25383"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=12032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=12032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=12032"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=12032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}