AWS SDK for Go を使ってS3にファイルをアップロードする

[AWS SDK for Go](https://github.com/aws/aws-sdk-go)がついに[プレビュー版](http://aws.amazon.com/jp/sdk-for-go/)になりましたね！
まだまだ仕様が変わる気がしないでもありませんが現バージョン(v0.6.2)でのS3のアップロードサンプルをやってみます。

## CloudFormationでS3bucketをつくる

S3バケットをつくりましょう。作り方は何でもいいです。今回はCloudFormationを使ってみます。

こんな感じのJSONを用意してStackを実行してS3バケットをつくってください。
バケット名は既にある名前だとつくれないので注意してください。

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
  },
  "Resources": {
    "DemoBucket" : {
      "Type" : "AWS::S3::Bucket",
      "Properties" : {
        "AccessControl" : "PublicReadWrite",
        "BucketName" : "sample-demo",
        "Tags": [
          {
            "Key": "Name",
            "Value": "demo"
          },
          {
            "Key": "Role",
            "Value": "s3"
          }
        ]
      }
    },
    "DemoBucketPolicy" : {
      "Type" : "AWS::S3::BucketPolicy",
      "Properties" : {
        "Bucket" : { "Ref" : "DemoBucket" },
        "PolicyDocument" : {
          "Version": "2008-10-17",
          "Statement": [
            {
              "Sid": "PublicReadGetObject",
              "Effect": "Allow",
              "Principal": {
                "AWS": "*"
              },
              "Action": "s3:GetObject",
              "Resource": "arn:aws:s3:::sample-demo/*"
            }
          ]
        }
      },
      "DependsOn": "DemoBucket"
    }
  },
  "Description": "s3"
}
```

## Gomfileを用意してGomでaws-sdk-goをインストールする

Goマネージャーの[gom](https://github.com/mattn/gom)が便利なのでこれを使って[aws-sdk-go](https://github.com/aws/aws-sdk-go)をインストールします。

```shell-session
$ go get github.com/mattn/gom
```

`Gomfile` を用意します。

```
gom 'github.com/aws/aws-sdk-go/aws'
gom 'github.com/aws/aws-sdk-go/service/s3'
```

パッケージをインストールします。

```shell-session
$ gom install
```

ここまで準備できたらGoでコードを書いてみましょう。

## GoでS3にファイルをアップロードしてみる

コードはこんな感じになります。アクセスキーとシークレットアクセスキーが必要になります。AWSのIAMで生成しておきましょう。

サンプルでアップロードするファイルはGoコードと同じ階層に置きます。
例として `./sample.jpg` として用意しました。

goファイルは `app.go` とします。

```go
package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awsutil"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/service/s3"
	"log"
	"os"
)

func main() {
	fileTransfer := FileTransferToS3{
		AccessKeyId:     "ACCESS_KEY_ID",
		SecretAccessKey: "SECRET_ACCESS_KEY",
		Region:          "us-west-2",
		BucketName:      "bucket-name",
	}

	fileTransfer.PutToS3("./", "sample.jpg")
}

type FileTransferToS3 struct {
	AccessKeyId     string
	SecretAccessKey string
	Region          string
	BucketName      string
}

func (f *FileTransferToS3) PutToS3(path string, filename string) {
	file, err := os.Open(fmt.Sprintf("%s%s", path, filename))
	if err != nil {
		log.Println(err.Error())
	}
	defer file.Close()

	cli := s3.New(&aws.Config{
		Credentials: credentials.NewStaticCredentials(f.AccessKeyId, f.SecretAccessKey, ""),
		Region:      f.Region,
	})

	resp, err := cli.PutObject(&s3.PutObjectInput{
		Bucket: aws.String(f.BucketName),
		Key:    aws.String(filename),
		Body:   file,
	})
	if err != nil {
		log.Println(err.Error())
	}

	log.Println(awsutil.StringValue(resp))
}
```

パッケージを `gom` でインストールしたのでgomコマンドで実行してください。

```shell-session
$ gom run app.go
```

実行してS3に無事にアップロードされたら成功です。