このaws-sdk-goは古いバージョンを対象にしているため、現在のauth周りは全く異なります!
aws-sdk-goのauthですが、
ついつい以下のようにAccessKeyを直接書いてしまいがちですが、
var (
accessKey = "AWSaccesskey"
secretKey = "AWSsecretKey"
region = "ap-northeast-1"
)
func main() {
httpClient := &http.Client{Timeout: time.Duration(30) * time.Second}
creds := aws.Creds(accessKey, secretKey, "")
S3 := s3.New(creds, region, httpClient)
aws.DetectCreds()
aws.DetectCreds() を使うと、
1. 環境変数
2. /.aws/credentials
3. EC2に設定しているIAM Role
の順で勝手に認証情報を探して使ってくれてます。
便利です。とりあえずの実装ならこれを使うべき。
使い方は簡単です。 空の文字列を3つ渡すだけ。
S3 := s3.New(aws.DetectCreds("", "", ""), region, httpClient)
putのサンプル
ついでに、
ファイルをputする簡単なサンプルを載せておきます。
package main
import (
"log"
"net/http"
"os"
"time"
"github.com/awslabs/aws-sdk-go/aws"
"github.com/awslabs/aws-sdk-go/gen/s3"
)
var (
region = "ap-northeast-1"
bucket = "buket_name"
filename = "hoge.txt"
acl = "private"
mimeType = "text/plain"
)
func main() {
var (
err error
file *os.File
info os.FileInfo
)
httpClient := &http.Client{Timeout: time.Duration(30) * time.Second}
S3 := s3.New(aws.DetectCreds("", "", ""), region, httpClient)
if file, err = os.Open(filename); err != nil {
log.Println(err)
}
defer file.Close()
if info, err = file.Stat(); err != nil {
log.Println(err)
}
req := s3.PutObjectRequest{
Body: file,
Bucket: &bucket,
Key: &filename,
ACL: &acl,
ContentType: &mimeType,
ContentLength: aws.Long(info.Size()),
}
res, err := S3.PutObject(&req)
log.Printf("res:%s, err:%s", res, err)
}
ちなみに、
aws-sdk-goのdevelopブランチでは、初期化回りが変わっているので注意です。
https://github.com/awslabs/aws-sdk-go/blob/develop/service/s3/service.go#L19