{"id":21515,"date":"2021-09-16T20:34:54","date_gmt":"2021-09-16T18:34:54","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=21515"},"modified":"2023-06-18T17:56:59","modified_gmt":"2023-06-18T15:56:59","slug":"application-updater-mit-addon-verwaltung","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/16\/application-updater-mit-addon-verwaltung\/","title":{"rendered":"Application Updater mit Addon-Verwaltung"},"content":{"rendered":"\n<p><strong>von Mario Beck (mb343) und Felix Ruh (fr067)<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Unser Ziel war es, einen Programm Updater f\u00fcr Entwickler zu erstellen, den diese einfach in ihre CI\/CD-Pipeline integrieren k\u00f6nnen. F\u00fcr die Umsetzung haben wir die IBM Cloud und eine Serverless Architektur verwendet, um eine unbegrenzte Skalierbarkeit zu erreichen. Zu den verwendeten Serverless Services z\u00e4hlen die Cloud Functions, DB2 und ein Object Storage.<\/p>\n\n\n\n<p>Das Projekt besteht aus einem Uploader, mit dem der Entwickler sein Programm in den Object Storage hochladen kann. Und einem Downloader f\u00fcr den Benutzer, mit dem automatisch die aktuelle Version heruntergeladen wird.<\/p>\n\n\n\n<p>Verwendung aus der Entwicklersicht:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Programm wird registriert und man bekommt die dazugeh\u00f6rigen API-Keys<\/li><li>Erstellen der Config f\u00fcr den Downloader<\/li><li>Mit dem Uploader kann das Programm hochgeladen werden, dies kann einfach in eine CI\/CD Pipeline eingebunden werden<\/li><\/ul>\n\n\n\n<p>Verwendung aus der Benutzersicht:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Herunterladen des Downloaders und der Config<\/li><li>Starten des Downloaders<\/li><li>Vor Programmstart wird nach neuen Updates gesucht und diese falls vorhanden heruntergeladen<\/li><li>Nach dem Update wird das eigentliche Programm gestartet<\/li><\/ul>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Entwicklersicht<\/h4>\n\n\n\n<p><span style=\"text-decoration: underline;\">Programm registrieren:<br><\/span><code class=\"\" data-line=\"\">java -jar upload.jar registerprogram -p &lt;name&gt; --publishread<\/code><br><span style=\"text-decoration: underline;\">Config erstellen:<br><\/span><code class=\"\" data-line=\"\">updater_info.json : {&quot;program&quot;: &quot;&lt;name&gt;&quot;, &quot;exe&quot;: &quot;&lt;path to exe&gt;&quot;, &quot;modules&quot;: [{&quot;module&quot;: &quot;main&quot;, &quot;version&quot;: &quot;&quot;}]}<\/code><br><span style=\"text-decoration: underline;\">Beispiel Command f\u00fcr CI\/CD:<br><\/span><code class=\"\" data-line=\"\">java -jar upload.jar upload -a &lt;apiKey&gt; -p &lt;name&gt; -v &lt;version&gt; PATH_TO_UPLOAD<\/code><br><span style=\"text-decoration: underline;\">(Optional) Extra Modul registrieren:<br><\/span><code class=\"\" data-line=\"\">java -jar upload.jar registermodule -a &lt;apiKey&gt; -p &lt;name&gt; -m &lt;moduleName&gt;<\/code><br><span style=\"text-decoration: underline;\">(Optional) Auf neuem Modul hochladen:<br><\/span><code class=\"\" data-line=\"\">java -jar upload.jar upload -a &lt;apiKey&gt; -p &lt;name&gt; -m &lt;moduleName&gt;&nbsp; -v &lt;version&gt; PATH_TO_UPLOAD<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Benutzersicht:<\/strong><\/h4>\n\n\n\n<p>1. Herunterladen des Downloaders und Config<br>2. Starten der \u201cdownload.exe\u201d, config muss auf derselben Ebene des Downloaders liegen. (.\/download.exe)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"module_anchor\">Module<\/h2>\n\n\n\n<p>Jedes Programm, welches von einem Entwickler registriert wird, ist in Module gegliedert.<\/p>\n\n\n\n<p>Dabei wird bei der Registrierung des Hauptprogramms das Hauptmodul automatisch erstellt. Dieses Hauptmodul beinhaltet alle Dateien, die f\u00fcr das Programm grunds\u00e4tzlich ben\u00f6tigt werden.<\/p>\n\n\n\n<p>Es ist dann auch m\u00f6glich, weitere Module f\u00fcr dieses Programm zu registrieren. Alle Dateien, welche in diesen enthalten sind, k\u00f6nnen dann zus\u00e4tzlich zu den Dateien des Hauptmoduls heruntergeladen werden.<\/p>\n\n\n\n<p>Dies erm\u00f6glicht eine sehr einfache Erweiterung des Hauptprogramms und kann daher unumst\u00e4ndlich f\u00fcr die Umsetzung von Plugins oder DLCs genutzt werden.<\/p>\n\n\n\n<p>Zus\u00e4tzliche Module k\u00f6nnen vom Entwickler des Hauptmoduls, aber auch von 3rd-Party Entwicklern registriert werden. Die einzige M\u00f6glichkeit, 3rd-Party Entwickler nicht f\u00fcr Module zuzulassen, ist die Entwicklung eines eigenen Downloadprogramms.<\/p>\n\n\n\n<p>Der Endnutzer kann au\u00dferdem sehr einfach ausw\u00e4hlen, welche zus\u00e4tzlichen Module er herunterladen m\u00f6chte und welche nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Versionen<\/h3>\n\n\n\n<p>Jedes Modul hat eine Versionierung. Das bedeutet, beim Hochladen der Dateien muss eine Versionsnummer oder -bezeichnung vergeben werden.<\/p>\n\n\n\n<p>Dadurch ist es m\u00f6glich, dass beim Updaten des Moduls nur die Dateien heruntergeladen werden m\u00fcssen, die sich ver\u00e4ndert haben. Selbiges gilt auch f\u00fcr die Speicherung im Object Storage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aufbau\/Architektur<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/2Xm6C796zo2bKdR7vQcqT8XGeTOTcc06R3pnYxMUn7a5YxVHMuPvb-U7hf6czzSLpNEkFIX2r6F6svOBdR1D2Cgt_KhJR5dQ3EHakJlQnZcMb3mHBQtb3a_e0hBLI-dMA_xlgpX9=s0\" alt=\"\"\/><figcaption>Architektur \u00dcbersicht<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">API Routen<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">POST registerprogram\/-module <\/h4>\n\n\n\n<p>Bei den \/register Routen k\u00f6nnen neue Programme und Module registriert werden. Dabei werden die entsprechenden Eintr\u00e4ge in der Datenbank erstellt und dem Entwickler wird ein API-Schl\u00fcssel gegeben, um Schreibzugriff auf das Modul zu erm\u00f6glichen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">POST upload<\/h4>\n\n\n\n<p>Mit der \/upload Route werden die Dateien einer neuen Version angegeben, sodass diese in der Datenbank registriert werden k\u00f6nnen. Dabei werden alle Hashes der Dateien \u00fcbergeben, sodass die Cloud-Function nur die neuen Dateien eintr\u00e4gt.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">POST requestpublictoken <\/h4>\n\n\n\n<p>Mit der \/requestpublictoken Route kann man sich Bearer Tokens f\u00fcr alle ver\u00f6ffentlichten Module anfordern, um Lesezugriff auf den entsprechenden Bucket zu erhalten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">GET getfiles<\/h4>\n\n\n\n<p>Mit der \/getfiles Route kann eine Liste der ben\u00f6tigten Files angerufen werden, die ben\u00f6tigt werden, um von einer Version auf eine andere zu kommen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Filestorage: Cloud Object Storage (COS) <\/h3>\n\n\n\n<p>Wir haben ein Object Storage in dem alle Buckets, welche jeweils f\u00fcr ein Programm oder Third-Party Module stehen (siehe <a href=\"#module_anchor\" title=\"#module_anchor\">Module<\/a>) erstellt werden.<\/p>\n\n\n\n<p>Diese Buckets werden alle in der EU Region erstellt, das ist nicht optimal und k\u00f6nnte mit mehr verf\u00fcgbaren Ressourcen verbessert werden (siehe <a href=\"#verbesserter_download_anchor\" title=\"#verbesserter_download_anchor\">Verbesserungsm\u00f6glichkeiten<\/a>).<\/p>\n\n\n\n<p>In diesen Buckets werden alle unterschiedlichen Versionen und Module gespeichert, um diese zu unterscheiden werden die mit einem gewissen Prefix gekennzeichnet, der wie folgt aufgebaut ist: programname_modulname_version.<\/p>\n\n\n\n<p>Um die Ordnerstruktur beizubehalten, folgt nach dem Prefix der Pfad mit dem Dateinamen am Ende.<\/p>\n\n\n\n<p>Beispiel eines f\u00fcr die Unit Tests erstellten Buckets:<br>downloadTestingBucket_main_1\/testFolder\/testFolder1\/test_file_3.txt<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">DB2<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/GqS7NmYTHoIeJelooA0oI8pM8d4PI7a7woNU_lmyNXFmgLfsoF28eD4dDWTSze1kjiKPuySj7DXtnrlNZipf6-VkAgWcbFF9M3DmayEgq91DEVljb4R8-y-xWbUIm9nV8P4eQFxS=s0\" alt=\"\"\/><figcaption>ER-Diagramm<\/figcaption><\/figure>\n\n\n\n<p>Wir haben das relationale Datenbank Management System DB2 von IBM benutzt.<\/p>\n\n\n\n<p>Dort werden alle Informationen der Programme, dessen Module und Dateien gespeichert.<\/p>\n\n\n\n<p>Zu Optimierungszwecken besteht zwischen den Versionen und den Files eine \u201cN zu M\u201d-Beziehung, sodass alte Dateien nicht doppelt gespeichert werden und Redundanz vermieden wird. Eine Datei kann also zu mehreren Versionen geh\u00f6ren, wenn diese sich nicht ver\u00e4ndert hat.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Downloader<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Default Downloader<\/h4>\n\n\n\n<p>Mit dem Downloader soll es m\u00f6glich sein Programme vor dem eigentlichen Programmstart zu aktualisieren. Die Downloader Executable ist somit f\u00fcr den eigentlichen Programmstart und das Updaten verantwortlich.<\/p>\n\n\n\n<p>Der Downloader sucht zuerst nach einer neuen Version und aktualisiert das Programm, falls eine vorhanden ist. Nach dem Update wird dann das eigentliche Programm gestartet, welches in einer Config Datei angegeben ist. In dieser Config Datei wird au\u00dferdem noch angegeben, um welches Programm es sich handelt und welche Module mit welcher Version installiert sind.<\/p>\n\n\n\n<p>Um weitere Module zu installieren, gibt es die M\u00f6glichkeit der Exe ein Start Argument mit zu \u00fcbergeben, durch welches man in der Konsole dann alle m\u00f6glichen Module aufgelistet bekommt und unter diesen ausw\u00e4hlen kann, welche man installieren m\u00f6chte.<\/p>\n\n\n\n<p>Anwendung: \u201c.\/download.exe modules\u201d<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Custom Downloader<\/h4>\n\n\n\n<p>Es w\u00e4re ebenso m\u00f6glich, sich einen benutzerdefinierten Downloader zu schreiben. Das ist beispielsweise notwendig, falls man f\u00fcr ein Programm nicht den Public Access aktiviert, da in dem Default Downloader die Tokens f\u00fcr die Lese Berechtigung des Buckets \u00fcber die Route \/requestpublictoken angefordert werden.<\/p>\n\n\n\n<p>Au\u00dferdem ist es so m\u00f6glich, 3rd-Party Module zu unterbinden und Geld f\u00fcr die eigenen Module zu verlangen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uploader<\/h3>\n\n\n\n<p>Der Uploader ist eine Java CLI Anwendung, die mithilfe von dem picocli Framework erstellt wurde. Durch das Framework war es m\u00f6glich, simpel und schnell eine Konsolen Anwendung zu schreiben.<\/p>\n\n\n\n<p>Mit dem Uploader ist es m\u00f6glich, Programme und Module zu erstellen\/registrieren und ein Programm hochzuladen. Beim Uploaden einer neuen Version werden au\u00dferdem nur die Dateien hochgeladen, die sich seit der letzten Version ver\u00e4ndert haben. Der Ablauf des Programmes ist wie folgt:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"646\" height=\"72\" src=\"https:\/\/lh4.googleusercontent.com\/H39OWwsIIPG5S_3SzxLCRbrMHu05CoB4TQgguJojyC0kHR5lNTJn5ffF6-2N1N6hrLx1PTIICwIKcZQ8JKZErFb8hEVw_Fg0pnfU35E3PJ9FqUifcpwbEgL_dYjQf2TgM9q5CcV2=s0\">&nbsp;<\/p>\n\n\n\n<p>Die Dateien werden parallel gehasht und sp\u00e4ter ebenso parallel geuploadet.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Man Page des CLI Programms:<\/span><\/p>\n\n\n\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-code\" style=\"font-size:11px\"><code class=\"\" data-line=\"\">Commands:\n  registermodule                    Register a new module\n  registerprogram                   Register a new program and get the corresponding api key\n  upload                            upload files\n\nregistermodule:\nRegister a new module\n  -a, --apiKey=&lt;apiKey&gt;             The corresponding Api Key to the bucket\/program\n  -b, --newbucket                   Creates the custom module in a new bucket. Default is false\n  -c, --custommodule=&lt;customModule&gt; Module name of the custom module which was used to create a new bucket\n  -m, --module=&lt;moduleName&gt;         Module name to add\n  -p, --program=&lt;programName&gt;       name where the module gets added to\n  -r, --publishread                 Everyone can download your custom module. Default is false\n\nregisterprogram:\nRegister a new program and get the corresponding api key\n  -p, --program=&lt;programName&gt;       The name of the program you want to register\n  -r, --publishread                 Everyone can download your program\n\nupload:\nupload files\n      FOLDER                        folder which should get uploaded\n  -a, --apiKey=&lt;apiKey&gt;             The corresponding Api Key to the bucket\/program\n  -m, --module=&lt;moduleName&gt;         Module name of the files to upload. Default is main\n  -p, --program=&lt;programName&gt;       Program name of the files to upload.<\/code><\/pre>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Authentification<\/h2>\n\n\n\n<p>Damit man nicht in den Buckets von fremden Entwicklern Dateien hochladen kann und somit dort Schadware verbreitet wird, erfolgt eine Authentifizierung \u00fcber die IBM Service-IDs (IAM).<\/p>\n\n\n\n<p>Bei der Registrierung eines Programms oder Moduls werden zwei Service-IDs erstellt. Davon hat einer nur Leseberechtigungen und eine hat Schreib- und Leseberechtigungen f\u00fcr den Bucket des Entwicklers im Object Storage. Der Entwickler bekommt dann zwei entsprechende API-Keys zum Hochladen der Dateien und zum Verteilen der Software.<\/p>\n\n\n\n<p>Der Schl\u00fcssel mit Lesezugriff kann entweder direkt ver\u00f6ffentlicht werden, oder der Entwickler beh\u00e4lt diesen f\u00fcr sich.<\/p>\n\n\n\n<p>Wenn er ihn f\u00fcr sich beh\u00e4lt, muss er einen eigenen Downloader schreiben, mit welchem er dann den Zugriff darauf beschr\u00e4nken kann.<\/p>\n\n\n\n<p>Momentan kann sich jeder beliebig viele Module registrieren, und es gibt keine M\u00f6glichkeit nachzuvollziehen, wer welche Module registriert hat. Wenn man dies erreichen m\u00f6chte kann man Services benutzen, welche \u00e4quivalent zu AWS Cognito sind. M\u00f6glichkeiten sind zum Beispiel \u201cApp ID\u201d (allerdings keine Berechtigungsverwaltung f\u00fcr Buckets) oder IBM Security Verify (allerdings nicht als Service in der Cloud nutzbar).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CI\/CD-Pipeline<\/h2>\n\n\n\n<p>Wir betreiben eine simple CI\/CD Pipeline \u00fcber Gitlab. Diese testet alle Teilprojekte (Functions, Downloader, Uploader), daraufhin wird f\u00fcr den Uploader eine Jar erstellt, f\u00fcr den Downloader eine Executable und die Functions werden auf die IBM Cloud deployed.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/Nvmfgi2migJRXJDl6PFJ7VanQdfeXTIWkteQrimpriS78O1tg0Z-NRVOIorh307AqdHpmvF_kaYC1a1vFRm-87wp_V-zQytYJk792kwuq5p-OMbI93qSika_IWYmp0aGZpap7Qi4=s0\" alt=\"\"\/><figcaption>CI\/CD-Pipeline<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Tests Uploader<\/h3>\n\n\n\n<p>Mit den Unit Tests f\u00fcr den in Java geschriebenen Uploader wird sichergestellt, dass Dateien korrekt in den Bucket hochgeladen werden. Au\u00dferdem wird getestet, ob die Ordnerstruktur beibehalten wird. Die anderen Funktionen wie das Registrieren eines Programms oder Moduls muss nicht getestet werden, da das nur Api Calls sind, die schon bei den Api Tests getestet wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests Downloader<\/h3>\n\n\n\n<p>Mit den Unit Tests f\u00fcr den in Python geschriebenen Downloader, wird sichergestellt, dass Dateien korrekt, vollst\u00e4ndig und in den richtigen Pfad heruntergeladen werden. Au\u00dferdem wird getestet, ob Ordner korrekt erstellt werden und ob die Ordnerstruktur die richtige ist. Da das Programm nicht wirklich mehr Funktionen hat, muss auch nicht mehr getestet werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests API-Routen<\/h3>\n\n\n\n<p>Die Routen der API werden mithilfe von Maven getestet. Wir haben uns daf\u00fcr entschieden Maven zu verwenden, da es das Testing-Tool ist, mit welchem wir uns am besten auskennen.<\/p>\n\n\n\n<p>Im Nachhinein w\u00e4re es besser gewesen, ein anderes Tool daf\u00fcr zu verwenden, da so keine grundlegenden Unit-Tests m\u00f6glich sind, sondern lediglich die Gesamtfunktionalit\u00e4t der Route \u00fcberpr\u00fcft werden kann.<\/p>\n\n\n\n<p>Au\u00dferdem k\u00f6nnte man die Tests noch verbessern, indem man eine eigene Testumgebung erstellt und dort testet, statt dies in der produktiven Umgebung zu machen. Das war uns leider nicht m\u00f6glich, da der IMB-Lite-Account nur eine Instanz pro Service zul\u00e4sst.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Deployment von Functions<\/h3>\n\n\n\n<p>Die Functions laufen auf einem benutzerdefinierten Docker Build, welches in der in der Pipeline gebaut werden sollte, aber leider nicht m\u00f6glich war, siehe Herausforderungen. Nach dem Bauen und Pushen des Docker Build werden die Functions zusammen mit dem Docker Image geupdatet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Herausforderungen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Aspera<\/h3>\n\n\n\n<p>Da in der IBM Cloud Object Storage Dokumentation erw\u00e4hnt wurde, dass man f\u00fcr gro\u00dfe Dateigr\u00f6\u00dfe Aspera verwenden soll, haben wir versucht, das in das Java Uplaoder Programm mit einzubauen. Aspera ist eine Datei\u00fcbertragungs und Streaming Technologie.<\/p>\n\n\n\n<p>Anstatt das Standarduploadverfahren der Cos API zu nutzen, haben wir versucht die Aspera Java API zu benutzen. Dabei hatten wir aber Probleme, da die Dateien zwar hochgeladen wurden, die laufende Uploads aber nicht korrekt beendet wurden und somit ab einem gewissen Zeitpunkt keine Uploads mehr gestartet werden konnten, da ein Maximum erreicht wurde.<\/p>\n\n\n\n<p>Da uns das Problem aber zu viel Zeit gekostet hat und wir es nicht gel\u00f6st bekommen haben, sind wir auf den Multipartupload umgestiegen. Das ist zwar nicht so effizient, aber hilft trotzdem f\u00fcr gro\u00dfe Dateigr\u00f6\u00dfen, da die Datei in kleinere Parte unterteilt werden, welche dann hochgeladen werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker Image Build in der Pipeline<\/h3>\n\n\n\n<p>Es war geplant, das Docker Image, das selbst geschrieben Helper Funktionen und ein weiteres IBM-Package enth\u00e4lt, in der Pipeline zu bauen und zu pushen, was aber aufgrund von Gitlab Pipeline Runner Limitierungen nicht m\u00f6glich war.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cloud Functions sind nicht f\u00fcr den Upload von Dateien geeignet<\/h3>\n\n\n\n<p>Unsere urspr\u00fcngliche Idee war es, die Dateien nicht \u00fcber den Uploader in den COS hochzuladen, sondern diese der \/upload Route als Argument zu \u00fcbergeben. So w\u00e4re es m\u00f6glich gewesen, dass die Route die komplette Logik \u00fcbernimmt, welche Dateien, wo hochgeladen werden m\u00fcssen.<\/p>\n\n\n\n<p>Allerdings haben die Cloud Functions ein Upload-Limit von ein paar Megabytes. Dadurch war uns nicht m\u00f6glich, die Logik komplett auszulagern. Stattdessen wird als Argument der Route nur eine Liste mit den Namen und Hashes der Dateien gegeben. Damit kann die Route dann die Datenbank updaten und als Antwort dem Client mitteilen, welche Dateien er hochladen muss.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keine eigenen Bibliotheken mit NodeJS in Cloud Functions m\u00f6glich<\/h3>\n\n\n\n<p>Wenn man die Standard NodeJS-Umgebung der Cloud Functions verwendet, sind darin nur einzelne Bibliotheken vorhanden. M\u00f6chte man eigene Bibliotheken verwenden, muss man ein Dockerimage erstellen.<\/p>\n\n\n\n<p>Da wir bis zu diesem Zeitpunkt noch nie Docker verwendet hatten, mussten wir uns dort erst etwas einarbeiten. Sobald jedoch alles aufgesetzt war, hat es einwandfrei funktioniert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verbesserungen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Test Db &amp; Test Cos<\/h3>\n\n\n\n<p>F\u00fcr die Tests w\u00e4re es optimal, die Produktion Datenbank und Object Storage von den Tests zu trennen. Das ist f\u00fcr uns aber leider nicht m\u00f6glich, da wir durch den Lite Plan nur eine Db und einen Object Storage benutzten k\u00f6nnen. Deshalb l\u00e4uft alles \u00fcber dieselbe Datenbank und Object Storage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"verbesserter_download_anchor\">Verbesserte Downloadgeschwindigkeit f\u00fcr den Download<\/h3>\n\n\n\n<p>Die Geschwindigkeit des Dateiuploads und Downloads sind schon recht gut optimiert, und wir konnten selbst mit einem Download von 900 Mbit\/s kein Limit erreichen.<\/p>\n\n\n\n<p>Allerdings werden zurzeit alle Programme direkt aus dem entsprechendem Bucket in Europa heruntergeladen. Um eine verbesserte Downloadgeschwindigkeit zu erreichen, wenn viele Benutzer \u00fcber verschiedene Kontinente etwas herunterladen, kann ein Content Delivery Network (CDN) verwendet werden. Dies war uns leider mit einem Lite-Account nicht m\u00f6glich.<\/p>\n\n\n\n<p>Alternativ k\u00f6nnten auch mehrere Buckets pro Programm in verschiedenen Regionen erstellt werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Limit der Service-IDs<\/h3>\n\n\n\n<p>Wir verwenden f\u00fcr die Authentifizierung die IAM Service-IDs und diese sind pro Account auf 2000 St\u00fcck beschr\u00e4nkt. F\u00fcr jedes Programm wird ein neuer Bucket erstellt und jeder Bucket ben\u00f6tigt 2 Service-IDs (eine pro API-Key).<\/p>\n\n\n\n<p>Das bedeutet, dass unser Projekt auf 1000 Buckets beschr\u00e4nkt ist, und es keine einfache M\u00f6glichkeit gibt dieses Limit zu erh\u00f6hen.<\/p>\n\n\n\n<p>Die beste M\u00f6glichkeit ist es nicht IAM zu verwenden und eine Alternative dazu zu finden oder etwas selber zu entwickeln. Es k\u00f6nnte beispielsweise das IMB-\u00c4quivalent des AWS Cognito Services verwendet werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Wir haben all unsere eigenen Anforderungen an das Projekt erfolgreich umgesetzt. Dabei sind wir auf einige Herausforderungen und Limitationen des Lite-Accounts der IBM-Cloud gesto\u00dfen.<\/p>\n\n\n\n<p>Haben uns aber auch mit vielen uns neuen Technologien, Themen und Konzepten auseinander gesetzt. Dazu z\u00e4hlen unter anderem Konzepte, wie Serverless Architektur und Skalierbarkeit.<\/p>\n\n\n\n<p>Aber auch der generelle Umgang mit Cloud-Funktionalit\u00e4ten insbesondere der Cloud Object Storage, DB2, Cloud Functions, Authentifizierung (IAM) und Docker.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>von Mario Beck (mb343) und Felix Ruh (fr067) Einleitung Unser Ziel war es, einen Programm Updater f\u00fcr Entwickler zu erstellen, den diese einfach in ihre CI\/CD-Pipeline integrieren k\u00f6nnen. F\u00fcr die Umsetzung haben wir die IBM Cloud und eine Serverless Architektur verwendet, um eine unbegrenzte Skalierbarkeit zu erreichen. Zu den verwendeten Serverless Services z\u00e4hlen die Cloud [&hellip;]<\/p>\n","protected":false},"author":1057,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[120,656,262,650],"tags":[150,7,538,539,541,3,98,47,537,390,285,540],"ppma_author":[858],"class_list":["post-21515","post","type-post","status-publish","format-standard","hentry","category-cloud-technologies","category-databases","category-rich-media-systems","category-scalable-systems","tag-ci-cd","tag-cloud","tag-cloud-functions","tag-cos","tag-db2","tag-docker","tag-gitlab","tag-ibm","tag-java","tag-nodejs-2","tag-python","tag-sql"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":24203,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/26\/die-zukunft-ist-serverless\/","url_meta":{"origin":21515,"position":0},"title":"Die Zukunft ist Serverless?","author":"Michael Partes","date":"26. February 2023","format":false,"excerpt":"\u00dcberblick Die \u201cCloud\u201d ist ein Begriff, der in den letzten Jahren immens an Bedeutung gewonnen hat. H\u00e4ufig wird sie f\u00fcr die Bereitstellung von Diensten und Services genutzt. Im Lauf der Zeit haben sich dabei verschiedene Architekturen entwickelt, die in der Cloud eingesetzt werden und unterschiedliche Ans\u00e4tze f\u00fcr die Handhabung des\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:\/\/lh5.googleusercontent.com\/hnARrH3Mz7d41IhTltMgTCpuUfKpg8k6ur_0Ir46moShZzCf53cVBMeUogOFgp2yD-maHIuCu3CIOsnqE_oBCOrEEaB-KfPc8lsQ5jWanA8hFVPvMdC5XYLBboHJ_lUbrtMT5aVqtMNUjTbsLQQNuoM","width":350,"height":200,"srcset":"https:\/\/lh5.googleusercontent.com\/hnARrH3Mz7d41IhTltMgTCpuUfKpg8k6ur_0Ir46moShZzCf53cVBMeUogOFgp2yD-maHIuCu3CIOsnqE_oBCOrEEaB-KfPc8lsQ5jWanA8hFVPvMdC5XYLBboHJ_lUbrtMT5aVqtMNUjTbsLQQNuoM 1x, https:\/\/lh5.googleusercontent.com\/hnARrH3Mz7d41IhTltMgTCpuUfKpg8k6ur_0Ir46moShZzCf53cVBMeUogOFgp2yD-maHIuCu3CIOsnqE_oBCOrEEaB-KfPc8lsQ5jWanA8hFVPvMdC5XYLBboHJ_lUbrtMT5aVqtMNUjTbsLQQNuoM 1.5x"},"classes":[]},{"id":23579,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/","url_meta":{"origin":21515,"position":1},"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":21683,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/18\/ynstagram-cloud-computing-mit-aws-serverless\/","url_meta":{"origin":21515,"position":2},"title":"Ynstagram &#8211; Cloud Computing mit AWS &amp; Serverless","author":"ns144","date":"18. September 2021","format":false,"excerpt":"Im Rahmen der Vorlesung \u201cSoftware Development for Cloud Computing\u201d haben wir uns hinsichtlich des dortigen Semesterprojektes zum Ziel gesetzt einen einfachen Instagram Klon zu entwerfen um uns die Grundkenntnisse des Cloud Computings anzueignen. Grundkonzeption \/ Ziele des Projektes Da wir bereits einige Erfahrung mit React aufgrund anderer studentischer Projekte sammeln\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\/Prasentation_CC_01.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\/Prasentation_CC_01.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=1400%2C800&ssl=1 4x"},"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":21515,"position":3},"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":26208,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/29\/die-meere-der-systemtechnik-navigieren-eine-reise-durch-die-bereitstellung-einer-aktien-webanwendung-in-der-cloud\/","url_meta":{"origin":21515,"position":4},"title":"Die Meere der Systemtechnik navigieren: Eine Reise durch die Bereitstellung einer Aktien-Webanwendung in der Cloud","author":"mk306","date":"29. February 2024","format":false,"excerpt":"Auf zu neuen Ufern: Einleitung Die Cloud-Computing-Technologie hat die Art und Weise, wie Unternehmen Anwendungen entwickeln, bereitstellen und skalieren, revolutioniert. In diesem Beitrag, der im Rahmen der Vorlesung \u201c143101a System Engineering und Management\u201d entstanden ist, werden wir uns darauf konzentrieren, wie eine bereits bestehende Webanwendung zur Visualisierung und Filterung von\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\/2024\/02\/Dashboard2-Kopie-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":23517,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/29\/multiplayer-game-with-aws-stadtlandfluss\/","url_meta":{"origin":21515,"position":5},"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":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":858,"user_id":1057,"is_guest":0,"slug":"fr067","display_name":"fr067","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/0688c9d623593e3a7c4ad3188c86ce6a5de7eab6577bbaef1caeff0681da52ed?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\/21515","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\/1057"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=21515"}],"version-history":[{"count":120,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/21515\/revisions"}],"predecessor-version":[{"id":21677,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/21515\/revisions\/21677"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=21515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=21515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=21515"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=21515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}