1

Wir machen gerade einen Übergang von Google Storage zu Amazon S3 Storage.Gibt es eine Möglichkeit, Daten zu Amazons S3-Dateien mit aws-sdk-go zu streamen, die Google Write() Methode ähnelt?

Auf Google Storage habe ich diese Funktion https://godoc.org/cloud.google.com/go/storage#Writer.Write verwendet, um in Dateien zu schreiben. Es streamt grundsätzlich Bytes von Daten in Datei mit io.Writer-Schnittstelle und speichert Datei, wenn Close() Writer aufgerufen wird. Dadurch können wir Daten den ganzen Tag lang in eine Datei streamen und am Ende des Tages finalisieren, ohne jemals eine lokale Kopie der Datei erstellen zu müssen.

Ich habe aws-sdk-go s3-Dokumentation auf godoc untersucht und kann anscheinend keine ähnliche Funktion finden, die es uns erlauben würde, Daten einfach in Datei zu streamen, ohne zuerst lokal eine Datei zu erstellen. Alles, was ich gefunden habe, sind Funktionen, die Daten von bereits vorhandenen lokalen Dateien wie PutObject() streamen.

Also meine Frage ist: Gibt es eine Möglichkeit, Daten zu Amazon S3-Dateien mit aws-sdk-go zu streamen, die Google-Speicher Write() Methode ähnlich ist?

+1

Haben Sie sich CloudFront angesehen? Was ermöglicht es, s3-Inhalte zu streamen? – Ashan

+0

Es scheint mir, dass CloudFront meist für Mediendateien verwendet wird, ich brauche eine Möglichkeit, Text in einfache Textdateien zu streamen. Ist CloudFront dafür geeignet? –

+1

Sie sind richtig, @ S.Drazic. Der andere Kommentator geht davon aus, dass Sie eher über Downloads als über Uploads sprechen. –

Antwort

3

Die S3-HTTP-API hat keine append-ähnliche Schreibmethode, stattdessen wird multipart uploads verwendet. Sie laden im Allgemeinen Blöcke fester Größe mit einer Indexnummer hoch und S3 speichert sie intern als separate Dateien und verkettet sie automatisch, wenn die letzten Blöcke empfangen werden. Die Standard-Chunk-Größe beträgt 5 MB (kann geändert werden) und Sie können maximal 10.000 Chunks haben (nicht änderbar).

Leider sieht es nicht so aus, als ob die aws-sdk-go API irgendeine bequeme Schnittstelle für die Arbeit mit Brocken bietet, um das Streaming-Verhalten zu erreichen.

Sie würden mit den Brocken (genannt parts in aws-sdk-go) mit CreateMultipartUpload direkt manuell arbeiten, um die Transfers zu initialisieren, erstellen UploadPartInput Instanzen für die Daten, die Sie senden möchten und senden mit UploadPart. Wenn der letzte Chunk gesendet wurde, müssen Sie die Transaktion mit CompleteMultipartUpload schließen.

In Bezug auf die Frage, wie direkt aus z. []byte Daten anstelle einer Datei: das Body Feld der UploadPartInput Struktur ist, wo Sie Ihre Inhalte, die Sie an S3 senden möchten, beachten Sie, dass Body vom Typ io.readseeker ist. Dies bedeutet, dass Sie eine io.readseeker aus z. Ihr []byte Inhalt mit etwas wie bytes.NewReader([]byte) und setzen UploadPartInput.Body dazu.

Das s3manager Upload-Dienstprogramm von Uploads könnte ein guter Ausgangspunkt sein, um zu sehen, wie die Multipart-Funktionen verwendet werden. Es verwendet die Multipart-API, um eine einzelne große Datei gleichzeitig als kleinere Chunks hochzuladen.

Denken Sie daran, dass Sie eine lifecycle policy festlegen sollten, die nicht abgeschlossene mehrteilige Uploads entfernt. Wenn Sie nicht das letzte CompleteMultipartUpload senden, bleiben alle hochgeladenen Stücke in S3 und verursachen Kosten. Die Richtlinie kann über die AWS-Konsole/CLI oder programmgesteuert mit aws-sdk-go festgelegt werden.

+1

Dies ist im Wesentlichen * die * Lösung.Ich habe es in der Vergangenheit erfolgreich benutzt, um Backups in S3 zu streamen, wie in einem Muster wie 'tar -c | bzip2 -9 | pipe2s3 [Optionen] 'wo ich nicht den verfügbaren temporären Speicherplatz hatte, um die Backups lokal zu speichern. Ich habe die Entwicklung des 'pipe2s3'-Projekts aufgegeben und es nie veröffentlicht, weil es keine Möglichkeit gab, Metadaten über die Länge des Objekts, final sha256 usw. zu speichern, da die mehrteilige Upload-API erfordert, dass alle Metadaten beim Start angegeben werden. (Nun, natürlich, mit Objekt-Tagging, könnte dies getan werden.) Aber diese Methode funktioniert und ist im Wesentlichen der einzige Weg. –

+1

Danke für so eine ausführliche Antwort! Dies scheint die Lösung für mein Problem zu sein, ich werde es ausprobieren und hier berichten. –

+0

@ S.Drazic Ich habe eine Notiz zum Lifecycle Management für den Bucket hinzugefügt – johlo

Verwandte Themen