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

相关问题