May -> Proof

雑記帳です

Golang で S3 からダウンロードしたファイルをオンメモリで扱う

S3 からダウンロードしたものをファイルに保存する記事はよく見かけるけど、オンメモリで扱う方法はあまり見かけなかったので備忘録代わりに書き残しておく。 var file *os.File でファイルのポインタを宣言しても上手くいかなかったので、 aws.WriteAtBuffer{} を使って解決したという話。

// s3managerを作る
sess := session.Must(session.NewSession())
downloader := s3manager.NewDownloader(sess)

file := &aws.WriteAtBuffer{}

// ここでダウンロードが実行される
n, err := downloader.Download(file, &s3.GetObjectInput{
    Bucket: aws.String(myBucket),
    Key:    aws.String(filename),
})
if err != nil {
    return fmt.Errorf("failed to download file, %v", err)
}
fmt.Printf("file downloaded, %d bytes\n", n)

// 任意の処理
// ここではbase64エンコーディングしてみる
base64Data := base64.StdEncoding.EncodeToString(file.Bytes())

バイト列は、 file.Bytes() で取り出せる。

参考

s3 - Amazon Web Services - Go SDK

go - golang s3 download to buffer using s3manager.downloader - Stack Overflow