1

Nous effectuons actuellement une transition entre Google Storage et le stockage Amazon S3.Existe-t-il un moyen de diffuser des données vers des fichiers s3 amazon en utilisant aws-sdk-go qui est similaire à la méthode write() de google storage?

Sur Google Storage, j'ai utilisé cette fonction https://godoc.org/cloud.google.com/go/storage#Writer.Write pour écrire dans des fichiers. Il diffuse essentiellement des octets de données dans le fichier en utilisant l'interface io.Writer et enregistre le fichier lorsque Close() est appelé sur writer. Cela nous permet de diffuser des données dans un fichier toute la journée et de les finaliser à la fin de la journée sans jamais créer une copie locale du fichier. J'ai examiné la documentation de aws-sdk-go s3 sur godoc et ne semble pas trouver une fonction similaire qui nous permettrait de simplement streamer des données dans un fichier sans créer d'abord un fichier localement. Tout ce que j'ai trouvé sont des fonctions qui diffusent des données à partir de fichiers locaux déjà existants comme PutObject(). Donc, ma question est: Y a-t-il un moyen de diffuser des données vers des fichiers s3 amazon en utilisant aws-sdk-go qui est similaire à la méthode google storage Write()?

+1

Avez-vous regardé CloudFront? Qui permet de diffuser du contenu s3? – Ashan

+0

Il me semble que CloudFront est principalement utilisé pour les fichiers multimédia, j'ai besoin d'un moyen de diffuser du texte à des fichiers texte simples. CloudFront est-il approprié pour cela? –

+1

Vous avez raison, @ S.Drazic. L'autre intervenant suppose que vous parlez de téléchargements plutôt que de téléchargements. –

Répondre

3

L'API HTTP S3 n'a aucune méthode d'écriture similaire à append, mais utilise multipart uploads. Vous chargez essentiellement des blocs de taille fixe avec un numéro d'index et S3 les stocke en interne en tant que fichiers séparés et les concatène automatiquement lorsque les derniers morceaux sont reçus. La taille de bloc par défaut est de 5 Mo (peut être modifiée) et vous pouvez avoir au moins 10 000 morceaux (ne peuvent pas être modifiés).

Malheureusement, il ne semble pas que l'API aws-sdk-go offre une interface pratique pour travailler avec des morceaux pour atteindre le comportement de diffusion en continu.

Vous devez travailler avec les morceaux manuellement (appelés parts dans aws-sdk-go) en utilisant directement CreateMultipartUpload pour initialiser les transferts, créer UploadPartInput cas pour les données que vous souhaitez envoyer et l'envoyer avec UploadPart. Lorsque le dernier bloc a été envoyé, vous devez fermer la transaction avec CompleteMultipartUpload.

En ce qui concerne la question sur la façon de diffuser directement à partir de par ex. []byte données au lieu d'un fichier: le champ Body de la struct UploadPartInput est l'endroit où vous mettez votre contenu que vous souhaitez envoyer à S3, notez que Body est de type io.readseeker. Cela signifie que vous pouvez créer un io.readseeker à partir de par ex. votre contenu []byte avec quelque chose comme bytes.NewReader([]byte) et définir UploadPartInput.Body à cela. L'utilitaire de téléchargement s3manager peut être un bon point de départ pour voir comment les fonctions multi-parties sont utilisées. Il utilise l'API multi-parties pour télécharger simultanément un seul gros fichier en plus petits morceaux. Gardez à l'esprit que vous devez définir un lifecycle policy qui supprime les téléchargements multipart inachevés. Si vous n'envoyez pas le dernier CompleteMultipartUpload tous les morceaux qui ont été téléchargés resteront en S3 et entraîneront des coûts. La stratégie peut être définie via AWS console/CLI ou par programme avec aws-sdk-go.

+1

Ceci est essentiellement * la * solution.Je l'ai utilisé avec succès dans le passé, pour diffuser des sauvegardes dans S3 comme dans un modèle comme 'tar -c | bzip2 -9 | pipe2s3 [options] 'où je n'avais pas l'espace temporaire disponible pour enregistrer les sauvegardes localement. J'ai abandonné le développement du projet 'pipe2s3' et je ne l'ai jamais publié parce qu'il n'y avait aucun moyen de stocker des métadonnées sur la longueur de l'objet, sha256 final, etc., car l'API de téléchargement multipart nécessite que toutes les métadonnées soient spécifiées au démarrage. (Maintenant, bien sûr, avec le marquage d'objet, cela pourrait être fait.) Mais cette méthode fonctionne et est essentiellement le seul moyen. –

+1

Merci pour cette réponse détaillée! Cela semble être la solution à mon problème, je vais essayer et rapporter ici. –

+0

@ S.Drazic J'ai ajouté une note sur la gestion du cycle de vie du godet – johlo