🖼️
【Go】aws-sdk-goでS3に画像をアップロードする
はじめに
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の設定を行なってください。
今回はこちらでは説明致しません。
設定されている事を前提として話を進めます。
まだ設定できていない人は、こちらを参考に設定してみてください。
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へアップロードが完了しました。")
}
こんな感じになりました。
少し解説していきます。
解説
- ここで以下で使う変数を定義しています。
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"
- S3にアップロードするためのセッションとS3クライアントを作成します。
オプションの「SharedConfigState」に「SharedConfigEnable」を設定することで、
自分で設定している ~/.aws/config内を参照してくれるようになります。
profile名の指定も可能です。
指定する場合は、Optionsの中に Profile: "プロフィール名" と記載します。
// sessionを作成します
newSession := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
- S3クライアントを作成します。
S3クライアントを作成する際に、2 で作成したsessionを使用します。
また、Configでリージョンを指定しています。
// S3クライアントを作成します
svc := s3.New(newSession, &aws.Config{
Region: aws.String(awsRegion),
})
- 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フォルダ以下に画像をアップロードされています。
さいごに
次回はダウンロードもやってみようと思います。
参考
Discussion