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言語を使った文字コード変換を実践したいと思います。

参考サイト

PRAWSの技術支援ならクラスメソッド