この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部の森脇です。
最近業務でよくGo言語を使用します。 今回はaws-sdk-goを使って、S3からファイルを取得する方法についてご紹介したいと思います。
使用するGo言語のバージョンは1.13.6です。
aws-sdk-goをインストールする
go getコマンドを使ってインストールします。
$ go get -u github.com/aws/aws-sdk-go
.
.
$ cat go.mod
module example.com/moriwaki/s3read
go 1.13
require github.com/aws/aws-sdk-go v1.28.6 // indirect
v1.28.6がインストールされました。
作っていく
main.goというファイルを作成し、実装していきます。
AWSのクレデンシャルは、aws-cliなどを使って事前に設定しておきます。
sessionを作成する
S3に接続する際に、まずはsessionを作成します。
package main
import (
"github.com/aws/aws-sdk-go/aws/session"
)
func main() {
// sessionの作成
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
}
オプションの「SharedConfigState」に「SharedConfigEnable」を設定することで、~/.aws/config内を参照してくれるようになります。
クレデンシャルをprofile名で指定したい場合は、オプションの「Profile」を使います。
// sessionの作成
sess := session.Must(session.NewSessionWithOptions(session.Options{
Profile: "profileName",
SharedConfigState: session.SharedConfigEnable,
}))
}
S3からファイルをダウンロードする
s3managerのDownloaderを使用します。
package main
import (
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
func main() {
// sessionの作成
sess := session.Must(session.NewSessionWithOptions(session.Options{
Profile: "di",
SharedConfigState: session.SharedConfigEnable,
}))
// S3オブジェクトを書き込むファイルの作成
f, err := os.Create("sample.txt")
if err != nil {
log.Fatal(err)
}
bucketName := "xxx-bucket"
objectKey := "xxx-key"
// Downloaderを作成し、S3オブジェクトをダウンロード
downloader := s3manager.NewDownloader(sess)
n, err := downloader.Download(f, &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
})
if err != nil {
log.Fatal(err)
}
log.Printf("DownloadedSize: %d byte", n)
}
downloader.Dowload()関数は、ダウンロードしたサイズを第1戻り値として返します。
実行してみます。
$ go run main.go
2020/01/21 18:05:32 DownloadedSize: 20 byte
成功し、ダウンロードしたオブジェクトのサイズを取得できました。
ダウンロードせずに読み込む
先程の例ではファイル化してダウンロードまで行いましたが、今度はファイルとして 落とさずに読み込みを行います。
package main
import (
"log"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
// sessionの作成
sess := session.Must(session.NewSessionWithOptions(session.Options{
Profile: "di",
SharedConfigState: session.SharedConfigEnable,
}))
bucketName := "xxx-bucket"
objectKey := "xxx-key"
// S3 clientを作成
svc := s3.New(sess)
obj, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
})
if err != nil {
log.Fatal(err)
}
// 最初の10byteだけ読み込んで表示
rc := obj.Body
defer rc.Close()
buf := make([]byte, 10)
_, err = rc.Read(buf)
if err != nil {
log.Fatal(err)
}
log.Printf("%s", buf)
}
実行してみます。
$ go run main.go
2020/01/21 18:10:15 Hello! Go.
読み込みに成功し、ストレージを利用することなくファイルを読み込むことができました。
GetObject()の戻り値のBodyの型は「io.ReadCloser」インターフェースですので
各種ライブラリとお手軽に連携できそうです。
まとめ
aws-sdk-goを使うことで、簡単にS3のファイルを読み込むことができました。
次回はS3にファイルをアップロードする部分を実践したいと思います。