1

我們目前正在從Google存儲轉換到Amazon S3存儲。有沒有一種方法可以使用aws-sdk-go將數據流式傳輸到amazon s3文件,這與Google存儲的Write()方法類似?

在谷歌存儲我用這個功能https://godoc.org/cloud.google.com/go/storage#Writer.Write寫入文件。它基本上使用io.Writer接口將數據字節流入文件,並在寫入器上調用Close()時保存文件。這使我們可以整天將數據流式傳輸到文件中,並在一天結束時完成,而無需創建文件的本地副本。

我已經研究AWS-SDK-去godoc S3文檔似乎並不能找到一個類似的功能,使我們只流數據,而無需首先在本地創建一個文件到文件。我發現的所有功能都是從已經存在的本地文件(如PutObject())中流式傳輸數據。

所以我的問題是:是否有辦法將數據傳送到使用Amazon S3的文件AWS-SDK-去類似於谷歌的存儲Write()方法?

+1

您看過CloudFront嗎?它允許流s3內容? – Ashan

+0

在我看來,CloudFront主要用於媒體文件,我需要一種將文本流式傳輸到簡單文本文件的方式。 CloudFront適合那個嗎? –

+1

你是對的,@ S.Drazic。另一位評論者假定你正在談論下載,而不是上傳。 –

回答

3

S3 HTTP API沒有任何類似append的寫入方法,而是使用multipart uploads。你基本上用一個索引號上傳固定大小的塊,S3將它們作爲單獨的文件存儲在內部,並在接收到最後的塊時自動將它們連接起來。默認塊大小爲5MB(可以更改),最多可以有10,000個塊(不能更改)。

遺憾的是它並沒有看起來像aws-sdk-go API提供任何方便的接口,可與大塊的工作,實現數據流形式。

你將不得不使用手動塊(稱爲partsaws-sdk-go)工作直接使用CreateMultipartUpload初始化傳輸,爲您創建要發送和UploadPart發送數據UploadPartInput實例。當最後的塊已經發送時,您需要使用CompleteMultipartUpload關閉交易。

關於如何從例如直接流式傳輸的問題, []byte數據,而不是一個文件:將UploadPartInput結構的Body領域是你把你要發送到S3您的內容,注意Bodyio.readseeker型。這意味着您可以從例如創建io.readseeker。你的[]byte內容與bytes.NewReader([]byte)類似,並設置爲UploadPartInput.Body

上傳s3manager上傳實用程序可能是一個很好的起點,可以看到如何使用多部分功能,它使用多部分API將單個大文件同時上傳爲較小的塊。

請記住,你應該設定一個lifecycle policy,去除未完成的多上傳。如果你沒有發送最後的CompleteMultipartUpload,所有已經上傳的數據塊都將保留在S3中,併產生費用。該策略可以通過AWS控制檯/ CLI或通過aws-sdk-go進行編程設置。

+1

這實質上是*解決方案。在過去,我已經成功地使用它,以像'tar -c |這樣的模式將備份傳輸到S3中bzip2 -9 | pipe2s3 [options]'我沒有可用的臨時空間來保存本地備份。我放棄了開發'pipe2s3'項目,並且從未發佈過它,因爲沒有辦法存儲關於對象長度的元數據,最終sha256等,因爲分段上傳API需要在開始時指定所有元數據。 (當然,使用對象標記可以完成這項工作。)但是這種方法確實有效,並且基本上是唯一的方法。 –

+1

感謝您的詳細解答!這似乎是我的問題的解決方案,我會嘗試一下並在此處報告。 –

+0

@ S.Drazic我在桶中添加了生命週期管理注意事項 – johlo

相關問題