Есть ли способ для потоковой передачи данных в файлы Amazon 2 с помощью aws-sdk-go, который похож на метод Write() хранилища Google?
В настоящее время мы осуществляем переход от Google Storage к хранилищу Amazon S3.
В Google Storage я использовал эту функцию https://godoc.org/cloud.google.com/go/storage для записи в файлы. Он в основном направляет байты данных в файл с помощью интерфейса io.Writer и сохраняет файл при вызове метода Close() для устройства записи. Это позволяет нам передавать данные в файл в течение всего дня и завершать его в конце дня, даже не создавая локальную копию файла.
Я изучил документацию aws-sdk-go s3 по godoc и, похоже, не могу найти аналогичную функцию, которая позволила бы нам просто передавать данные в файл, не создавая файл сначала локально. Все, что я нашел, - это функции, которые передают данные из уже существующих локальных файлов, таких как PutObject().
Итак, мой вопрос: существует ли способ для потоковой передачи данных в файлы Amazon 2 с помощью aws-sdk-go, который похож на метод Write() хранилища Google?
1 ответ
У HTTP API S3 нет append
-подобный метод записи, вместо этого он использует многочастную загрузку. В основном вы загружаете порции фиксированного размера с порядковым номером, и S3 будет хранить их внутри как отдельные файлы и автоматически объединять их при получении последних порций. Размер чанка по умолчанию составляет 5 МБ (может быть изменен), и вы можете иметь максимум 10000 чанков (не могут быть изменены).
К сожалению, это не похоже на aws-sdk-go
API предоставляет любой удобный интерфейс для работы с чанками для достижения потокового поведения.
Вам придется работать с кусками вручную (называется parts
в aws-sdk-go
) непосредственно используя CreateMultipartUpload для инициализации передачи, создайте экземпляры UploadPartInput для данных, которые вы хотите отправить, и отправьте их с помощью UploadPart. После отправки последнего фрагмента вам необходимо закрыть транзакцию с помощью CompleteMultipartUpload.
Что касается вопроса о том, как транслировать напрямую, например, из []byte
данные вместо файла: Body
поле структуры UploadPartInput - это место, куда вы помещаете контент, который хотите отправить на S3, обратите внимание, что Body
имеет тип io.readseeker
, Это означает, что вы можете создать io.readseeker
например, от вашего []byte
содержимое с чем-то вроде bytes.NewReader([]byte) и установить UploadPartInput.Body
к этому.
Хорошая отправная точка, чтобы увидеть, как используются многокомпонентные функции, - это утилита загрузки s3manager, которая использует API, состоящий из нескольких частей, для одновременной загрузки одного большого файла в виде небольших кусков.
Имейте в виду, что вы должны установить политику жизненного цикла, которая удаляет незаконченные составные загрузки. Если вы не отправите финал CompleteMultipartUpload
все фрагменты, которые были загружены, останутся в S3 и будут нести расходы. Политика может быть установлена через консоль AWS /CLI или программно с aws-sdk-go
,