golang で S3 にファイルを転送する術

こんにちは。おなかがへっている、きたけーです。

昨日のエントリ(golang で URLから画像データを取得して、ローカルのファイルに保存する術 - きたけーTechブログ)に続いて、今度はURLの猫ちゃん画像をS3に転送してみる。

こんなかんじ。

package main

import (
    "github.com/mitchellh/goamz/aws"
    "github.com/mitchellh/goamz/s3"
    "net/http"
)

func main() {
    var url string = "http://placekitten.com/g/640/340"

    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()

    auth, err := aws.EnvAuth()
    if err != nil {
        panic(err)
    }
    client := s3.New(auth, aws.APNortheast)
    bucket := client.Bucket("kitak-sandbox")

    err = bucket.PutReader("save.jpg", response.Body, response.ContentLength, "image/jpeg", s3.Private)
    if err != nil {
        panic(err)
    }
}

S3に転送するためのライブラリには mitchellh/goamz · GitHub を使う。このライブラリ、本家が goamz in Launchpad で、あちこちにforkされたのが乱立しているんですが、ミッチェル氏のを選択。last commitの日付とか他のプロダクトでガッツリ使ってるよ、というところで判断。

awsのアクセスキーとかシークレットキーは、環境変数AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYに設定しておく。

リージョンは、 goamz/aws.go at master · mitchellh/goamz · GitHub にズラズラ書かれている。

今回もメモリを意識して、PutReader関数を使ってみましたが、色々処理をするためにいったん変数に入れたい場合は、こんなかんじになる。

    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
      panic(err)
    }

    // ...

    bucket.Put("save.jpg", body, "image/jpeg", s3.Private)