🖼️

【Go】aws-sdk-goでS3に画像をアップロードする

2021/08/15に公開

はじめに

AWSのコンソールから簡単にアップロード出来ますが、
今回はアプリなどから画像をアップロードする事を想定して、ソースコードでS3に画像をアップロードしてみます。

ゴール

go run main.go

のコマンドでmain.goと同じ配下にいる画像ファイルをS3の
test-bucket-0814という名前のバケットの中のimageフォルダ以下に画像をアップロードすること。

これを

ここに保存

この状態にすることがゴールです。

環境

macOS 11.4
go 1.16
aws-sdk-go 1.40.17

準備

.awsの設定

credentialsやconfigの設定を行なってください。
今回はこちらでは説明致しません。
設定されている事を前提として話を進めます。
まだ設定できていない人は、こちらを参考に設定してみてください。
https://zenn.dev/a_ichi1/articles/2c3c3caac8f13e

aws-sdk-goをインストールします。

//go mod を入れます。今回はexample.comにしてます。皆様はGitHubなどのリポジトリになると思います。
$ go mod init example.com
//aws-sdk-go をインストールします。
$ go get -u github.com/aws/aws-sdk-go
//go mod を更新します。
$ go mod tidy

インストールが終わりましたら、早速コードを書いていきます。
以下のソースコードが完成形です。

ソースコード

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

// 画像のPath
var filePath = "./sakura.jpeg"

// S3のバケット名
var bucket = "test-bucket-0814"

// key S3に保存するオブジェクトの名前になります
var key = "image/sakura"

// awsのリージョン名
var awsRegion = "ap-northeast-1"

func main() {

	// 画像を読み込みます
	imageFile, err := os.Open(filePath)
	if err != nil {
		log.Fatal(err)
	}
	// 最後に画像ファイルを閉じます
	defer imageFile.Close()

	// sessionを作成します
	newSession := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
	}))

	// S3クライアントを作成します
	svc := s3.New(newSession, &aws.Config{
		Region: aws.String(awsRegion),
	})

	// S3にアップロードする内容をparamsに入れます
	params := &s3.PutObjectInput{
		// Bucket アップロード先のS3のバケット
		Bucket: aws.String(bucket),
		// Key アップロードする際のオブジェクト名
		Key: aws.String(key),
		// Body アップロードする画像ファイル
		Body: imageFile,
	}

	// S3にアップロードします
	_, err = svc.PutObject(params)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("S3へアップロードが完了しました。")
}

こんな感じになりました。
少し解説していきます。

解説

  1. ここで以下で使う変数を定義しています。
    keyがオブジェクトの名前になります。
    image/をつけることで、imageフォルダの中にsakuraというオブジェクト名で保存される事になります。
// 画像のPath
var filePath = "./sakura.jpeg"

// S3のバケット名
var bucket = "test-bucket-0814"

// key S3に保存するオブジェクトの名前になります
var key = "image/sakura"

// awsのリージョン名
var awsRegion = "ap-northeast-1"
  1. S3にアップロードするためのセッションとS3クライアントを作成します。
    オプションの「SharedConfigState」に「SharedConfigEnable」を設定することで、
    自分で設定している ~/.aws/config内を参照してくれるようになります。
    profile名の指定も可能です。
    指定する場合は、Optionsの中に Profile: "プロフィール名" と記載します。
// sessionを作成します
	newSession := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
	}))
  1. S3クライアントを作成します。
    S3クライアントを作成する際に、2 で作成したsessionを使用します。
    また、Configでリージョンを指定しています。
	// S3クライアントを作成します
	svc := s3.New(newSession, &aws.Config{
		Region: aws.String(awsRegion),
	})
  1. S3へアップロードします。
    paramsにアップロードする内容を入れます。
    それをアップロードしているだけです。
	// S3にアップロードする内容をparamsに入れます
	params := &s3.PutObjectInput{
		// Bucket アップロード先のS3のバケット
		Bucket: aws.String(bucket),
		// Key アップロードする際のオブジェクト名
		Key: aws.String(key),
		// Body アップロードする画像ファイル
		Body: imageFile,
	}

	// S3にアップロードします
	_, err = svc.PutObject(params)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("S3へアップロードが完了しました。")

結果

% go run main.go      
2021/08/15 11:55:14 S3へアップロードが完了しました。

うまくいきました。
ちゃんと、test-bucket-0814という名前のバケットの中のimageフォルダ以下に画像をアップロードされています。

さいごに

次回はダウンロードもやってみようと思います。

参考

https://pkg.go.dev/github.com/aws/aws-sdk-go@v1.13.54

https://dev.classmethod.jp/articles/golang-write-s3/

Discussion