MAGAZINE
ルーターマガジン
AWS
よくググってしまいそうなGo言語(golang)でaws-sdk-goを使ったS3操作4選
2019.06.07
アルバイトのMoriです。
今回はaws-sdk-goについて書きたいと思います。
目次
- なにを紹介するのか
- 0. アクセスキーの設定
- 1. データを指定してS3にアップロード
- 2. オブジェクトのデータを変数で受け取る
- 3. prefixを指定してオブジェクト一覧を取得する
- 最後に
- 参考にしたWebページ
なにを紹介するのか
GolangでのS3上のオブジェクト操作Tipsについてです。特に、aws-sdk-go
の公式リファレンスにあるs3
のサンプルコードには書かれていないけど、この操作はどうやればいいの!?と筆者が感じた
~/.aws
ディレクトリから認証情報を読み込む- データを指定してS3にアップロード
- オブジェクトのデータを変数で受け取る
- prefixを指定してオブジェクト一覧を取得する
の4つの処理に焦点を絞って書いていきたいと思います。
0. アクセスキーの設定
アクセスキーは~/.aws
ディレクトリ配下で管理したいことが多いと思います。そのような時は~/.aws/crendentials
に以下のように認証情報を記述します。
[profile_name1]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key
以上で記述した認証情報をプログラム内で利用するには以下のように行います
- import
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
)
プロファイル名
とリージョン名
を指定してaws.Config
を初期化し、セッションを作成
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String(regionName),
Credentials: credentials.NewSharedCredentials("", profileName),
}))
1. データを指定してS3にアップロード
ファイルに書き込んで、ローカルファイルからオブジェクトにコピーするというダサいことなどせずに、以下のようにすることでサラッと行えます。
- import
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"fmt"
"strings"
)
- Bodyに格納したい値を
strings.NewReader
に読み込ませて、s3manager.UploadInput
の初期化の際に渡す。
reader := strings.NewReader(body)
uploader := s3manager.NewUploader(sess)
//変数body -> オブジェクトのBody
result, err := uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
Body: reader,
})
//結果表示
if err == nil {
fmt.Println(result.Location)
} else {
fmt.Println("error happend!!!")
}
2. オブジェクトのデータを変数で受け取る
オブジェクトをローカルにコピーして、さらにファイル読み込むするというダサいことなどせずに、以下のようにすることでサラッと行えます。
- import
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"fmt"
)
downloader.Download
の第一引数にbyte
型の配列を渡す
buf := aws.NewWriteAtBuffer([]byte{})
downloader := s3manager.NewDownloader(sess)
//オブジェクトのBody -> 変数buf
nByte, err := downloader.Download(buf, &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
})
//結果表示
if err != nil {
fmt.Println("error happend!!!")
} else {
body := string(buf.Bytes())
fmt.Printf("size : %d byte, body : %s\n", nByte, body)
}
3. prefixを指定してオブジェクト一覧を取得する
prefixを指定してバケット内のオブジェクトを検索したい時は、以下のようにすることで可能です。
- import
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3"
"fmt"
)
ListObjectsInput
の初期化の際に、prefix
を渡す。
svc := s3.New(sess)
//prefixを指定して検索
resp, _ := svc.ListObjects(&s3.ListObjectsInput{
Bucket: aws.String(bucketName),
Prefix: aws.String(prefix),
})
//標準出力に検索結果を表示
for _, item := range resp.Contents {
fmt.Println("Name: ", *item.Key)
fmt.Println("Last modified:", *item.LastModified)
fmt.Println("Size: ", *item.Size)
fmt.Println("Storage class:", *item.StorageClass)
fmt.Println("")
}
最後に
公式リファレンスを見て、私と同じように手が止まってしまった人の助けになれば幸いです。今度は他の言語のaws-sdk
についても取り上げていきたいと思っています。
参考になったページ
CONTACT
お問い合わせ・ご依頼はこちらから