AWS (Amazon Web Services) S3 Multipart Upload ist eine Funktion, die es ermöglicht, große Objekte (Dateien) in kleineren Teilen oder „Chunks“ auf Amazon Simple Storage Service (S3) hochzuladen und diese dann serverseitig zu einem vollständigen Objekt zusammenzusetzen.
Dieser Prozess bietet mehrere Vorteile gegenüber herkömmlichen einzelnen Uploads:
- Ausfallsicherheit: Mehrteilige Uploads sind robuster, da sie die Wahrscheinlichkeit von Upload-Fehlern verringern. Wenn ein Teil nicht hochgeladen werden kann, müssen wir nur diesen bestimmten Teil erneut hochladen, anstatt die gesamte Datei erneut hochzuladen.
- Leistung: Mehrteilige Uploads ermöglichen die Parallelisierung der Datenübertragung, wodurch die Upload-Geschwindigkeit insgesamt verbessert wird, insbesondere bei großen Dateien.
- Unterbrechen und Fortsetzen: Wir können mehrteilige Uploads unterbrechen und fortsetzen, was bei instabilen Netzwerkverbindungen oder wenn der Upload längere Zeit in Anspruch nimmt, hilfreich ist.
- Optimierte Speichernutzung: Mehrteilige Uploads ermöglichen das unabhängige Hochladen von Teilen, wodurch der auf der Client-Seite für die Verarbeitung großer Dateien erforderliche Speicherplatz reduziert wird.
- Objekt-Streaming: Ermöglicht das Streaming von Daten direkt von der Quelle zu S3, ohne dass das gesamte Objekt im Speicher abgelegt werden muss.
Um einen mehrteiligen Upload zu starten, müssen wir eine neue mehrteilige Upload-Anfrage mit der S3-API erstellen und dann einzelne Teile des Objekts in separaten API-Aufrufen hochladen, die jeweils durch eine eindeutige Teilenummer identifiziert werden.
Sobald alle Teile hochgeladen sind, ist der mehrteilige Upload abgeschlossen und S3 fügt die Teile zum endgültigen Objekt zusammen. Außerdem können Sie einen mehrteiligen Upload jederzeit abbrechen, um hochgeladene Teile zu bereinigen und Speicherkosten zu sparen.
Mehrteilige Uploads werden häufig verwendet, wenn es sich um Dateien handelt, die in der Regel größer als 100 MB sind, oder wenn während des Upload-Vorgangs instabile Netzwerkbedingungen zu erwarten sind.
In diesem Artikel sollen die Vorteile von AWS S3-Multipart-Uploads, detailliert und praktisch veranschaulicht werden, indem eine Implementierung mit Dropzone.js und dem Python-Framework Flask zusammen mit dem AWS S3 boto3 Python SDK bereitgestellt wird.
Die Serverseite
Aus Sicherheitsgründen werden die Anfragen an S3 über eine Flask-REST-API weitergeleitet. Beginnen wir mit der Erstellung und Einrichtung der Flask-App:
Als Nächstes erstellen wir drei Flask-Endpunkte für die folgenden Funktionen:
- Starten des S3-Multipart-Uploads und Abrufen der entsprechenden Upload-ID.
- Hochladen der Dateiteile oder ganzer Dateien, wenn diese nicht groß genug sind, um in Chunks aufgeteilt zu werden.
- Vervollständigen des mehrteiligen Uploads.
Initiate Multipart Upload Endpoint
Die unten aufgeführte Endpunktimplementierung startet einen mehrteiligen Upload in den angegebenen S3-Bucket und Objektschlüssel unter Verwendung des Boto3 SDK.
Die Funktion „create_multipart_upload“ wird aufgerufen, um einen neuen mehrteiligen Upload zu erstellen, und die von der API zurückgegebene „UploadId“ ist in der Antwort enthalten.
Upload File Endpoint
Dieser Endpunkt empfängt eine Datei oder einen Dateiteil als Binärdaten zusammen mit dem S3-Objektschlüssel, der Upload-ID (erhalten von der „create_multipart_upload“-Methode), der Teilenummer (eindeutige Nummer für jeden Teil, beginnend bei 1) und einem Flag, das angibt, ob es sich bei dem Upload um einen Dateiteil oder eine ganze Datei handelt.
Der Teil wird mit der Methode „upload_part“ in S3 hochgeladen. Unten finden Sie den Quellcode für diesen Endpunkt:
Abschluss des mehrteiligen Uploads
Sobald alle Dateiteile erfolgreich hochgeladen wurden, wird dieser Endpunkt aufgerufen, um den mehrteiligen Upload abzuschließen. Zunächst müssen wir jedoch einen laufenden mehrteiligen Upload und alle erforderlichen Informationen zu den bisher hochgeladenen Teilen haben, wie z. B. den ETag (ein MD5-Hash, der die Daten des Teils darstellt) und die Teilenummern.
Um diese Daten über die Teile zu erhalten, die bereits für einen bestimmten mehrteiligen Upload hochgeladen wurden, rufen wir die Methode „list_parts“ auf, die eine Liste von Wörterbüchern abruft, die jeweils ein hochgeladenes Teil darstellen und Details wie Teilenummer und ETag enthalten.
Sobald wir alle Teileinformationen haben, wird die Methode „complete_multipart_upload“ aufgerufen, damit S3 alle Teile zum endgültigen Objekt zusammenfügt und in unserem Bucket zur Verfügung stellt.
Nachfolgend finden Sie eine Implementierung des Endpunkts:
Die Front-End-Seite
Zur Implementierung der Web-Front-End-Seite verwenden wir Dropzone.js, eine weit verbreitete Open-Source-JavaScript-Bibliothek, die eine elegante und flexible Möglichkeit bietet, Datei-Uploads mit Drag-and-Drop-Funktionalität zu implementieren. Sie vereinfacht den Prozess der Handhabung von Datei-Uploads durch die Bereitstellung einer sofort einsatzbereiten benutzerfreundlichen Oberfläche und übernimmt verschiedene Aufgaben im Zusammenhang mit Uploads, wie z. B. die Validierung von Dateien, das Chunking großer Dateien und die Unterstützung für das Hochladen mehrerer Dateien.
Beginnen wir mit der Einrichtung von Dropzone.js, indem wir sie in die HTML-Datei einfügen. Wir können die Bibliothek entweder herunterladen und lokal darauf verweisen oder einen CDN-Link verwenden. Zusätzlich muss ein HTML-Element erstellt werden, das als Dropzone-Bereich dient, in dem Benutzer Dateien per Drag-and-Drop ablegen können:
Der nächste Schritt ist die Konfiguration von Dropzone.js:
Im obigen Codeausschnitt wird eine Konstante für die Chunk-Größe von Dropzone verwendet, um Dateien in 5-MiB-Teile oder Chunks aufzuteilen. Beachten Sie, dass die Größe in Mebibytes und nicht in Megabytes angegeben wird. Ein Mebibyte ist etwas größer als ein Megabyte und 5 MiB ist die Mindestgröße, die von AWS S3-Mehrfach-Uploads unterstützt wird. Dropzone teilt alle Dateien in Chunks auf, die gleich oder größer als der Wert „chunkSize“ sind.
Um Datei-Uploads zu beschleunigen, ist die Parallelisierung von Teil-Uploads aktiviert. Und um unsere mehrteiligen Uploads widerstandsfähiger zu machen, wurden Wiederholungsversuche für die Teil-Uploads aktiviert, die möglicherweise fehlschlagen.
Die automatische Verarbeitung von Dateien in der Warteschlange wurde deaktiviert, da wir sicherstellen müssen, dass alle Dateien in der Warteschlange ihre AWS S3-Multipart-Upload-ID erhalten, bevor Dropzone mit der Verarbeitung der Dateien in der Warteschlange beginnt. Andernfalls besteht das Risiko, dass der Upload einiger Dateiteile aufgrund einer fehlenden Upload-ID fehlschlägt. Diese IDs werden in der Karte „uploadIdsMap“ gespeichert.
Hinweis: Achten Sie darauf, die Initialisierung von Dropzone aufzuschieben, bis die Seite geladen ist. Dies kann z. B. mit einem sofort aufgerufenen Funktionsausdruck erreicht werden.
Da Dropzone bei jeder Upload-Anfrage benutzerdefinierte Parameter senden muss, z. B. die Multipart-Upload-ID und den S3-Schlüssel der hochzuladenden Datei, müssen wir die „params“-Option von Dropzone wie unten dargestellt überschreiben:
Um den S3-Objektschlüssel für die hochgeladene Datei zu erstellen, wird die folgende Funktion verwendet:
Schließlich müssen wir die folgenden Ereignisse von Dropzone verarbeiten:
- On file queued (addedFile): Für jede Datei in der Warteschlange wird eine AWS S3-Multipart-Upload-ID vom Proxy-Backend abgerufen, indem der Endpunkt „GET api/file/upload-id“ aufgerufen wird. Die Upload-ID der Datei wird in der „uploadIdsMap“ gespeichert, um später von Dropzone in jeder Datei-Chunk-Upload-Anfrage an unser Back-End gesendet zu werden. In diesem Event-Handler warten wir, bis alle Dateien in der Warteschlange hochgeladen sind;
- Bei erfolgreichem Datei-Upload (success): Wenn ein Chunk-Upload erfolgreich abgeschlossen wurde, müssen wir den Multipart-Upload durch Aufruf des entsprechenden REST-Endpunkts abschließen: „PUT /api/file/chunks/complete“;
- Nach Abschluss des Datei-Uploads (complete): Unabhängig davon, ob der Datei-Upload erfolgreich oder fehlerhaft abgeschlossen wurde, müssen wir prüfen, ob noch Dateien in der Warteschlange stehen. Wenn dies der Fall ist, müssen wir die Warteschlange explizit verarbeiten, damit der nächste Stapel von Dateien mit einer Größe, die der Option „parallelUploads“ entspricht, verarbeitet wird.
Nachfolgend finden Sie die Codeausschnitte, die die oben beschriebenen Ereignisbehandlungsroutinen von Dropzone implementieren, zusammen mit anderen Hilfsfunktionen, die in diesen Behandlungsroutinen verwendet werden.
Fazit
AWS S3 Multipart Uploads ist eine leistungsstarke Funktion, die die Leistung, Zuverlässigkeit und Flexibilität beim Hochladen großer Objekte in Amazon S3 verbessert. Durch die Aufteilung von Objekten in kleinere Teile können Entwickler parallele Uploads und Wiederaufnahmefunktionen nutzen, was zu schnelleren und zuverlässigeren Uploads führt.
Ob Sie an einer datenintensiven Anwendung, einem Multimedia-Speicher oder einem Content-Delivery-System arbeiten – das Verständnis und die Implementierung von Multipart Uploads kann Ihre S3-Datenverwaltungs-Workflowserheblich verbessern und sie zu einem unverzichtbaren Werkzeug im Arsenal der AWS-Cloud machen.