{"id":27142,"date":"2025-02-27T17:01:13","date_gmt":"2025-02-27T16:01:13","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=27142"},"modified":"2025-02-27T17:01:15","modified_gmt":"2025-02-27T16:01:15","slug":"entwicklung-eines-skalierbaren-file-share-services-mit-aws","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/","title":{"rendered":"Entwicklung eines skalierbaren File-Share-Services mit AWS"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"845\" data-attachment-id=\"27176\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/logo_nextcloud_blue-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2.png\" data-orig-size=\"1200,845\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"logo_nextcloud_blue\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2-1024x721.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2.png\" alt=\"\" class=\"wp-image-27176\" style=\"width:682px;height:auto\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2.png 1200w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2-300x211.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2-1024x721.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/logo_nextcloud_blue-2-768x541.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>tl;dr:<\/strong> Unser Semester-Projekt bestand im Aufbau einer skalierbaren File-Share-L\u00f6sung auf AWS auf Basis von NextCloud. Unsere Motivation bestand darin die volle Kontrolle \u00fcber die eigenen Daten zu erlangen, individuelle Anpassbarkeit zu erm\u00f6glichen und eine Kosteneffizienz zu erreichen. Es wurden klare Ziele in den Bereichen Verf\u00fcgbarkeit, Performanz, Sicherheit und Skalierbarkeit definiert, anhand deren das Projekt ausgerichtet wurde. Dabei kamen AWS-Dienste wie VPC, Route&nbsp;53, Certificate Manager, ALB, ASG, EC2, RDS und S3 zum Einsatz. Learnings aus diesem Projekt bestanden in den f\u00fcr uns wertvollen Einblicken in Planung, Skalierung und Herausforderungen mit AWS-Services.<\/p>\n<\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\">Motivation<\/h1>\n\n\n\n<p>Wie man einen Cloud-Dienst &#8211; \u00e4hnlich wie iCloud oder Google Drive &#8211; entwickelt und dabei m\u00f6glicherweise den hohen Geb\u00fchren entkommen kann , besch\u00e4ftigt uns schon seit geraumer Zeit. Im Rahmen der Vorlesung <strong>System Engineering &amp; Management<\/strong> hatten wir dieses Semester die Gelegenheit dieser Frage nachzugehen.<\/p>\n\n\n\n<p>Die Entscheidung, einen eigenen Cloud-Dienst aufzusetzen, bietet gleich mehrere interessante Aspekte.<\/p>\n\n\n\n<p>Ein wesentlicher Vorteil liegt in der <strong>vollst\u00e4ndigen Kontrolle \u00fcber die eigenen Daten<\/strong>. Da der Standort und die Speicherung der Daten selbst bestimmt werden, entf\u00e4llt die Abh\u00e4ngigkeit von externen Anbietern \u2013 und damit m\u00f6glicherweise auch der Vendor-Lock-In. Gleichzeitig bringt diese Selbstbestimmung jedoch auch volle Eigenverantwortung f\u00fcr die Datensicherheit mit sich, was ein erhebliches Risiko darstellen kann.<\/p>\n\n\n\n<p>Ein weiterer Vorteil liegt in der <strong>individuellen Anpassbarkeit<\/strong> des Dienstes. Anders als bei standardisierten Angeboten etablierter Cloud-Anbieter bietet eine eigens entwickelte L\u00f6sung die M\u00f6glichkeit, Konfiguration und Anpassungen exakt auf die spezifischen Bed\u00fcrfnisse des Nutzers abzustimmen \u2013 auch wenn dies mit einem h\u00f6heren initialen Entwicklungsaufwand verbunden ist.<\/p>\n\n\n\n<p>Angesichts der oft hohen monatlichen Kosten kommerzieller Cloud-Dienste stellt sich die Frage, ob eine eigene L\u00f6sung langfristig kosteneffizienter betrieben werden kann. Auch wenn sich diese Frage nicht pauschal beantworten l\u00e4sst, bietet sie zumindest den Anreiz, alternative Ans\u00e4tze auszuprobieren.<\/p>\n\n\n\n<p>Nicht zuletzt bietet dieses Projekt zudem die ideale M\u00f6glichkeit, praxisnah wertvolle Erfahrungen in der Entwicklung mit modernen Cloud-Technologien zu sammeln. Wie Richard Feynman schon sagte: \u201c<em>What I cannot create, I do not understand<\/em>\u201d, wollen wir durch dieses Projekt lernen, was es bedeutet, einen eignen Cloud-Dienst skalierbar aufzubauen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Ziele<\/h1>\n\n\n\n<p>Um den Rahmen f\u00fcr unser Projekt und die sp\u00e4tere Architektur klar abzustecken, haben wir zun\u00e4chst pr\u00e4zise Ziele definiert. Ein zentraler Entschluss war, die Anwendungslogik nicht selbst zu entwickeln \u2013 da unser Team aus lediglich zwei Personen besteht. Stattdessen haben wir uns bewusst daf\u00fcr entschieden, eine bestehende Open-Source-L\u00f6sung zu integrieren. Aufgrund der umfassenden Dokumentation und einer gro\u00dfen Entwickler-Community fiel die Wahl auf <strong>NextCloud<\/strong>. Diese Entscheidung erm\u00f6glichte es uns, unseren Fokus auf die kritischen Aspekte der Architektur zu legen, anstatt auf die reine Softwareentwicklung.<\/p>\n\n\n\n<p>Orientierung \u00fcber den gesamten Projektverlauf hinweg gaben uns daher die nach folgenden Ziele:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Verf\u00fcgbarkeit<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong><em>Die Architektur soll eine prinzipielle Verf\u00fcgbarkeit von 99,9% gew\u00e4hrleisten<\/em>.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p>Das bedeutet, dass innerhalb eines Monats maximal ca. 43 Minuten ungeplante Downtime toleriert werden d\u00fcrfen. Diese hohe Verf\u00fcgbarkeit erfordert mehr als den Einsatz eines einzigen Servers. Stattdessen m\u00fcssen ausfallsichere Strukturen in die Planung einbezogen werden, um die geforderte Betriebszeit sicherzustellen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Performanz<\/h3>\n\n\n\n<p>Ein weiteres Ziel ist die schnelle Reaktionszeit der Anwendung.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em><strong>Konkret soll die Time-to-First-Byte (TTFB) der Benutzeroberfl\u00e4che unter 200 ms liegen.<\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Dieser h\u00e4ufig genannte Richtwert gew\u00e4hrleistet, dass Nutzer nahezu unmittelbar eine Antwort beim Aufruf der Seite erhalten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Sicherheit<\/h3>\n\n\n\n<p>Angesichts der sensiblen Daten, die in einer pers\u00f6nlichen Cloud verarbeitet werden, ist Sicherheit eines unserer Hauptziele.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em><strong>Zum einen soll ausschlie\u00dflich ein verschl\u00fcsselter Zugriff via HTTPS realisiert werden, um Daten vor unerlaubtem Zugriff zu sch\u00fctzen.<\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em><strong>Zum anderen soll die Registrierung neuer Accounts so gestaltet werden, dass zwar eine Registrierung m\u00f6glich ist, der tats\u00e4chliche Zugriff jedoch erst nach einer manuellen Best\u00e4tigung durch einen Administrator freigegeben wird.<\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Diese Ma\u00dfnahme verhindert, dass sich unkontrolliert zahlreiche Nutzer registrieren, und st\u00e4rkt somit die Systemsicherheit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Skalierbarkeit<\/h3>\n\n\n\n<p>Die Skalierbarkeit der Anwendung ist ein weiterer zentraler Aspekt.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em><strong>Sie muss gew\u00e4hrleisten, dass auch bei steigender Nutzerzahl keine Einbu\u00dfe in der Performance auftreten.<\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Das bedeutet, dass in der Regel mehrere Frontend-Server horizontal hinzuf\u00fcgbar sein m\u00fcssen, w\u00e4hrend der Speicher zentralisiert wird. Dieses Konzept erm\u00f6glicht es, bei steigendem Traffic weitere Instanzen hinzuzuf\u00fcgen, um die Leistungsf\u00e4higkeit aufrecht zu erhalten.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Architektur<\/h1>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2600\" height=\"1338\" data-attachment-id=\"27146\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-02-24-um-16-46-59\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59.png\" data-orig-size=\"2600,1338\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-02-24 um 16.46.59\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59-1024x527.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59.png\" alt=\"\" class=\"wp-image-27146\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59.png 2600w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59-300x154.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59-1024x527.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59-768x395.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59-1536x790.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-24-um-16.46.59-2048x1054.png 2048w\" sizes=\"auto, (max-width: 2600px) 100vw, 2600px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Network &amp; DNS<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Route 53<\/strong>: Wird genutzt, um eine eigene Domain auf die Anwendung zu routen.<\/li>\n\n\n\n<li><strong>Subnets<\/strong>: Mindestens zwei Subnets (z. B. Public und Private), um Netzwerkzugriff und Sicherheitsanforderungen zu ber\u00fccksichtigen.<\/li>\n\n\n\n<li><strong>VPC (Virtual Private Cloud)<\/strong>: Isolierter, sicherer Netzwerkbereich in AWS in der die Anwendung betrieben wird.<\/li>\n\n\n\n<li><strong>Certificate Manager:<\/strong> Stellt TLS-Zertifikat f\u00fcr den Load Balancer bereit, was die Verbindung \u00fcber https sichert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Load Balancing<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Application Load Balancer (ALB)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Nimmt eingehenden Traffic \u00fcber die Listener entgegen.<\/li>\n\n\n\n<li>Verteilt den eingehenden Traffic gleichm\u00e4\u00dfig auf die verf\u00fcgbaren EC2-Instanzen (TargetGroup).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Compute-Resources<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>EC2-Instanzen<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Instanzen hosten die NextCloud-Applikation.<\/li>\n\n\n\n<li>Mehrere EC2-Instanz (t2.micro) sind im private Subnet \u00fcber den ALB erreichbar.<\/li>\n\n\n\n<li>Kommunizieren mit RDS (Metadaten) und S3 (Dateien).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Storage-Backend<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S3-Buckets<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Dateien der Nutzer liegen nicht lokal auf der EC2-Instanz, sondern in einem S3-Bucket. Dadurch k\u00f6nnen mehrere EC2-Instanzen auf dieselben Daten zugreifen.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Relationale Datenbank (RDS)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Bietet einen zentralen Speicherort f\u00fcr Metadaten, der von allen EC2-Instanzen gemeinsam genutzt wird.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Security<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Security Groups<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Eingehender Traffic nur vom ALB mittels HTTPS an die EC2-Instanzen.<\/li>\n\n\n\n<li>EC2 hat outbound Zugriff auf S3 und RDS.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>IAM-Rollen<\/strong>:\n<ul class=\"wp-block-list\">\n<li>EC2-Instanzen erhalten IAM-Rollen, um sicher und direkt auf S3 und RDS zugreifen zu k\u00f6nnen (ohne feste Keys in der Applikation).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Benutzerregistrierung mit approval-Mechanismus<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Registrierung ben\u00f6tigt Best\u00e4tigung der Konten zur Aktivierung.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Scaleability<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auto Scaling Group (ASG):<\/strong>\n<ul class=\"wp-block-list\">\n<li>Bekommt von ALB anhand verschiedener Metriken mitgeteilt ob weitere EC2-Instanzen hinzugef\u00fcgt werden sollen oder ob sie heruntergefahren werden k\u00f6nnen.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Auf Datenebene sorgen der S3 und RDS Speicher daf\u00fcr, dass Daten zentral ausgelagert sind.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Monitoring &amp; Logging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CloudWatch Logs &amp; Metrics<\/strong>: \u00dcberpr\u00fcfung der CPU oder RAM Auslastung der EC2-Instanzen sowie Verf\u00fcgbarer Speicherplatz der S3-Buckets.<\/li>\n\n\n\n<li><strong>Health Checks<\/strong>: \u00dcberwachen Metriken wie Netzwerkauslastung und Instanz-Gesundheit.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Entwurfsentscheidungen<\/h1>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft.png\"><img loading=\"lazy\" decoding=\"async\" width=\"4754\" height=\"2434\" data-attachment-id=\"27163\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/system-engineering-first-draft\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft.png\" data-orig-size=\"4754,2434\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"System Engineering &amp;#8211; First Draft\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft-1024x524.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft.png\" alt=\"\" class=\"wp-image-27163\" style=\"width:695px;height:auto\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft.png 4754w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft-300x154.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft-1024x524.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft-768x393.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft-1536x786.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System-Engineering-First-Draft-2048x1049.png 2048w\" sizes=\"auto, (max-width: 4754px) 100vw, 4754px\" \/><\/a><\/figure>\n\n\n\n<p>Ausgangspunkte f\u00fcr unsere \u00dcberlegungen hinsichtlich der Architektur war zun\u00e4chst unser erster Proof-of-Concept (siehe Abbildung oberhalb). Hierbei war unser prim\u00e4res Ziel NextCloud zugreifbar auf einer EC2 Instanz zum laufen zu bringen. Allerdings unterst\u00fctzt diese Version keines unserer genannten Ziel, weshalb wir von hier aus die Architektur grundlegend aufbauen mussten.<\/p>\n\n\n\n<p>Den Einstiegspunkt bildet die Client-Seite von der aus Nutzer \u00fcber ihren Browser auf unsere Anwendung zugreifen k\u00f6nnen. Um eine bessere Nutzererfahrung zu bieten wollen wir einen Zugriff \u00fcber eine gleichbleibende Domain erm\u00f6glichen. Dabei viel unsere Wahl auf den AWS eigenen Service <strong>Route53.<\/strong><\/p>\n\n\n\n<p>Gerade f\u00fcr einen Cloud Service, bei dem teils sensible Daten hochgeladen werden, ist ein verschl\u00fcsselter Datenaustausch unerl\u00e4sslich. Deshalb wird der gesamte Datenverkehr ausschlie\u00dflich \u00fcber HTTPS abgewickelt. Die hierf\u00fcr n\u00f6tigen SSL\/TLS-Zertifikate werden \u00fcber den <strong>AWS Certificate Manager<\/strong> bereitgestellt, was einen soliden Sicherheitsstandard garantiert. Hierbei k\u00f6nnten auch externe Zertifikatsdienste wie <em>Let\u2019s Encrypt<\/em> in Betracht gezogen werden, was insbesondere dann sinnvoll sein kann, wenn man eine Unabh\u00e4ngigkeit von einem einzigen Anbieter anstrebt. Im Rahmen dieses Projekts hat f\u00fcr uns jedoch die nahtlose Integration in die AWS-Umgebung \u00fcberwogen.<\/p>\n\n\n\n<p>Hinsichtlich der Skalierbarkeit haben wir uns bewusst f\u00fcr eine horizontale Skalierung entschieden. Es bietet im Gegensatz zu einer vertikalen Skalierung, bei der wir lediglich eine EC2-Instanz mit starker Speicher und Rechenleistung dauerhaft betreiben h\u00e4tten m\u00fcssen, folgende Vorteile:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Verbesserte Skalierbarkeit<\/strong>, da Instanzen nach Auslastung weg oder dazu geschaltet werden k\u00f6nnen.<\/li>\n\n\n\n<li>Daraus resultierende <strong>Kostenvorteile,<\/strong> aufgrund der M\u00f6glichkeit bei geringer Nutzung, Leistungsschw\u00e4chere und kosteng\u00fcnstigere Instanzen zu betreiben.<\/li>\n\n\n\n<li>Erm\u00f6glicht eine <strong>durchgehende Verf\u00fcgbarkeit<\/strong> und <strong>bessere<\/strong> <strong>Wartbarkeit.<\/strong><\/li>\n\n\n\n<li>Erh\u00f6ht die <strong>Ausfallsicherheit,<\/strong> da auf weitere Instanzen zur\u00fcckgegriffen werden kann.<\/li>\n<\/ol>\n\n\n\n<p>Ein Load-Balancer ist f\u00fcr eine horizontale Skalierung und zur Erreichung unserer definierten Ziele unerl\u00e4sslich. Er \u00fcbernimmt die Aufgabe, den eingehenden Traffic \u00fcber definierte Listener an die EC2-Instanzen zu verteilen. Da es sich bei einem File-Share um keine Latenzkritische Anwendung handelt, wie z.B. Online-Games oder Streaming-Dienste, sondern eher flexibles Routing und Lastenverteilung ben\u00f6tigen, viel die Wahl auf den <strong>Application Load Balancer<\/strong>. Durch das Monitoring der \u201eGesundheit\u201c der Instanzen leitet er den Traffic automatisch an \u201cgesunde\u201d Instanzen weiter, was die Systemverf\u00fcgbarkeit deutlich erh\u00f6ht. Skalieren l\u00e4sst sich unsere Anwendung jedoch erst im Zusammenspiel des ALB mit einer <strong>Auto-Scaling-Group (ASG)<\/strong>. Die ASG reagiert auf die Mitteilungen des ALB zum Zustand verschiedener Metriken wie CPU-Auslastung oder Netzwerk-Traffic und passt daraufhin die Anzahl der EC2-Instanzen dynamisch an den tats\u00e4chlichen Bedarf an. Dies erm\u00f6glicht eine optimale Ressourcennutzung, da Instanzen bei geringer Last automatisch heruntergefahren und bei steigender Nachfrage neue hinzugef\u00fcgt werden. Dieser Ansatz erm\u00f6glicht eine hohe Ausfallsicherheit \u2013 wenn es auch Herausforderungen der Datenredundanz mit sich bringt.<\/p>\n\n\n\n<p>Anstatt einzelne EC2-Instanzen zu verwalten, h\u00e4tte man auch Container einsetzen k\u00f6nnen, die \u00fcber Plattformen wie Amazon Elastic Container Service (ECS) oder Amazon Elastic Kubernetes Service (EKS) orchestriert werden. Containerisierte Anwendungen haben den entscheidenden Vorteil, dass sie portabler sind und sich leichter zwischen verschiedenen Cloud-Anbietern bewegen lassen. Allerdings steigert dieser Ansatz ebenfalls die Komplexit\u00e4t, die den Mehrwert insbesondere im Kontext unseres Projekts nicht rechtfertigt. Zur Thematik des Vendor-Lock-In komme ich am Ende ausf\u00fchrlicher zu sprechen. Ein Serverless-Architektur Ansatz w\u00e4re f\u00fcr NextCloud ebenfalls weniger geeignet, da dieser vor allem f\u00fcr kurzlebige Funktionen konzipiert ist. F\u00fcr Anwendungen wie die unsere, die einen kontinuierlichen Betrieb mit persistentem Zustand erfordern, entstehen dabei erhebliche Nachteile \u2013 insbesondere durch <em>Cold Starts<\/em>.<\/p>\n\n\n\n<p>Um Herausforderungen der Datenredundanz zu \u00fcberwinden, mussten die Instanzen bzw. NextCloud \u201c<em>zustandslos<\/em>\u201d gestaltet werden und wir ben\u00f6tigten ausgelagerte Speicherm\u00f6glichkeiten. Die Wahl des passenden Speichers gestaltete sich als schwieriger als zun\u00e4chst Angenommen. Nat\u00fcrlich g\u00e4be es auch die M\u00f6glichkeit einen Storage-Service ausserhalb von AWS zu w\u00e4hlen. Dies h\u00e4tte allerdings die Umsetzung f\u00fcr uns lediglich erschwert, ohne nennenswerte Vorteile mit sich zu bringen. Wenn man nicht \u00fcber die n\u00f6tige Erfahrung mit den von AWS angebotenen Storage-Services verf\u00fcgt, wirkt das Angebot schnell \u00fcberw\u00e4ltigend. Hierbei hat uns vor allem der <a href=\"https:\/\/docs.aws.amazon.com\/decision-guides\/latest\/storage-on-aws-how-to-choose\/choosing-aws-storage-service.html\">Guide<\/a> [1] aus der AWS Dokumentation sehr geholfen. F\u00fcr die Verwaltung der Metadaten wie der Nutzeraccounts ist eine relationale Datenbank wie der <strong>Amazon Relational Database Service<\/strong> (<strong>RDS<\/strong>) am geeignetsten. F\u00fcr die Ablage der verschiedenen Dateien der Nutzer (wie Bilder, Videos, Dokumente, etc.) standen verschiedene Speicherl\u00f6sungen zur Auswahl \u2013 wie ObjectStore, FileStorage oder BlockStorage. <strong>Amazon S3<\/strong> als <em>ObjectStore<\/em> verwaltet Dateien als URL-adressierte Objekte. Die Vorteile liegen in der nahezu unbegrenzten Skalierbarkeit, hohen Verf\u00fcgbarkeit und den vergleichsweise g\u00fcnstigen Kosten. <em>FileStorage<\/em> bietet zwar intuitive Dateisystemzugriffe, st\u00f6\u00dft aber bei hoher Last schnell an Grenzen. <em>BlockStorage<\/em> erm\u00f6glicht pr\u00e4zise Dateiadressierung, erfordert jedoch mehr Verwaltungsaufwand und ist weniger flexibel in der Skalierung. In Anbetracht unserer gesetzten Ziele sowie der geringeren Kosten, haben wir uns daher f\u00fcr S3 als zweiten Storage entschieden. [2]<\/p>\n\n\n\n<p>Den Zugriff zwischen den EC2 Instanzen und unseren Datenbanken haben wir durch IAM-Rollen und Security Groups in privaten Subnetzen kontrolliert (N\u00e4heres hierzu im Abschnitt Implementierung). Letztlich stellt die finale Architektur f\u00fcr uns eine ausgewogene L\u00f6sung dar, die die Vorteile einer hohen Verf\u00fcgbarkeit, flexiblen Skalierbarkeit, konsistenter Performance und robusten Sicherheit bietet und zudem den Raum f\u00fcr zuk\u00fcnftige Erweiterungen \u2013 wie zus\u00e4tzliche Containerisierung \u2013 erm\u00f6glicht.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Implementierung<\/h1>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full has-custom-border\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" data-attachment-id=\"27147\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/nextcloud_hub_background\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background.png\" data-orig-size=\"1920,1080\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Nextcloud_Hub_background\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background-1024x576.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background.png\" alt=\"\" class=\"wp-image-27147\" style=\"border-radius:10px\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background.png 1920w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background-300x169.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background-1024x576.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background-768x432.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Nextcloud_Hub_background-1536x864.png 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">[3]<\/figcaption><\/figure>\n\n\n\n<p>Dieser Abschnitt beschreibt die schrittweise Umsetzung und dokumentiert dabei unsere Erfahrungen im Laufe des Projekts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Network &amp; DNS<\/h2>\n\n\n\n<p>Um Nutzern einen zentralen Zugang zu unserer Anwendung zu erm\u00f6glichen, haben wir in einem ersten Schritt eine eigene Domain registriert. \u00dcber den AWS eigenen Service Route53 war dies problemlos m\u00f6glich. Um den Datenverkehr abzusichern haben wir den AWS Certificate Manager genutzt, um SSL\/TLS-Zertifikate f\u00fcr unsere Domain zu beantragen. Voraussetzung daf\u00fcr war, dass wir einerseits eine \u201cHostet-Zone\u201d erstellen und andererseits einen \u201cCNAME-Record\u201d erstellen, um zu validieren, dass uns die Domain geh\u00f6rt. Aufgrund der sensiblen Daten die unsere Anwendung verwaltet empfiehlt es sich sie von anderen, potenziell unsicheren Netzwerken zu trennen. Hierf\u00fcr nutzen wir eine virtuelle private Cloud (VPC) als isoliertes Netzwerk innerhalb von AWS. VPC erm\u00f6glicht es uns beispielsweise die EC2-Instanzen, in privaten Subnets zu betrieben, wodurch sie nicht direkt aus dem Internet erreichbar sind. Dadurch k\u00f6nnen wir das Risiko vor unbefugtem Zugriffe erheblich reduzieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Load Balancing &amp; Scaleability<\/h2>\n\n\n\n<p>Um nicht nur den eingehenden Traffic effizient zu verteilen, sondern auch bei variierenden Lasten flexibel horizontal skalieren zu k\u00f6nnen, kamen der Application Load Balancer (ALB) und die Auto Scaling Group (ASG) zum Einsatz.<\/p>\n\n\n\n<p>Bei der Konfiguration des ALB half uns die Dokumentation von AWS erneut sehr bei der initialen Einrichtung weiter. Bei der Netzwerkzuordnung haben wir drei Availability-Zones f\u00fcr unsere Zone ausgew\u00e4hlt um die Fehlertoleranz unserer Anwendung zu erh\u00f6hen. Anschlie\u00dfend m\u00fcssen Listener konfiguriert werden, die den Eingehenden Traffic an den Ports entgegennehmen. Hierf\u00fcr haben wir einen Listener f\u00fcr Port 433 erstellt, der eingehende HTTPS-Anfragen entgegennimmt. Hierbei ist es essentiell dem Listener das beantragte Zertifikat aus dem ACM zu hinterlegen. Unserer Unerfahrenheit geschuldet schlugen aufgrund dessen, auf f\u00fcr uns unerkl\u00e4rliche wei\u00dfe, die Health Checks dauerhaft fehl. Erst nachdem wir alle anderen Fehlerquellen, von der Serverkonfiguration bis hin zu etwaigen Health-Check Anpassungen, ausgeschlossen haben, sind wir auf die eigentliche Ursache aufmerksam geworden. Die Target Group wurde so eingerichtet, dass sie den eingehenden Traffic zu unseren EC2 Instanzen weiterleitet. Zus\u00e4tzlich \u00fcberpr\u00fcfen regelm\u00e4\u00dfige Health-Checks, ob der Server erreichbar ist. Durch die Healh-Checks kann der Load-Balancer erkennen, wann er Traffic von \u201cungesunden\u201d-Instanzen zu den verbleibenden \u201cgesunden\u201d-Instanzen umleiten muss.<\/p>\n\n\n\n<p>Parallel dazu erg\u00e4nzt die Auto-Scaling-Group den Load Balancer, indem sie bei Ausfallen einer Instanz, diese abschaltet und automatisch zus\u00e4tzliche EC2-Instanzen startet. Wir haben zus\u00e4tzlich noch weitere Skalierungsmetriken wie eine durchschnittliche CPU-Auslastung von 50% hinterlegt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1088\" data-attachment-id=\"27151\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-02-22-um-14-58-29\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29.png\" data-orig-size=\"2560,1088\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-02-22 um 14.58.29\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29-1024x435.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29.png\" alt=\"\" class=\"wp-image-27151\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29.png 2560w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29-300x128.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29-1024x435.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29-768x326.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29-1536x653.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-14.58.29-2048x870.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/figure>\n\n\n\n<p>Weitere notwendige Konfigurationen der ASG, neben der <em>Scaling Policy<\/em> waren zum Einen das private VPC auszuw\u00e4hlen in dem die Instanzen laufen sollen, sowie die ASG mit dem bestehenden ALB zu verbinden. Des Weiteren haben wir f\u00fcr unsern Testzweck eine gew\u00fcnschte Mindestanzahl gleichzeitig betriebener Instanzen von 1 gew\u00e4hlt und ein Maximum von 2 festgelegt, um bei Konfigurationsfehler keine zu hohen Kosten zu erzeugen. Im produktiven Umfeld w\u00fcrden wir diese Zahl nat\u00fcrlich entsprechend anpassen. Zudem muss die ASG bei der Erstellung mit unserem bestehenden ALB und dessen Zustands\u00fcberpr\u00fcfungen verkn\u00fcpft werden.<\/p>\n\n\n\n<p>Damit die Auto Scaling Group (ASG) auch EC2 Instanzen starten kann, die \u00fcber die NextCloud Konfiguration verf\u00fcgen, wie wir sie ben\u00f6tigen, mussten wir eine Vorlage von einer bestehenden EC2-Instanz erstellen. Zun\u00e4chst haben wir uns f\u00fcr den Ansatz eines \u201c<strong>Launch Templates<\/strong>\u201d entschieden. Hierbei lassen sich alle notwendigen Parameter f\u00fcr neue Instanzen \u2013 etwa Instance Type, Security Groups, Key-Pair, User-Data-Skripte usw. \u2013 in einem Template festlegen. Es zeigte sich , dass Launch Templates sich bei Bedarf auch sp\u00e4ter noch anpassen lassen, ohne einen komplett neues Template erzeugen zu m\u00fcssen. Allerdings haben wir auch festgestellt, dass die Nutzung eines Launch Templates allein nicht immer eine vollst\u00e4ndige Replikation des Zustands unserer Instanz gew\u00e4hrleistet. Daher sind wir dazu \u00fcber gegangen einen <strong>Amazon Machine Image (AMI)<\/strong> von unserer initial konfigurierten Instanz zu erstellen. Ein AMI bietet den entscheidenden Vorteil, dass es den exakten Zustand der Instanz \u2013 inklusive aller installierter Anwendungen und individuellen Einstellungen \u2013 kapselt. Dadurch besitzen alle neuen Instanzen, die aus diesem AMI gestartet werden, exakt die gleiche Konfiguration wie unsere urspr\u00fcngliche NextCloud-Instanz. Zwar ist die Erstellung eines AMI etwas weniger flexibel als die Nutzung eines reinen Launch Templates, da Anpassungen nachtr\u00e4glich schwieriger vorzunehmen sind, aber eine vollst\u00e4ndige Replikation unserer Instanz war f\u00fcr uns zwingend erforderlich.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2506\" height=\"726\" data-attachment-id=\"27152\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-01-16-um-17-05-03\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03.png\" data-orig-size=\"2506,726\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-01-16 um 17.05.03\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03-1024x297.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03.png\" alt=\"\" class=\"wp-image-27152\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03.png 2506w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03-300x87.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03-1024x297.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03-768x222.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03-1536x445.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-17.05.03-2048x593.png 2048w\" sizes=\"auto, (max-width: 2506px) 100vw, 2506px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Compute-Resources<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Erstellung der EC2-Instanz<\/h3>\n\n\n\n<p>Aufgrund unseres horizontalen Skalierungsansatzes ist es ausreichend eine t2.micro &#8211; Instanz als Server zu w\u00e4hlen. Da NextCloud als Anwendung vergleichsweise weniger ressourcenintensiv ist und bei steigender Last durch die ASG weitere Instanzen dazu geschaltet werden k\u00f6nnen, k\u00f6nnen bei wenig Traffic auf unsere Anwendung so kosten minimiert werden. Die Sicherheitsgruppe wurde so konfiguriert, dass sie nur die n\u00f6tigen Ports (SSH, HTTPS) freigibt. Zudem haben wir die Instanz in unsere VPC integriert und in einem privaten Subnet platziert, um die Sicherheit zu erh\u00f6hen. Dadurch wird der direkte Zugriff aus dem Internet verhindert, w\u00e4hrend der Load Balancer \u2013 der in einem \u00f6ffentlichen Subnet betrieben wird \u2013 den externen Traffic entgegennimmt und \u00fcber interne, private Verbindungen an die Instanz weiterleitet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Konfiguration des Servers<\/h3>\n\n\n\n<p>Nach dem erfolgreichen Start der Instanz erfolgte der Zugang per SSH. Aufgrund der Tatsache, dass wir die Daten in Datenbanken ausserhalb der EC2 Instanz auslagern, konnten wir nicht auf den standardisierten und gut dokumentierten Installationsprozess von NextCloud zur\u00fcckgreifen. Stattdessen mussten wir uns etliche Forumsbeitr\u00e4ge durchforsten und letztendlich eine individuelle L\u00f6sung erstellen. Hierbei war es notwendig den Webserver Apache sowie PHP manuell zu installieren. Als Client ben\u00f6tigten wir MariaDB um die sp\u00e4tere Datenbankanbindung an RDS zu realisieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Installation von NextCloud<\/h3>\n\n\n\n<p>Anschlie\u00dfend wurde NextCloud heruntergeladen und entpackt. Das <em>ownership<\/em> wurden auf <code class=\"\" data-line=\"\">www-data:www-data<\/code> angepasst, damit Apache auf die Dateien zugreifen kann. An dieser Stelle bereiteten wir auch die grundlegenden Konfigurationsdateien vor, f\u00fchrten aber den Web-Installer noch nicht aus. Schon hier stie\u00dfen wir auf die erste H\u00fcrde, denn NextCloud ist standardm\u00e4\u00dfig auf einen Single-Server-Betrieb ausgelegt. F\u00fcr den sp\u00e4teren Einsatz in einer horizontal skalierbaren Umgebung mussten wir sicherstellen, dass die Instanz zustandslos arbeitet und alle persistente Daten ausgelagert werden. N\u00e4heres hierzu haben wir im Abschnitt <strong>Storage<\/strong> dokumentiert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Konfiguration des Apache Virtual Host<\/h3>\n\n\n\n<p>Parallel richteten wir einen Apache Virtual Host ein, der unseren Domain-Namen verarbeitet. Dazu bearbeiteten wir die Konfigurationsdatei in <code class=\"\" data-line=\"\">\/etc\/apache2\/sites-available\/NextCloud.conf<\/code> in dem wir den ServerName eintrugen. Nachdem die Konfiguration aktiviert und Apache neu gestartet wurde, \u00fcberpr\u00fcften wir, ob die Seite korrekt ausgeliefert wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Einrichtung des SSL-Zertifikats<\/h3>\n\n\n\n<p>Da ein verschl\u00fcsselter Zugriff f\u00fcr unsere Anwendung essenziell ist, installierten wir <strong>Certbot<\/strong> und f\u00fchrten anschlie\u00dfend <br><code class=\"\" data-line=\"\">sudo certbot --apache -d *unseredomain*<\/code>. Der Befehl ruft <em>Certbot<\/em> auf und nutzt das Apache-Plugin, um ein SSL\/TLS-Zertifikat f\u00fcr unsere Domain von <em>Let\u2019s Encrypt<\/em> zu beantragen. Dabei wird automatisch gepr\u00fcft, ob die Domain korrekt konfiguriert ist, und anschlie\u00dfend die Apache-Konfiguration so angepasst, dass der Webserver HTTPS-Verbindungen unterst\u00fctzt. Allerdings stie\u00dfen wir hier zun\u00e4chst auf Validierungsprobleme, weshalb wir die DNS-Konfiguration in Route53 nochmals \u00fcberpr\u00fcfen mussten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. DNS-Konfiguration<\/h3>\n\n\n\n<p>In AWS Route 53 richteten wir schlie\u00dflich einen <em>A-Record<\/em> unsere Domain ein, der auf unserer Instanz zeigt. Nach einer kurzen Wartezeit war die Domain erreichbar und zeigte auf unsere konfigurierte EC2-Instanz.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Finalisierung der NextCloud-Installation<\/h3>\n\n\n\n<p>Zum Abschluss mussten wir noch einen NextCloud Administrationsaccount hinzuf\u00fcgen und unsere Domain als \u201cvertrauensw\u00fcrdige Domain\u201d hinterlegen. Anschlie\u00dfend konnte NextCloud \u00fcber unsere Domain abgerufen werden und eine Anmeldung als Admin war m\u00f6glich. \u00dcber die Einstellungen in der NextCloud Admin Oberfl\u00e4che konnten wir, unter Installation eines AddIns, die Freigabe neuer Nutzer, die sich \u00fcber die Startseite registrieren, verwalten. Allerdings sind die Daten zu diesem Zeitpunkt noch immer auf der EC2 Instanz.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full has-custom-border\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2764\" height=\"1948\" data-attachment-id=\"27153\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-02-02-um-12-28-01\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01.png\" data-orig-size=\"2764,1948\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-02-02 um 12.28.01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01-1024x722.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01.png\" alt=\"\" class=\"wp-image-27153\" style=\"border-radius:10px\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01.png 2764w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01-300x211.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01-1024x722.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01-768x541.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01-1536x1083.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-02-um-12.28.01-2048x1443.png 2048w\" sizes=\"auto, (max-width: 2764px) 100vw, 2764px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-default\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Storage<\/h2>\n\n\n\n<p>Um den Herausforderungen der Datenredundanz bei horizontal skalierter Infrastruktur zu begegnen, haben wir uns dazu entschlossen, die Metadaten sowie Dateien der Nutzer ausserhalb der EC2-Instanzen auszulagern. Hierbei viel die Wahl auf einerseits Amazon S3 sowie Amazon RDS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Einrichtung eines S3-Buckets<\/h3>\n\n\n\n<p>Der erste Schritt bestand darin, einen neuen Bucket zu erstellen \u2013 in unserem Fall in der Region <em>eu-central-1<\/em>. Um im Falle versehentlicher L\u00f6schvorg\u00e4nge oder \u00c4nderungen auf fr\u00fchere Versionen zur\u00fcckgreifen k\u00f6nnen, haben wir Versionierung aktiviert. Dar\u00fcber hinaus haben wir den Bucket in unsere private VPC integriert, um eine gesicherte Verbindung zu gew\u00e4hrleisten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Erstellung einer RDS-Instanz<\/h3>\n\n\n\n<p>Parallel haben wir in der AWS RDS-Konsole eine Datenbank-Instanz aufgesetzt. Hier haben wir uns f\u00fcr MariaDB entschieden. Wir w\u00e4hlten <em>db.t4g.micro<\/em> als Instanzklasse, um einen guten Kompromiss zwischen Performance und Kosten zu erzielen. Die Sicherheitsgruppe der RDS-Instanz wurde so konfiguriert, dass sie den Zugriff auf Port 3306 ausschlie\u00dflich aus der Sicherheitsgruppe der EC2-Instanzen erlaubt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08.png\"><img loading=\"lazy\" decoding=\"async\" width=\"4536\" height=\"2128\" data-attachment-id=\"27154\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-02-22-um-12-46-08\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08.png\" data-orig-size=\"4536,2128\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-02-22 um 12.46.08\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08-1024x480.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08.png\" alt=\"\" class=\"wp-image-27154\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08.png 4536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08-300x141.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08-1024x480.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08-768x360.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08-1536x721.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-22-um-12.46.08-2048x961.png 2048w\" sizes=\"auto, (max-width: 4536px) 100vw, 4536px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3. Zuweisung von IAM Rollen<\/h3>\n\n\n\n<p>Ein weiterer entscheidender Schritt in unserer Storage-Implementierung war die Erstellung und Zuweisung der erforderlichen IAM-Rollen, die den Zugriff unserer EC2-Instanzen auf den S3-Bucket und RDS steuern. Zun\u00e4chst haben wir in der AWS IAM-Konsole eine neue Rolle definiert und spezifische Policies wie die Berechtigungen <em>s3:GetObject, s3:PutObject, s3:DeleteObject<\/em> sowie die Verbindung zu unserer RDS-Datenbank \u00fcber <em>rds:Connect<\/em> zugewiesen.<\/p>\n\n\n\n<p>Anschlie\u00dfend haben wir diese IAM-Rolle unseren EC2-Instanzen zugewiesen \u2013 entweder direkt \u00fcber die Instance-Konfiguration oder mittels eines Launch Templates, das als Vorlage f\u00fcr die Auto Scaling Group dient. Auf diese Weise wird NextCloud beim Start automatisch \u00fcber die IAM-Rolle authentifiziert, ohne dass AWS-Schl\u00fcssel manuell in der config.php hinterlegt werden m\u00fcssen. Dieser Ansatz minimiert das Risiko von Schl\u00fcsselkompromittierungen und erm\u00f6glicht eine zentrale, flexible Verwaltung der Zugriffsrechte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Konfiguration der NextCloud-Instanz<\/h3>\n\n\n\n<p>Um die Kommunikation zwischen NextCloud mit dem S3 zu erm\u00f6glichen, installierten wir notwendige PHP-Bibliotheken, wie <em>php-curl.<\/em> In der NextCloud-Konfigurationsdatei <code class=\"\" data-line=\"\">config.php<\/code>erg\u00e4nzten wir dann ein objectstore-Array, in dem wir Region, Bucket-Namen und weitere Parameter unseres S3 eintrugen. Der Zugriff auf S3 wurde \u00fcber eine IAM-Rolle konfiguriert \u2013 die gegen\u00fcber einer direkten Eingabe der AWS-Schl\u00fcsseln zus\u00e4tzliche Sicherheit bietet. Die Implementierung dieses Schrittes war besonders herausfordernd f\u00fcr uns, da NextCloud nicht f\u00fcr die Auslagerung des Speichers angedacht ist. Viele Anpassungen waren notwendig, bis sowohl die Dateien als auch die Nutzerdaten konsistent zwischen mehreren Instanzen genutzt werden konnten.<\/p>\n\n\n\n<pre class=\"wp-block-code has-secondary-color has-text-color has-link-color wp-elements-dc19ba092ad57dd0b86c303a4fadcc01\"><code class=\"\" data-line=\"\">&#039;objectstore&#039; =&gt; &#091;\n  &#039;class&#039; =&gt; &#039;OC\\\\\\\\Files\\\\\\\\ObjectStore\\\\\\\\S3&#039;,\n  &#039;arguments&#039; =&gt; &#091;\n    &#039;bucket&#039; =&gt; &#039;*Bucket-Name*&#039;,\n    &#039;autocreate&#039; =&gt; false,\n    &#039;region&#039; =&gt; &#039;eu-central-1&#039;,\n    &#039;hostname&#039; =&gt; &#039;s3.eu-central-1.amazonaws.com&#039;,\n    &#039;use_ssl&#039; =&gt; true,\n    &#039;use_path_style&#039; =&gt; false,\n  ],\n],<\/code><\/pre>\n\n\n\n<p>Um zuletzt noch RDS in NextCloud einzubinden, konnten wir im Installationsprozess von NextCloud bei den Datenbank Einstellungen, die RDS Daten hinterlegen: <code class=\"\" data-line=\"\">dbhost=&lt;RDS-endpoint&gt;<\/code> <code class=\"\" data-line=\"\">dbname=NextCloud_db<\/code> . Somit nutze NextCloud automatisch unsere RDS als Ablageort f\u00fcr alle Nutzerdaten. Um unser Ziel einer durchg\u00e4ngigen Verf\u00fcgbarkeit zu erreichen, haben wir zus\u00e4tzlich die RDS als <strong>Multi-AZ<\/strong> deployed. Dabei werden automatisch synchrone Replikate der Datenbank in unseren drei Verf\u00fcgbarkeitszonen erstellt. Sollte die prim\u00e4re Instanz ausfallen, \u00fcbernimmt das System automatisch eines der Replikate, ohne dass manuelles Eingreifen erforderlich ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Monitoring &amp; Logging<\/h2>\n\n\n\n<p>Um den Zustand unserer NextCloud-Anwendung kontinuierlich zu \u00fcberwachen und bei Bedarf reagieren zu k\u00f6nnen, haben wir AWS CloudWatch sowie Health Checks integriert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CloudWatch Logs &amp; Metrics<\/h3>\n\n\n\n<p>CloudWatch haben wir so konfiguriert, dass es die f\u00fcr uns entscheidenden Systemmetriken CPU und RAM-Auslastung unserer EC2-Instanzen sowie den verf\u00fcgbaren Speicherplatz in unseren S3-Buckets \u00fcberwacht. Die Konfiguration erfolgte direkt \u00fcber die AWS Management Console, wobei wir die Alarme mit einem S3-Bucket verkn\u00fcpft haben, um alle Ereignisse zu dokumentieren.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full has-custom-border\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2112\" height=\"798\" data-attachment-id=\"27157\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-01-16-um-12-21-12\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12.png\" data-orig-size=\"2112,798\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-01-16 um 12.21.12\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12-1024x387.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12.png\" alt=\"\" class=\"wp-image-27157\" style=\"border-radius:10px\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12.png 2112w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12-300x113.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12-1024x387.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12-768x290.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12-1536x580.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-01-16-um-12.21.12-2048x774.png 2048w\" sizes=\"auto, (max-width: 2112px) 100vw, 2112px\" \/><\/a><\/figure>\n\n\n\n<p>Die f\u00fcr uns relevanten Metriken sind dabei:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>EC2 CPU-Auslastung &gt; 80% f\u00fcr 10 Minuten<\/strong><\/li>\n\n\n\n<li><strong>S3-Bucket Memory-Auslastung &gt; 80%<\/strong><\/li>\n\n\n\n<li><strong>RDS Free-Storage &lt; 1GB<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Health Checks<\/h3>\n\n\n\n<p>Parallel dazu setzten wir Health Checks ein, um die Netzwerkauslastung und die allgemeine Instanz-Gesundheit zu \u00fcberwachen. Diese Health Checks spielen eine zentrale Rolle, da sie den Application Load Balancer (ALB) dazu bef\u00e4higen, den Traffic nur an \u201egesunde\u201c Instanzen weiterzuleiten. Anf\u00e4nglich hatten wir jedoch erhebliche Schwierigkeiten: Die Health Checks schlugen konstant fehl, was dazu f\u00fchrte, dass die ASG die als <em>unhealthy<\/em> gekennzeichnete Instanz st\u00e4ndig abschaltete und eine neue startete. Nach intensiver Fehlersuche entdeckten wir, dass das Problem in der DNS-Konfiguration lag. Erst als wir ein zus\u00e4tzliches A-Record f\u00fcr unsere Subdomain und eine extra statische html Seite hinzuf\u00fcgten, funktionierten die Health-Checks wie erwartet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full has-custom-border\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1641\" height=\"735\" data-attachment-id=\"27158\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/bildschirmfoto-2025-02-01-um-14-50-58\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58.png\" data-orig-size=\"1641,735\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bildschirmfoto 2025-02-01 um 14.50.58\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58-1024x459.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58.png\" alt=\"\" class=\"wp-image-27158\" style=\"border-radius:10px\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58.png 1641w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58-300x134.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58-1024x459.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58-768x344.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-01-um-14.50.58-1536x688.png 1536w\" sizes=\"auto, (max-width: 1641px) 100vw, 1641px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Evaluation<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anbieter Vergleich<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full has-custom-border\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs.png\"><img loading=\"lazy\" decoding=\"async\" width=\"4930\" height=\"1362\" data-attachment-id=\"27159\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/entwicklung-eines-skalierbaren-file-share-services-mit-aws\/costs\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs.png\" data-orig-size=\"4930,1362\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"costs\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs-1024x283.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs.png\" alt=\"\" class=\"wp-image-27159\" style=\"border-radius:10px\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs.png 4930w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs-300x83.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs-1024x283.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs-768x212.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs-1536x424.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/costs-2048x566.png 2048w\" sizes=\"auto, (max-width: 4930px) 100vw, 4930px\" \/><\/a><\/figure>\n\n\n\n<p>Die Grafik zeigt die monatlichen und j\u00e4hrlichen Kosten unserer Anwendung. F\u00fcr eine einzelne Person w\u00e4re diese L\u00f6sung sowohl zu teuer als auch zu <em>over-engineered<\/em> \u2013 hier h\u00e4tte eine einzelne EC2-Instanz ausgereicht. Bei mehreren Nutzern sinken jedoch die Kosten pro Person deutlich: bei f\u00fcnf Nutzern auf 12$\/Monat und bei 100 Nutzern sogar auf 6,30$\/Monat. Wie die nachfolgende Tabelle zeigt, ist es nicht ohne weiteres m\u00f6glich eine kosteng\u00fcnstigere Alternative zu den etablierten Cloud Anbietern wie iCloud oder Google Drive anzubieten. Die NextCloud Hosting Plattform tab.digital konnten wir preislich jedoch unterbieten.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"><strong>Provider<\/strong><\/th><th class=\"has-text-align-left\" data-align=\"left\"><strong>Storage<\/strong><\/th><th class=\"has-text-align-left\" data-align=\"left\"><strong>Costs \/ mth.<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Apple iCloud<\/td><td class=\"has-text-align-left\" data-align=\"left\">200GB<\/td><td class=\"has-text-align-left\" data-align=\"left\">$3.49<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Google Drive<\/td><td class=\"has-text-align-left\" data-align=\"left\">200GB<\/td><td class=\"has-text-align-left\" data-align=\"left\">$4.00<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">tab.digital<\/td><td class=\"has-text-align-left\" data-align=\"left\">265GB<\/td><td class=\"has-text-align-left\" data-align=\"left\">$11.64<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Unsere Anwendung [5 Nutzer]<\/td><td class=\"has-text-align-left\" data-align=\"left\">200GB<\/td><td class=\"has-text-align-left\" data-align=\"left\">$12.00<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Unsere Anwendung [100 Nutzer]<\/td><td class=\"has-text-align-left\" data-align=\"left\">200GB<\/td><td class=\"has-text-align-left\" data-align=\"left\">$6.30<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Eine weitere Motivation zu Beginn bestand darin, dem Vendor-Lock-in zu entkommen, dem man durch Cloud-Dienste von Apple, Google oder Microsoft ausgesetzt ist. Leider mussten wir feststellen, dass wir durch unsere Umsetzung mit AWS das Problem lediglich verschoben hatten. Zwar sind die Kosten im AWS-Kosmos \u00fcberschaubar und die Integration der Services ist hoch, jedoch steigt die Komplexit\u00e4t deutlich, sobald man externe Anbieter integrieren m\u00f6chte. Eine M\u00f6glichkeit, dies zumindest teilweise zu minimieren, w\u00e4re die Nutzung von <em>Infrastructure-as-Code<\/em>-Tools wie Terraform. Damit k\u00f6nnten Teile der Infrastruktur portabel zwischen verschiedenen Cloud-Anbietern gewechselt werden. Da sich jedoch sowohl die Abstraktion als auch der initiale Aufwand zur Erstellung erh\u00f6ht, lag dieser Ansatz au\u00dferhalb unseres Zielbereichs f\u00fcr dieses Semester.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ziel abgleich<\/h2>\n\n\n\n<p>Im Abgleich mit unseren zu Beginn definierten Ziele, hat sich gezeigt, dass wir mit dem Stand unserer Anwendung alle unsere definierten Ziele erreichen konnten, auch wenn selbstverst\u00e4ndlich noch weiterer Raum f\u00fcr Verbesserungen und alternative Ans\u00e4tze besteht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verf\u00fcgbarkeit<\/h3>\n\n\n\n<p><strong>\u2705 <em>Die Architektur sollte prinzipiell eine Verf\u00fcgbarkeit von 99,9% unterst\u00fctzen.<\/em><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Performanz<\/h3>\n\n\n\n<p><strong>\u2705<em> Die Time-to-First-Byte (TTFB) f\u00fcr die Benutzeroberfl\u00e4che soll unter 200 ms liegen.<\/em><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sicherheit<\/h3>\n\n\n\n<p><strong>\u2705 <em>Nur verschl\u00fcsselter Zugriff (HTTPS) auf die Anwendung.<\/em><\/strong><\/p>\n\n\n\n<p><strong>\u2705 <em>Nutzer k\u00f6nnen sich registrieren, werden jedoch erst nach einer manuellen Best\u00e4tigung durch einen Administrator f\u00fcr den Zugriff freigegeben.<\/em><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Skalierbarkeit<\/h3>\n\n\n\n<p><strong>\u2705 <em>Die Anwendung soll konzipiert sein, dass sie keine Performanceeinbu\u00dfen bei steigenden Nutzerzahlen hat.<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons Learned<\/h2>\n\n\n\n<p>Unser Projekt hat uns wertvolle Erkenntnisse vermittelt, die weit \u00fcber die technische Umsetzung hinausgehen. Besonders deutlich wurde, dass eine gr\u00fcndliche Planung und klare Zieldefinition von entscheidender Bedeutung sind. Zu Beginn hatten wir noch wenig Vorstellung davon, wohin das Projekt letztlich f\u00fchren sollte \u2013 was vor allem an unserer Unerfahrenheit im Umgang mit Cloud-Diensten geschuldet war. Das regelm\u00e4\u00dfige Feedback w\u00e4hrend des Semesters half uns jedoch dabei schrittweise unserer L\u00f6sung n\u00e4her zu kommen.<\/p>\n\n\n\n<p>Vor diesem Projekt hatten wir beide noch nicht wirklich mit AWS gearbeitet, und es war f\u00fcr uns daher \u00e4u\u00dferst wertvoll, einen Einblick in einen kleinen Teil der verf\u00fcgbaren Dienste zu erhalten. Diese Erfahrung hat uns eine solide Grundlage und ein besseres Verst\u00e4ndnis vermittelt, auf dem wir in zuk\u00fcnftigen Projekten aufbauen k\u00f6nnen.<\/p>\n\n\n\n<p>Ein weiteres gro\u00dfes Learning war das Thema Skalierung. Der Aufbau einer skalierbaren Anwendung brachte viele Herausforderungen mit sich \u2013 von der Umstrukturierung der Datenbank bis hin zur Integration von skalierbaren Services wie Auto Scaling Groups und Load Balancern. Dabei haben wir schmerzhaft erfahren, welche Konsequenzen es hat, wenn man Skalierung nicht von Anfang an ausreichend ber\u00fccksichtigt wird.<\/p>\n\n\n\n<p>Auch wenn sich die Konfiguration von NextCloud als komplizierter als zun\u00e4chst vermutet herausgestellt hat, sind wir dennoch zufrieden mit unserer Entscheidung auf eine Open-Source L\u00f6sung gesetzt zu haben, da wir dadurch die meiste Kapazit\u00e4t in die Infrastruktur legen konnten und weniger auf die reine Software-Entwicklung.<\/p>\n\n\n\n<p>Somit stellte f\u00fcr uns dieses Projekt den idealen Anwendungsfall dar, um praxisnah viele f\u00fcr uns relevante Konzepte des System Engineerings kennenzulernen und ein solides Fundament f\u00fcr zuk\u00fcnftige Projekte in diesem Bereich zu bilden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h1 class=\"wp-block-heading\">Literatur<\/h1>\n\n\n\n<p>[1] <a href=\"https:\/\/docs.aws.amazon.com\/decision-guides\/latest\/storage-on-aws-how-to-choose\/choosing-aws-storage-service.html\">https:\/\/docs.aws.amazon.com\/decision-guides\/latest\/storage-on-aws-how-to-choose\/choosing-aws-storage-service.html<\/a><\/p>\n\n\n\n<p>[2] <a href=\"https:\/\/docs.aws.amazon.com\/decision-guides\/latest\/storage-on-aws-how-to-choose\/choosing-aws-storage-service.html\">https:\/\/docs.aws.amazon.com\/decision-guides\/latest\/storage-on-aws-how-to-choose\/choosing-aws-storage-service.html<\/a><\/p>\n\n\n\n<p>[3] <a href=\"https:\/\/nextcloud.com\/de\/presse\/\">https:\/\/nextcloud.com\/de\/presse\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>tl;dr: Unser Semester-Projekt bestand im Aufbau einer skalierbaren File-Share-L\u00f6sung auf AWS auf Basis von NextCloud. Unsere Motivation bestand darin die volle Kontrolle \u00fcber die eigenen Daten zu erlangen, individuelle Anpassbarkeit zu erm\u00f6glichen und eine Kosteneffizienz zu erreichen. Es wurden klare Ziele in den Bereichen Verf\u00fcgbarkeit, Performanz, Sicherheit und Skalierbarkeit definiert, anhand deren das Projekt ausgerichtet [&hellip;]<\/p>\n","protected":false},"author":1233,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[84,1075,1019,424],"ppma_author":[1074],"class_list":["post-27142","post","type-post","status-publish","format-standard","hentry","category-system-engineering","tag-aws","tag-nextcloud","tag-system-engineering","tag-system-engineering-and-management"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":21693,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/20\/recall-trainer-eine-serverless-web-app-mit-aws\/","url_meta":{"origin":27142,"position":0},"title":"Recall Trainer &#8211;  Eine serverless Web-App mit AWS","author":"lr066","date":"20. September 2021","format":false,"excerpt":"Einleitung Im Rahmen der Vorlesung \u201cSoftware Development for Cloud Computing\u201d habe ich im vergangenen Semester eine Einf\u00fchrung in die Welt des Cloud Computings incl. der relevanten Konzepte und Technologien erhalten. Einige dieser Konzepte habe ich versucht in meinem Abschlussprojekt umzusetzen, das ich im Nachfolgenden vorstellen m\u00f6chte.\u00a0 Idee\/Projekt Die Idee war\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\/signup1-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\/signup1-150x150.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":21163,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/15\/cloud-basierter-password-manager\/","url_meta":{"origin":27142,"position":1},"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":[]},{"id":23679,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/31\/jobsuche-portal\/","url_meta":{"origin":27142,"position":2},"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":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":27142,"position":3},"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":25800,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/14\/splid-2-0-die-zukunft-des-gemeinsamen-ausgabenmanagements\/","url_meta":{"origin":27142,"position":4},"title":"Splid 2.0 &#8211; Die Zukunft des gemeinsamen Ausgabenmanagements","author":"David Christoph Scheifers","date":"14. September 2023","format":false,"excerpt":"Im Rahmen der Vorlesung \u201cSoftware Development for Cloud Computing\u201d haben wir uns daf\u00fcr entschieden, einen Klon der App Splid auf Basis unterschiedlicher Cloud Technologien als Web App zu entwickeln, um uns so die Grundkenntnisse des Cloud Computings anzueignen. Projektidee Bei gemeinsamen Aktivit\u00e4ten und Gruppenausgaben ist es sehr hilfreich, einfache und\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\/2023\/09\/image6.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/image6.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/image6.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/image6.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/image6.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/image6.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":12032,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/09\/30\/admin-panel-web-app-in-der-aws-cloud\/","url_meta":{"origin":27142,"position":5},"title":"Admin Panel (Web App) in der AWS Cloud","author":"ss447","date":"30. September 2020","format":false,"excerpt":"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\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\/img.youtube.com\/vi\/qw9ZkWnvR4M\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":1074,"user_id":1233,"is_guest":0,"slug":"maximilian_tyrchan","display_name":"Max Tyrchan","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/9843d7f51dd52d216061ffab1b483e14f1a1e64b951cd6ca6036146e13cfd202?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\/27142","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\/1233"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=27142"}],"version-history":[{"count":7,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/27142\/revisions"}],"predecessor-version":[{"id":27405,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/27142\/revisions\/27405"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=27142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=27142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=27142"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=27142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}