Go言語(golang)でS3へファイルをアップロードする

2020.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の森脇です。

今回はaws-sdk-goを使って、S3へファイルをアップロードする方法についてご紹介したいと思います。

使用するGo言語のバージョンは1.13.6です。

前回ご紹介した、S3からファイルを取得する方法はこちら。

Go言語(golang)でS3からファイルを取得する

aws-sdk-goをインストールする

前回と同様、modulesを使ってaws-sdk-goをインストールします。

$ 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を作成します。

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を使用します。

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")
}

実行してみます。

$ go run main.go 
2020/01/31 13:36:01 done

エラーが発生することなく、実行が完了しました。

Upload関数の引数に指定しているBodyの型はio.Readerのため、 ローカルファイル以外でも簡単にアップロードできそうです。

まとめ

aws-sdk-goを使うことで、簡単にローカルのファイルをアップロードすることができました。

次回はGo言語を使った文字コード変換を実践したいと思います。

参考サイト