1

現在、GoogleストレージからAmazon S3ストレージに移行しています。aws-sdk-goを使用してamazon s3ファイルにデータをストリーミングする方法はありますか?それはGoogleストレージのWrite()メソッドに似ていますか?

Googleストレージでは、この機能を使用してファイルに書き込めます。https://godoc.org/cloud.google.com/go/storage#Writer.Write基本的に、io.Writerインターフェイスを使用してバイトデータをファイルにストリームし、WriterでClose()が呼び出されるとファイルを保存します。これにより、データをファイルに一日中ストリームし、ファイルのローカルコピーを作成することなく、一日の終わりにデータを完成させることができます。

私はawd-sdk-go s3のドキュメントをgodocで調べたところ、ファイルをローカルに作成せずにファイルにデータをストリームできるような機能を見つけることはできませんでした。私が見つけたのは、PutObject()のような既存のローカルファイルからデータをストリームする関数です。

私の質問は:aws-sdk-goを使用してamazon s3ファイルにデータをストリームする方法はありますか?それはGoogleストレージWrite()メソッドに似ていますか?

+1

CloudFrontを見ましたか? s3コンテンツをストリーミングすることができますか? – Ashan

+0

CloudFrontは主にメディアファイルに使用されているようですが、テキストを単純なテキストファイルにストリームする方法が必要です。 CloudFrontはそれに適していますか? –

+1

あなたは正しい、@ S.Drazicです。もう1人のコメント作成者は、アップロードではなくダウンロードについて話していると仮定しています。 –

答えて

3

S3 HTTP APIには、appendのような書き込みメソッドがありません。multipart uploadsが使用されます。基本的にインデックス番号付きの固定サイズのチャンクをアップロードすると、S3はそれらを内部的に別々のファイルとして保存し、最後のチャンクが受信されたときにそれらを自動的に連結します。デフォルトのチャンクサイズは5MB(変更可能)で、チャンク数は最大で10,000チャンク(変更できません)です。

残念ながら、aws-sdk-go APIは、ストリーミング動作を達成するためにチャンクを扱うための便利なインターフェイスを提供しているようには見えません。

あなたはUploadPartでそれを送信し、送信するデータのUploadPartInputインスタンスを作成し、直接転送を初期化するためにCreateMultipartUploadを使用して(aws-sdk-gopartsと呼ばれる)を手動でチャンクと仕事をしなければならないでしょう。最後のチャンクが送信されたら、CompleteMultipartUploadでトランザクションを終了する必要があります。

たとえばから直接ストリームへのストリームの問題についてファイルの代わりに[]byteデータ:UploadPartInput構造のBodyフィールドは、S3に送信するコンテンツを置く場所です。Bodyio.readseekerであることに注意してください。つまり、io.readseekerを作成することができます。あなたの[]byteの内容はbytes.NewReader([]byte)のようなもので、それにUploadPartInput.Bodyと設定してください。

アップロードのアップロードユーティリティは、マルチパート機能の使用方法を確認するのに適しています。マルチパートAPIを使用して、1つの大きなファイルを小さなチャンクとして同時にアップロードします。

未完成のマルチパートアップロードを削除するlifecycle policyを設定する必要があります。最終的にCompleteMultipartUploadを送信しないと、アップロードされたチャンクはすべてS3に残り、コストがかかります。このポリシーは、AWSコンソール/ CLIから、またはaws-sdk-goとプログラムで設定できます。

+1

これは本質的には*解決策です。私は過去に成功したことがありました。例えば、 'tar -c | bzip2 -9 | pipe2s3 [options] 'どこにバックアップをローカルに保存するための空き容量がありませんでした。マルチパートアップロードAPIはすべてのメタデータを開始時に指定する必要があるため、オブジェクトの長さ、最終的なsha256などのメタデータを格納する方法がなかったので、私は 'pipe2s3'プロジェクトの開発を断念し、それをリリースしませんでした。 (もちろん、オブジェクトタギングの場合はこれが可能です)。しかし、このメソッドは機能し、本質的に唯一の方法です。 –

+1

このような詳細なお返事ありがとうございます!これは私の問題の解決策であると思われます。私はそれを試してみて、ここで報告します。 –

+0

@ S.Drazicバケツのライフサイクル管理に関するメモを追加しました – johlo

関連する問題