Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 13 Min.

S3: Mehr als Dateien

Moderne Dateischnittstelle für moderne Applikationen.
© dotnetpro
Es ist in vielen Anwendungen unerlässlich, unstrukturierte Dateien oder größere Datenmengen zu speichern, welche nicht in eine typische Datenbank passen. In den zurückliegenden Jahrzehnten wurde dafür meist auf das Dateisystem zugegriffen. Mit dem Objektspeicher-Service Simple Storage Service (kurz: S3) von Amazon steht jedoch eine moderne Dateischnittstelle für moderne Applikationen bereit. Zu S3 kompatiblen Speicher haben übrigens auch andere Cloudspeicher-Anbieter im Portfolio, und darüber hinaus gibt es On-Premise-Angebote.Das Vorhalten von Daten und Dateien stellt eine grundlegende Entscheidung in der Software- und System-Architektur dar. Kein Bereich bleibt über die Lebensdauer eines Systems hinweg so stabil wie die anfangs festgelegten Systeme und Mechanismen zur Datenspeicherung einer Anwendung.Im zurückliegenden Jahrzehnt haben die bis dahin unangefochtenen relationalen Datenbanken eine Menge Konkurrenz bekommen, die sich inzwischen etabliert und in den meisten Fällen auch bewährt hat. NoSQL-Datenbanken wie MongoDB oder Redis sind nur einige Beispiele dafür. Ein Bereich, dem oft wenig Beachtung geschenkt wird, ist die Speicherung größerer Datenmengen oder einfacher binärer Dateien. Zwar verfügen einige NoSQL-Datenbanken über eigene Dateisystemstrukturen, die auch in einem Cluster genutzt werden können, jedoch greifen viele Softwarearchitekturen in einem solchen Fall auf das vorhandene, einfache Dateisystem zurück. Viele Anwendungen benötigen nun einmal die Möglichkeit, unstrukturierte Daten zu speichern. Sei es, weil man irgendwelche Dokumente oder Anhänge hinterlegen möchte, oder weil sich Informationen schlicht nicht in eine strukturierte Form bringen lassen.

Was ist falsch am konventionellen Dateisystem?

Falsch ist am konventionellen Dateisystem grundsätzlich nichts. Es erschwert Entwicklern jedoch die Arbeit in vielen der genannten Bereiche. Die heutigen Dateisysteme folgen in der Regel den Konzepten aus den 70er und 80er Jahren des vergangenen Jahrhunderts. Das bedeutet: Ich kann ein Verzeichnis lesen (sprich Dateien auflisten), einzelne Dateien erstellen, schreiben, lesen und löschen; letztendlich die typischen CRUD-Operationen (Create, Read, Update, Delete).Ein weiterer Punkt ist das sichere Verteilen und redundante Vorhalten dieser Daten. Selbstverständlich sind betriebskritische Speicher redundant ausgelegt, ob dies nun über ein RAID-System, softwarebasierte Redundanz (zum Beispiel Distributed File System oder Microsoft Storage-Pools) oder andere Konzepte stattfindet. Diese Konzepte haben jedoch immer eines im Blick: Es gibt eine Wahrheit und einen lokal festgelegten Speicher. Ebenso zeigt sich häufig, dass gerade softwarebasierte Redundanz in diesem Fall auf Synchronisation und damit auf Replikation basiert, welche gerade bei stetig angepassten Daten zu Problemen führen kann.Hier kommt S3 ins Spiel. S3 wurde von Amazon für seinen Cloud-Service AWS ins Leben gerufen und ist mittlerweile ein De-facto-Standard für das Speichern verteilter binärer Daten. Dies bedeutet, dass nicht nur Amazon in seinem Cloud-Umfeld entsprechende Speicher anbietet, sondern auch andere Anbieter, welche ihre Produkte als „Object-Storage“ oder „S3-kompatiblen Speicher“ anbieten.Für On-Premise-Lösungen gibt es ebenfalls eine Auswahl an Anwendungen, um einen eigenen S3-basierten Speicher aufbauen und für entsprechende Applikationen bereitstellen zu können. Das hierbei meist genutzte System ist MinIO [1], das es auch als Open-Source-Variante gibt und das neben den üblichen standardisierten S3-Funktionalitäten – die hier gleich noch vorgestellt werden – zusätzliche Features bietet, welche im Business-Umfeld unterschiedliche Vorteile bringen. Darüber hinaus existiert eine Vielzahl APIs für unterschiedliche Frameworks und Programmiersprachen. Dadurch ist das Anbinden eines S3-basierten Speichers für Entwickler sehr einfach zu bewerkstelligen.

Was machen S3-basierte Speicher anders?

Grundsätzlich kann man sagen: S3-basierte Objektspeicher sind im Grunde nichts anderes als NoSQL-Datenbanken. Diese sind nach dem Key-Value-Konzept aufgebaut und bieten zu einem gewissen Schlüssel (Key) entsprechende Werte (in diesem Fall ein binäres Objekt, BLOB). Aus diesem Grunde ist dieser Speicher nicht so aufgebaut, dass Sie den Inhalt dieser Daten strukturieren und möglichst schnell filtern oder analysieren können. Im Gegenteil: Der S3-Speicher will im Optimalfall gar nicht wissen, was in den zu speichernden Daten steckt – es ist unerheblich, ob es sich um ein PDF-Dokument, eine CAD-Zeichnung, ein Bild oder XML- oder JSON-Daten handelt.Neben der eigenen Struktur, die man über die Keys selbst aufbauen kann (ähnlich einer Verzeichnisstruktur zum Beispiel) werden alle Objekte sogenannten Buckets zugeordnet. Jeder Bucket hat dedizierte Eigenschaften und jede Anwendung besitzt einen oder mehrere Buckets.Das Anbinden dieses Speichers erfolgt über ein Web API. Jedes Objekt kann als Ressource behandelt werden und gemäß API erstellt, verändert oder gelöscht werden. Einer der Vorteile ist die Abstraktion. Ob der S3-Speicher auf einem Windows- oder Linux-System, On-Premise oder in der Cloud liegt und ob er auf mehrere Standorte verteilt arbeitet, inte­ressiert die Anwendung nicht. Der S3-Speicher eignet sich folglich besonders gut für moderne Webanwendungen und Cloud-Backends.

Redundanz und verteilter Speicher

Die S3-Schnittstelle ist nicht für die Redundanz zuständig. Diese Aufgabe übernimmt die serverseitige Implementierung. Eine S3-Umgebung kann prinzipiell auch als einzelne Umgebung aufgebaut werden, welche keinen verteilten Speicher besitzt und nicht redundant ausgelegt ist. Dies ist jedoch bei S3-Instanzen, welche als Platform as a Service (PaaS) in der Cloud zur Verfügung gestellt werden, so gut wie nie der Fall. Zumindest die Bereitstellung innerhalb des gleichen Rechenzentrums ist redundant ausgelegt. Weltweit verteilte Umgebungen, sind – sofern sie überhaupt angeboten werden – mit Zusatzkosten verbunden.Das Open-Source-Produkt MinIO erlaubt ebenfalls einen verteilten Ansatz. Dafür stellt der Hersteller entsprechende Dokumentationen bereit [2].Egal wie Sie Ihren S3-Storage nutzen – die Redundanz liegt immer auf Objektebene. Dies bedeutet, dass die Daten in nahezu Echtzeit über die einzelnen Knoten verteilt werden und somit synchron bereitgestellt werden können. Des Weiteren erlaubt ein so geclustertes System flotte Lese- und Zugriffszeiten, da der Lesevorgang immer auf jedem Knoten durchgeführt werden kann. Wird ein Objekt häufig und zeitgleich genutzt, verteilen sich die Lasten innerhalb des Clusters. Sollten Sie sich für eine selbst gehostete Variante entscheiden, sind passende hardwareseitige Vorkehrungen erforderlich.

Objekte versus Dateien

Im Prinzip kann man sagen, dass ein konventionelles Dateisystem ebenfalls ein reiner Key-Value-Store ist. Das ist so weit korrekt, jedoch bietet S3 neben dem reinen Speichern eines Wertes (einer Datei) zu einem entsprechenden Schüssel zusätzliche Features. Dies sind zum Beispiel feingranulare Berechtigungen, Bereitstellungen (zum Beispiel öffentlich zugängliche Objekte/Dateien) und Metadaten zu einem Objekt. Diese Funktionalitäten können eine dedizierte Datenbank zum Speichern von Metadaten überflüssig machen.

Datenschutz by Design

Spätestens seit den tiefgreifenden gesetzlichen Regulierungen, welche 2018 im Rahmen der DSGVO in Kraft getreten sind, sind sowohl die Datenschutzbedenken als auch entsprechende technische Maßnahmen bei der Umsetzung von Systemen und Software nicht mehr wegzudenken. S3-Speicher kommt diesen Aufgaben entgegen. Die Schnittstelle definiert nicht nur Möglichkeiten der Verschlüsselung der Daten, sondern auch weitergehende Datenschutz-Features. Ein Teil ist die bereits erwähnte Verschlüsselung der Daten auf den Servern. Neben einer möglichen und individuell zu implementierenden clientseitigen Verschlüsselung stehen Methoden zur serverseitigen Verschlüsselung zur Verfügung. Hierbei wird ein entsprechender Key (dies unterscheidet sich von Anbieter zu Anbieter) sicher hinterlegt und jedes Objekt wird vor dem physikalischen Schreibvorgang verschlüsselt und beim Download entschlüsselt.Dies bringt neben der üblichen Transportsicherung (via HTTPS/TLS) auch die Sicherheit, dass der Betreiber selbst oder eine andere Person, falls sie Zugang zu den Daten bekommen, diese nicht ohne Weiteres nutzen können. Weitere datenschutzbezogene Features können mit den nachfolgenden Funktionen umgesetzt werden.

Objekt-Lebenszyklen und Sperren

Neben der reinen Verschlüsselung können Objekt-Lebenszyklen definiert werden. Beispiele für einen Objekt-Lebenszyklus sind Log-Dateien oder temporäre Dateien, die nach einer gewissen Zeit ablaufen und automatisch gelöscht werden. Diese Ereignisse können aber auch dazu genutzt werden, um die Objekte in andere Speicher zu übertragen, um so zum Beispiel einen Hot- neben einem Cold-Storage aufzubauen.Das Hinterlegen von Lebenszyklus-Konfigurationen kann je nach Anbieter unterschiedlich sein. Aufgrund der in der Regel kompatiblen S3-Schnittstellen stellt dies jedoch mit passenden SDKs kein Problem dar. Im Fall von MinIO könnte eine entsprechende Konfiguration als JSON beispielsweise wie folgt aussehen:

{ 
  "Rules": [ 
    { 
      "Expiration": { "Days": 7 }, 
      "ID": "TempFiles", 
      "Filter": { "Prefix": "_temp/" }, 
      "Status": "Enabled" 
    { 
  ] 
} 
 
In diesem Beispiel wurde eine Regel mit dem Namen TempFiles angelegt, die einen Ablauf nach sieben Tagen definiert und für sämtliche Objekte gilt, deren Key mit dem Präfix
_temp/ beginnt. Nutzt man dafür übliche Verzeichnisstrukturen und ein entsprechendes Namensschema, würde diese ­Regel für eine Datei mit dem Schlüssel _temp/test.pdf beim Upload gesetzt werden und nach sieben Tagen ablaufen. Dies führt konsequent dazu, dass Ablaufzeiten bereits auf Speicherebene garantiert werden und dies nicht anwendungs­seitig geschehen muss.Als komplettes Gegenteil zum soeben gezeigten Lebens­zyklus, der den Ablauf eines Objekts darstellt, existiert die Möglichkeit, Objekte zu sperren. Dies kann ebenfalls über Regeln festgelegt werden und gilt für den gesamten Bucket. S3 unterscheidet zwischen drei Möglichkeiten, Objekte zu sperren. Dabei arbeitet S3 nach dem WORM-Konzept (Write once, read many). Nur noch die Upload-Funktionen für ein neues Objekt werden akzeptiert. Weitere Aktionen unterliegen den hinterlegten Regeln. Die drei Optionen sind:
  • Governance Mode: Hierbei wird festgelegt, dass Objekte bis zu einem bestimmten Zeitpunkt nicht gelöscht oder überschrieben werden können. Autorisierte Benutzer können dies jedoch übergehen und Daten ändern oder löschen. Damit gibt es eine Kontrollinstanz.
  • Compliance Mode: Diese Methode ähnelt dem Governace Mode. Es wird ein Zeitpunkt festgelegt, bis zu dem die Daten im Bucket vorgehalten werden müssen. Jedoch kann in diesem Modus niemand das Locking übergehen, auch nicht der Administrator. Dieser Modus eignet sich für gesetzliche oder vertragliche Nachhaltefristen.
  • Legal Hold: In diesem Modus wird kein fest definierter Zeitpunkt hinterlegt. Die Objekte werden eingefroren, um zum Beispiel Revisionstätigkeiten durchführen zu können. Ausschließlich ein autorisierter Benutzer kann die Sperre aufheben.

Versionierung

Eine nicht ganz so strikte Methode, um Änderungen an Daten zu verhindern beziehungsweise sie besser nachvollziehbar zu machen, ist die Versionierung. Wird diese aktiviert, so werden Objekte nicht mehr überschrieben oder gelöscht, sondern immer als neue Version angelegt. In diesem Fall existieren zu einem Schlüssel neben der aktuellen Version auch noch ältere Versionen, welche dediziert abgefragt werden können. Im Fall eines Löschvorgangs wird für die neue Version des Objekts eine Löschmarkierung gesetzt. Bei einer Auflistung der Objekte wird die neueste Version nicht mehr aufgeführt, sie kann aber explizit abgerufen werden, falls dies notwendig ist. Alle Änderungen inklusive des Löschvorgangs können so zu jeder Zeit nachvollzogen werden.

Metadaten!

Für Anwendungsfälle, in welchen neben dem reinen Dateispeicher eine zusätzliche Datenbank für strukturierte Informationen existiert, ist dies vielleicht eine Randnotiz: Für andere Anwendungsfälle ist die Möglichkeit, Metadaten hinterlegen zu können, jedoch ein sehr hilfreiches Feature.Dies bedeutet, dass bei einem Upload ein dediziertes Objekt beziehungsweise ein Key-Value-Dictionary übergeben werden kann und dies zusammen mit dem Objekt gespeichert wird. Die Metadaten können weiterführende Informationen enthalten, welche anwendungsseitig genutzt werden können, ohne den eigentlichen (und oftmals größeren) Objektinhalt laden zu müssen.Eine Schwachstelle an diesem Konzept ist: Metadaten können nur beim Upload eines Objekts geschrieben werden. Das bedeutet, dass Änderungen an den Metadaten nur zusammen mit einem neuen Objekt-Upload möglich sind.

Anwendungsfälle für S3

Sicher sind Ihnen beim Lesen des Textes bereits ein paar mögliche Anwendungsfälle in den Sinn gekommen, beispielsweise das Rechts- und Compliance-sichere Umsetzen eines Datenspeichers.Grundsätzlich lohnt sich der Einsatz von S3, wenn man eine Cloud-Anwendung entwickelt. S3 entspannt das Datenhandling der Anwendung enorm, insbesondere wenn man nicht auf die physikalischen Ressourcen zugreifen kann oder möchte, sondern die Anwendung via Container betreibt.Im Falle einer On-Premise-Lösung ist ein Einsatz nur dann sinnvoll, wenn man mehrere Systeme mit S3-Speicher einsetzen möchte. Für eine einzelne Anwendung einen redundanten und geclusterten S3-Speicher zum Beispiel mit MinIO aufzusetzen ist wohl nur in den seltensten Fällen sinnvoll.

Anbindung mit .NET

Möchte man einen S3-kompatiblen Speicher in eine Anwendung integrieren, existieren unterschiedliche Varianten und SDKs. Nutzt man AWS S3, empfiehlt es sich, die AWS-SDKs für .NET zu verwenden. Hierbei kann man sichergehen, dass sämtliche Funktionen, welche der Amazon-Dienst anbietet, im SDK abgebildet wurden. Via NuGet lassen sich die Pakete wie folgt installieren:
PM> Install-Package AWSSDK.S3 
 
Wer jedoch lieber den offenen Ansatz wählen und die allgemeinen S3-Funktionalitäten verwenden möchte, zum Beispiel weil eben nicht der Amazon-Dienst verwendet wird, sondern ein anderer Cloud-Dienst oder eine selbst gehostete Instanz, der kann guten Gewissens auf die MinIO-SDKs zurückgreifen, die nicht nur für .NET, sondern auch für viele ­andere Sprachen und Frameworks verfügbar sind.Im Fall von .NET installieren Sie die passenden NuGet-Pakete folgendermaßen:

PM> Install-Package Minio 
 
Zentrale Einstiegspunkte für den eigenen S3-Storage sind der Server-Endpunkt, ein Access-Key und ein Secret-Key. Der Access-Key wird vom Server erstellt und kann – wie bei API-Keys üblich – wieder entzogen werden, wenn es zu Missbrauch kommen sollte. Der Secret-Key stellt das Passwort dar und wird ebenfalls vom Server beziehungsweise dem Betreiber des Storage ausgegeben. Um eine Verbindung aufbauen zu können, ist die Klasse MinioClient erforderlich, welcher die entsprechenden Parameter im Konstruktor übergeben werden:

private MinioClient client = 
  new MinioClient(serverUrl, 
  accessKey, secretKey).WithSSL(); 
 
Nach dem Instanzieren dieser Klasse können dann entweder die vorhandenen Buckets aufgelistet oder ein neuer Bucket erstellt werden. Dafür werden asynchrone Funktionsaufrufe verwendet. Möchte man also einen neuen Bucket erstellen, dann klappt das so:

var bucketName = "neuerBucket"; 
if(await client.BucketExistsAsync(bucketName) == false) 
{ 
  await client.MakeBucketAsync(bucketName); 
} 
 
Diese Zeilen erstellen einen neuen Bucket, sofern dieser nicht bereits zuvor angelegt wurde. Im Nachgang kann man – sofern notwendig – die Policies (siehe Abschnitt „Objekt-Lebenszyklen und Sperren“) definieren, beispielsweise so:

var bucketName = "neuerBucket"; 
var policyJson = ""; //JSON der Policy 

try{ 
  await client.SetPolicyAsync(bucketName, policyJson); 
} 
catch(MinioException ex) 
{ 
  Console.WriteLine(
    "Fehler beim Setzen der Policy aufgetreten"); 
}  
if(await client.BucketExistsAsync(bucketName) == false) 
{ 
  await client.MakeBucketAsync(bucketName); 
} 
 
Im Grunde sind dies die wichtigsten Aktionen im Rahmen eines Buckets. Ab dann finden sämtliche Aktionen auf Objekt-ebene statt. Hier existieren diverse Aktionen, darunter selbstverständlich der einfache Upload eines Objekts.Im Fall eines Uploads müssen die Daten als Stream vorliegen und können über Server-Side-Encryption verschlüsselt werden:

var bucketName = "neuerBucket"; 
var fileStream = File.OpenRead(fileName); 
var mimeType = "application/octet-stream"; 

try{ 
  await client.PutObjectAsync(bucketName, 
    Path.GetFileName(fileName), fileStream, 
    fileStream.Length, mimeType); 
} 
catch(MinioException ex) 
{ 
  Console.WriteLine(
    "Fehler beim Upload von fileName"); 
} 
 
In diesem Aufruf kann ein Dictionary über den zusätzlichen Parameter metaData übergeben werden, um die Metadaten zu setzen.Für den Abruf der Informationen eines Objekts stehen zwei Varianten bereit. Die erste ist das typische Auflisten oder Abfragen der Objektinformationen. Beim Auflisten erhält man sämtliche Objekte in einem Bucket, welche ein übergebenes Präfix beinhalten. Hat ein Objekt den Key meineObjekte/KundeA/datei.zip, dann kann man dieses auflisten lassen, indem man nach dem Präfix meineObjekte/ oder meineObjekte/KundeA filtert.Das Beispiel zeigt, dass – auch wenn keine üblichen Verzeichniskonventionen existieren – es in den meisten Fällen ratsam ist, dennoch Pfadstrukturen aufzubauen. Im Fall von .NET empfehle ich den konsequenten Einsatz der Uri- oder Path-Klasse, um entsprechende Pfade zu kombinieren.Wichtig: Achten Sie darauf, dass Sie explizit einen Separator definieren. Ansonsten können Objekte, welche unter Windows mit dem Standard-Separator „\“ angelegt wurden, nicht unter Linux oder anderen Unix-Derivaten (Standard-Separator ist hier „/“) gefunden werden. Achten Sie also auf die Umsetzung Ihrer eigenen Konventionen. Eine Auflistung klappt dann wie folgt:

var bucketName = "neuerBucket"; 

var objectList = 
  await client.ListObjectsAsync( 
  bucketName, "tempFiles/", true); 
var objectListKeys = objectList.ToList().ForEach( 
  o => Console.WriteLine(item.Key); 
 
In diesem Fall werden sämtliche Objekte mit dem Präfix tempFiles/ übergeben und deren Key via LINQ in die Liste objectListKeys übergeben.Die Daten, die wir in einem Auflistungsaufruf erhalten, sind recht mager. Mehr Informationen pro Objekt erhält man mit dem StatObject-Aufruf, der einem Head-Aufruf im REST-Umfeld gleichkommt:

var bucketName = "neuerBucket"; 
var objectList = 
  await client.ListObjectsAsync( 
  bucketName, "tempFiles/", true); 

var objectStat = 
  await client.StatObjectAsync( 
  bucketName, objectList.FirstOrDefault().Key); 
 
Das Objekt objectStat erhält nun eine Instanz der Klasse ObjectStat, die diverse Informationen über das Objekt wie beispielsweise Key, Größe, Version, Metadaten, Ablauf- und Sperrinformationen beinhaltet. Obiges Beispiel zeigt dies für das erste Objekt der abgerufenen Objektliste.Will man nicht nur die reinen Objektinformationen, sondern auch den Inhalt des Objekts laden, so kann man dies über den Aufruf getObject tun, bei dem das Objekt entweder als Datei gespeichert oder als Stream zurückgegeben werden kann:

var bucketName = "neuerBucket"; 
var objectList = 
  await client.ListObjectsAsync( 
  bucketName, "tempFiles/", true) 
var memStream = new MemoryStream(); 

var objectStream = 
  await client.GetObjectAsync(bucketName, 
  objectList.FirstOrDefault().Key, 
  (str)=>{ stream.CopyTo(memStream); }); 

Besonderheiten im Umgang mit S3-Objekten

Eine Besonderheit im Umgang mit S3-Objekten ist, dass das Lösch- und Updateverhalten sich je nach den definierten Policies unterscheiden können. Dies ist etwas, was der Entwickler bei seiner Umsetzung zu bedenken hat und prüfen oder fehlertolerant gestalten muss.Ein weiteres Thema ist die S3-Kompatiblität. Im Grundsatz und aus der Erfahrung heraus sind Dienste, die eine S3-Kompatibilität bescheinigen, auch zu 90 Prozent kompatibel. Auf die letzten zehn Prozent kommt es folglich an. Einige Dienste bieten Mehrwerte oder setzen Funktionen anders um. Ein Beispiel wäre das Kopieren von Objekten. Es gibt Dienste, die das Kopieren eines Objekts schlicht nicht umgesetzt haben. Verlässt man sich jedoch auf die Funktion, kann dies zu Problemen führen. Demnach kann es sein, dass man hier „Umwege“ gehen muss, etwa einen manuellen Kopiervorgang einbauen (Stream laden, unter neuem Key hochladen und das ursprüngliche Objekt löschen). Dies betrifft auch die Umsetzung von Policies.

Lizenzen und Kostenfaktoren

Die Kosten von S3-Storage unterscheiden sich von Anbieter zu Anbieter. Nicht nur die nominellen Preise sind unterschiedlich, sondern auch die Abrechnungsparameter. Es gibt Provider, die pro Bucket und Speicherbedarf berechnen – andere wiederum berechnen pro Transaktion. Dabei wird unter anderem auch bei Amazon bei den Preisen zwischen Auflisten, Abruf und Hochladen teils deutlich unterschieden.Je nachdem wie die Architektur der Anwendung ist, wie viele Objekte abgerufen werden oder ob erst eine Liste abgerufen wird und gegebenenfalls enumeriert die Metadaten einzelner Objekte abgerufen werden, kann dies bei einem Anbieter vielleicht gar keine Kosten verursachen, bei einem anderen aber dann für jedes Objekt sogar mehrfach berechnet werden. Bei vielen Nutzern und vielen Einzelabfragen können die Kosten in die Höhe schießen.Die zu erwartenden Kosten sind eine schwer kalkulierbare Größe. Eine Strategie wäre, S3-Anbieter zu finden, welche pro Bucket und pro GByte abrechnen und auf Transaktionsgebühren verzichten. Bei einer wachsenden Anwendung kann sich dies schnell lohnen.

Fazit

Wie bei jeder Technologie gibt es Vor- und Nachteile. S3 ist ein De-facto-Standard, der bei mehreren Anbietern in Anspruch genommen werden und auf Wunsch auch selbst gehostet werden kann. S3 legt einen hohen Wert auf Redundanz und Datenschutz, bietet Werkzeuge für die Einhaltung vertraglicher oder gesetzlicher Richtlinien und eine Anbindung über moderne Webtechnologien. Beachten muss man, dass die Preisgestaltung mancher Anbieter in eine Kostenfalle führen kann, wenn der Entwickler eine For-Each-Schleife falsch setzt.Im Grunde kann man S3 insbesondere für Anwendungen empfehlen, die Informationen verarbeiten, die unter Datenschutz-, Vertrags- oder Gesetzesrichtlinien fallen und eine ­lückenlose Verfügbarkeit erfordern.

Fussnoten

  1. MinIO, https://min.io
  2. Distributed MinIO Quickstart Guide, http://www.dotnetpro.de/SL2206DateienS3_1

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
IoT neu eingebunden - Integration und Verwaltung von IoT-Geräten mit Azure IoT Operations
Wie sich das neue Azure IoT Operations von bestehenden Azure-Diensten unterscheidet, welche Technologien dabei zum Einsatz kommen und wann sich der Umstieg lohnt.
16 Minuten
15. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige