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)