有没有一种方法可以使用类似于 google storage Write() 方法的 aws-sdk-go 将数据流式传输到 amazon s3 文件?
Is there a way to stream data to amazon s3 files using aws-sdk-go that is similar to google storage Write() method?
我们目前正在从 Google 存储过渡到 Amazon S3 存储。
关于 Google 存储 我使用此功能 https://godoc.org/cloud.google.com/go/storage#Writer.Write 写入文件。它基本上使用 io.Writer 接口将数据字节流式传输到文件中,并在编写器上调用 Close() 时保存文件。这使我们能够整天将数据流式传输到文件中,并在一天结束时完成它,而无需创建文件的本地副本。
我已经检查了 godoc 上的 aws-sdk-go s3 文档,但似乎找不到类似的功能可以让我们无需先在本地创建文件就可以将数据流式传输到文件。我所发现的只是从现有的本地文件(如 PutObject())流式传输数据的函数。
所以我的问题是:有没有一种方法可以使用类似于 google storage Write() 方法的 aws-sdk-go 将数据流式传输到 amazon s3 文件?
S3 HTTP API 没有任何类似于 append
的写入方法,而是使用 multipart uploads。您基本上上传带有索引号的固定大小的块,S3 会将它们作为单独的文件在内部存储,并在收到最后一个块时自动连接它们。默认块大小为 5MB(可以更改),您最多可以有 10,000 个块(无法更改)。
不幸的是,它看起来不像 aws-sdk-go
API 提供任何方便的接口来处理块以实现流式传输行为。
您必须直接使用 CreateMultipartUpload to initialize the transfers, create UploadPartInput instances for the data you want to send and send it with UploadPart. When the final chunk has been sent you need to close the transaction with CompleteMultipartUpload.
手动处理块(在 aws-sdk-go
中称为 parts
)
关于如何直接从例如[]byte
数据而不是文件:UploadPartInput struct is where you put your content you want to send to S3, note that Body
is of type io.readseeker
. This means you can create a io.readseeker
from e.g. your []byte
content with something like bytes.NewReader([]byte) 的 Body
字段并将 UploadPartInput.Body
设置为该字段。
上传的 s3manager 上传实用程序可能是了解如何使用多部分功能的一个很好的起点,它使用多部分 API 将单个大文件同时上传为较小的块。
请记住,您应该设置一个 lifecycle policy 来删除未完成的分段上传。如果您不发送最终的 CompleteMultipartUpload
,所有已上传的块将保留在 S3 中并产生费用。该策略可以通过 AWS console/CLI 或使用 aws-sdk-go
.
以编程方式设置
我们目前正在从 Google 存储过渡到 Amazon S3 存储。
关于 Google 存储 我使用此功能 https://godoc.org/cloud.google.com/go/storage#Writer.Write 写入文件。它基本上使用 io.Writer 接口将数据字节流式传输到文件中,并在编写器上调用 Close() 时保存文件。这使我们能够整天将数据流式传输到文件中,并在一天结束时完成它,而无需创建文件的本地副本。
我已经检查了 godoc 上的 aws-sdk-go s3 文档,但似乎找不到类似的功能可以让我们无需先在本地创建文件就可以将数据流式传输到文件。我所发现的只是从现有的本地文件(如 PutObject())流式传输数据的函数。
所以我的问题是:有没有一种方法可以使用类似于 google storage Write() 方法的 aws-sdk-go 将数据流式传输到 amazon s3 文件?
S3 HTTP API 没有任何类似于 append
的写入方法,而是使用 multipart uploads。您基本上上传带有索引号的固定大小的块,S3 会将它们作为单独的文件在内部存储,并在收到最后一个块时自动连接它们。默认块大小为 5MB(可以更改),您最多可以有 10,000 个块(无法更改)。
不幸的是,它看起来不像 aws-sdk-go
API 提供任何方便的接口来处理块以实现流式传输行为。
您必须直接使用 CreateMultipartUpload to initialize the transfers, create UploadPartInput instances for the data you want to send and send it with UploadPart. When the final chunk has been sent you need to close the transaction with CompleteMultipartUpload.
手动处理块(在aws-sdk-go
中称为 parts
)
关于如何直接从例如[]byte
数据而不是文件:UploadPartInput struct is where you put your content you want to send to S3, note that Body
is of type io.readseeker
. This means you can create a io.readseeker
from e.g. your []byte
content with something like bytes.NewReader([]byte) 的 Body
字段并将 UploadPartInput.Body
设置为该字段。
上传的 s3manager 上传实用程序可能是了解如何使用多部分功能的一个很好的起点,它使用多部分 API 将单个大文件同时上传为较小的块。
请记住,您应该设置一个 lifecycle policy 来删除未完成的分段上传。如果您不发送最终的 CompleteMultipartUpload
,所有已上传的块将保留在 S3 中并产生费用。该策略可以通过 AWS console/CLI 或使用 aws-sdk-go
.