🖼️
【Go】aws-sdk-goでS3から画像をダウンロードする
はじめに
前回アップロードをしましたので、今回はダウンロードしてみます。
ゴール
AWS S3にあるこの画像を、Goのaws-sdk-goを使ってダウンロードする。
この画像を
ここに保存する。
環境
macOS 11.4
go 1.16
aws-sdk-go 1.40.17
準備
.awsの設定
credentialsやconfigの設定を行なってください。
今回はこちらでは説明致しません。
設定されている事を前提として話を進めます。
まだ設定できていない人は、こちらを参考に設定してみてください。
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からダウンロードが完了しました。")
}
少し解説していきます。
解説
- ここで以下で使う変数を定義しています。
filePathは、ダウンロードした画像を保存するファイルの名前です。
// 作成する画像ファイルの名前
var filePath = "./sakura.jpeg"
// S3のバケット名
var bucket = "test-bucket-0814"
// S3のオブジェクト名
var key = "image/sakura.jpeg"
// awsのリージョン名
var awsRegion = "ap-northeast-1"
- 保存する為のファイルを先に作成します。
// ファイルを作成します。
file, err := os.Create(filePath)
if err != nil {
log.Fatal(err)
}
- S3からダウンロードするためのセッションとS3クライアントを作成します。
// sessionを作成します
newSession := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
// S3クライアントを作成します
svc := s3.New(newSession, &aws.Config{
Region: aws.String(awsRegion),
})
- S3からダウンロードする内容を変数に入れます。
1で設定した変数のbucketとkeyを使用しています。
// S3からダウンロードする内容をdownloadKeyに入れます
downloadKey := &s3.GetObjectInput{
// Bucket ダウンロードするS3のバケット名
Bucket: aws.String(bucket),
// Key ダウンロードするオブジェクト名
Key: aws.String(key),
}
- S3からダウンロードします。
// S3からダウンロードします
image, err := svc.GetObject(downloadKey)
if err != nil {
log.Fatal(err)
}
- ダウンロードした画像をbytes.Buffer型に変換します。
//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からダウンロードが完了しました。")
これでダウンロード完了です。
さいごに
前回、アップロードを記事にして、今回ダウンロードを記事にしました。
もっと前にサムネイル化も書いたので、ダウンロード→サムネイル化→アップロードが出来ますね。
次は何を書こうかな?
参考
Discussion