🖼️

【Go】aws-sdk-goでS3から画像をダウンロードする

2021/08/27に公開

はじめに

前回アップロードをしましたので、今回はダウンロードしてみます。

ゴール

AWS S3にあるこの画像を、Goのaws-sdk-goを使ってダウンロードする。

この画像を

ここに保存する。

環境

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

// 作成する画像ファイルの名前
var filePath = "./sakura.jpeg"

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

// S3のオブジェクト名
var key = "image/sakura.jpeg"

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

func main() {

	// ファイルを作成します。
	file, err := os.Create(filePath)
	if err != nil {
		log.Fatal(err)
	}

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

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

	// S3からダウンロードする内容をdownloadKeyに入れます
	downloadKey := &s3.GetObjectInput{
		// Bucket ダウンロードするS3のバケット名
		Bucket: aws.String(bucket),
		// Key ダウンロードするオブジェクト名
		Key: aws.String(key),
	}

	// S3からダウンロードします
	image, err := svc.GetObject(downloadKey)
	if err != nil {
		log.Fatal(err)
	}

	//imageをbytes.Buffer型に変換します
	buf := new(bytes.Buffer)
	buf.ReadFrom(image.Body)

	// ファイルに書き込みします。
	_, err = file.Write(buf.Bytes())
	if err != nil {
		log.Fatal(err)
	}
	log.Println("S3からダウンロードが完了しました。")
}


少し解説していきます。

解説

  1. ここで以下で使う変数を定義しています。

filePathは、ダウンロードした画像を保存するファイルの名前です。

// 作成する画像ファイルの名前
var filePath = "./sakura.jpeg"

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

// S3のオブジェクト名
var key = "image/sakura.jpeg"

// awsのリージョン名
var awsRegion = "ap-northeast-1"
  1. 保存する為のファイルを先に作成します。
	// ファイルを作成します。
	file, err := os.Create(filePath)
	if err != nil {
		log.Fatal(err)
	}
  1. S3からダウンロードするためのセッションとS3クライアントを作成します。
	// sessionを作成します
	newSession := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
	}))

	// S3クライアントを作成します
	svc := s3.New(newSession, &aws.Config{
		Region: aws.String(awsRegion),
	})
  1. S3からダウンロードする内容を変数に入れます。
    1で設定した変数のbucketとkeyを使用しています。
	// S3からダウンロードする内容をdownloadKeyに入れます
	downloadKey := &s3.GetObjectInput{
		// Bucket ダウンロードするS3のバケット名
		Bucket: aws.String(bucket),
		// Key ダウンロードするオブジェクト名
		Key: aws.String(key),
	}
  1. S3からダウンロードします。
	// S3からダウンロードします
	image, err := svc.GetObject(downloadKey)
	if err != nil {
		log.Fatal(err)
	}
  1. ダウンロードした画像をbytes.Buffer型に変換します。
	//imageをbytes.Buffer型に変換します
	buf := new(bytes.Buffer)
	buf.ReadFrom(image.Body)
  1. 最後にファイルに書き込みます。
	// ファイルに書き込みします。
	_, err = file.Write(buf.Bytes())
	if err != nil {
		log.Fatal(err)
	}
	log.Println("S3からダウンロードが完了しました。")

これでダウンロード完了です。

さいごに

前回、アップロードを記事にして、今回ダウンロードを記事にしました。
もっと前にサムネイル化も書いたので、ダウンロード→サムネイル化→アップロードが出来ますね。
次は何を書こうかな?

参考

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

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

Discussion