アルバイトのMoriです。
今回はaws-sdk-goについて書きたいと思います。

目次

なにを紹介するのか

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についても取り上げていきたいと思っています。

参考になったページ

Posted in AWS