Go言語(golang)でS3へファイルをアップロードする
データアナリティクス事業本部の森脇です。
今回はaws-sdk-goを使って、S3へファイルをアップロードする方法についてご紹介したいと思います。
使用するGo言語のバージョンは1.13.6です。
前回ご紹介した、S3からファイルを取得する方法はこちら。
aws-sdk-goをインストールする
前回と同様、modulesを使ってaws-sdk-goをインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 | $ go mod init example.com /moriwaki/s3write go: creating new go.mod: module example.com /moriwaki/s3write $ go get -u github.com /aws/aws-sdk-go go: finding github.com /aws/aws-sdk-go v1.28.9 go: downloading github.com /aws/aws-sdk-go v1.28.9 go: extracting github.com /aws/aws-sdk-go v1.28.9 $ cat go.mod module example.com /moriwaki/s3write go 1.13 require github.com /aws/aws-sdk-go v1.28.9 // indirect |
今回はv1.28.9がインストールされました。
作っていく
main.goというファイルを作成し、実装していきます。
AWSのクレデンシャルは、aws-cliなどを使って事前に設定しておきます。
sessionを作成する
S3に接続するためにのsessionを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main import ( "github.com/aws/aws-sdk-go/aws/session" ) func main() { // sessionの作成 sess := session.Must(session.NewSessionWithOptions(session.Options{ Profile: "di" , SharedConfigState: session.SharedConfigEnable, })) } |
「SharedConfigState」オプションの意味は、前回ご紹介した記事を参照ください。
S3にファイルをアップロードする
main.goと同じ階層に「sample.txt」というファイルを作成し、こちらをアップロードしてみます。
アップロードにはs3managerのUploaderを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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/s3manager" ) func main() { // sessionの作成 sess := session.Must(session.NewSessionWithOptions(session.Options{ Profile: "di" , SharedConfigState: session.SharedConfigEnable, })) // ファイルを開く targetFilePath := "./sample.txt" file, err := os.Open(targetFilePath) if err != nil { log.Fatal(err) } defer file.Close() bucketName := "xxx-bucket" objectKey := "xxx-key" // Uploaderを作成し、ローカルファイルをアップロード uploader := s3manager.NewUploader(sess) _, err = uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String(bucketName), Key: aws.String(objectKey), Body: file, }) if err != nil { log.Fatal(err) } log.Println( "done" ) } |
実行してみます。
1 2 | $ go run main.go 2020 /01/31 13:36:01 done |
エラーが発生することなく、実行が完了しました。
Upload関数の引数に指定しているBodyの型はio.Readerのため、 ローカルファイル以外でも簡単にアップロードできそうです。
まとめ
aws-sdk-goを使うことで、簡単にローカルのファイルをアップロードすることができました。
次回はGo言語を使った文字コード変換を実践したいと思います。