autoscale: true
- AWS SDK for Goの紹介
- 内部での実装の工夫について
Android, Browser (JavaScript), iOS, Java, .NET, Node.js, PHP, Python, Ruby ...
and Go (Preview 2015/01/29, Unstable): ~
- go-amz/amz
- もともと: https://launchpad.net/goamz
- mitchellhのfork: mitchellh/goamz
- goamz/goamz with Canonical
- AdRollによるfork: AdRoll/goamz
私はこれらのどれも使ったことがありません。使ってる方いたら教えて下さい。
https://github.com/awslabs/aws-sdk-go
- もともとStripe社で開発されていたもの
- codahale (Coda Hale) さんがメンテナ
- Model-basedでのコード生成を使っていて、これが他言語のAWS SDKと作りが似ていた
- awslabsに移管して公式SDKとして開発中
- 現在Developer Preview段階
package main
import (
"fmt"
"github.com/awslabs/aws-sdk-go/aws"
"github.com/awslabs/aws-sdk-go/service/s3"
)
// AWS SDK for GoでのListBucketsのサンプル
func main() {
// credentials are automatically loaded from ~/.aws/credentials
s := s3.New(&aws.Config{Region: "ap-northeast-1"})
buckets, _ := s.ListBuckets(nil)
for _, b := range buckets.Buckets {
v := *b.Name
fmt.Printf("bucket: %s\n", v)
}
}
S3にobjectをputで配置して、list, head, copy, deleteする
aws-sdk-go-example/s3_misc.go at master : suzuken/aws-sdk-go-example
- わりと書ける、がまだ基礎的なレベルのapiを直接叩く必要がある
- けれども、Exampleや型によるサポートを利用すると多少楽にかける
- Exampleも自動生成されている(後述
- この感触は正式リリース時に変わる可能性があります(Unstable
autoscaling dynamodb rds
cloudformation ec2 redshift
cloudfront ecs route53
cloudhsm elasticache route53domains
cloudsearch elasticbeanstalk s3
cloudsearchdomain elastictranscoder ses
cloudtrail elb simpledb
cloudwatch emr sns
cloudwatchlogs glacier sqs
codedeploy iam ssm
cognitoidentity importexport storagegateway
cognitosync kinesis sts
configservice kms support
datapipeline lambda swf
directconnect opsworks
どのように各種サービスをサポートしているか?
/service
以下はモデルベースのapi生成
によって自動生成されたコード/apis/{service_name}
にJSONで書かれたapiの定義があり、これを利用している- ちなみにこの定義はbotoで使っているものらしい
- ライブラリ開発者のための機能
- ファイルのヘッダに
go:generate gen
などと書いておくとgo generate
でgen
が実行される gen
を実行することでファイルが生成される- ワンライナー実行のためのwrapper
aws-sdk-go/Makefile at master : awslabs/aws-sdk-go
default: generate
generate-protocol-test:
go generate ./internal/protocol/...
generate-integration-test:
go generate ./internal/fixtures/integration
generate-test: generate-protocol-test generate-integration-test
generate:
go generate ./aws
go generate ./service
test: generate-test
go test ./... -tags=integration
aws-sdk-go/generate.go at master : awslabs/aws-sdk-go
// Package service contains automatically generated AWS clients.
package service
//go:generate go run ../internal/model/cli/gen-api/main.go -path=../service ../apis/*/*.normal.json
internal/model/api あたりを読むとどのようにコードを生成しているかがわかります。
それぞれのapiの定義がJSONで書かれている
"ListBuckets":{
"name":"ListBuckets",
"http":{
"method":"GET",
"requestUri":"/"
},
"output":{"shape":"ListBucketsOutput"},
"documentation":"Returns a list of all buckets owned by the authenticated sender of the request.",
"documentationUrl":"http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTServiceGET.html",
"alias":"GetService"
},
https://github.com/awslabs/aws-sdk-go/blob/master/apis/s3/2006-03-01.normal.json#L397-L407
// ListBucketsRequest generates a request for the ListBuckets operation.
func (c *S3) ListBucketsRequest(input *ListBucketsInput) (req *aws.Request, output *ListBucketsOutput) {
oprw.Lock()
defer oprw.Unlock()
if opListBuckets == nil {
opListBuckets = &aws.Operation{
Name: "ListBuckets",
HTTPMethod: "GET",
HTTPPath: "/",
}
}
if input == nil {
input = &ListBucketsInput{}
}
req = c.newRequest(opListBuckets, input, output)
output = &ListBucketsOutput{}
req.Data = output
return
}
https://github.com/awslabs/aws-sdk-go/blob/master/service/s3/api.go#L1024-L1045
- GoにはExampleがテストになる機能が標準ライブラリに付いている
- AWS SDK for GoではこのExampleテストも自動生成されている
godoc
で簡単に実行例をみることができる
func ExampleS3_ListBuckets() {
svc := s3.New(nil)
var params *s3.ListBucketsInput
resp, err := svc.ListBuckets(params)
if awsErr, ok := err.(awserr.Error); ok {
// Generic AWS Error with Code, Message, and original error (if any)
fmt.Println(awsErr.Code(), awsErr.Message(), awsErr.OrigErr())
if reqErr, ok := err.(awserr.RequestFailure); ok {
// A service error occurred
fmt.Println(reqErr.Code(), reqErr.Message(), reqErr.StatusCode(), reqErr.RequestID())
}
} else {
fmt.Println(err.Error())
}
// Pretty-print the response data.
fmt.Println(awsutil.StringValue(resp))
}
aws-sdk-go/examples_test.go at master : awslabs/aws-sdk-go より これも自動生成されている
http://godoc.org/github.com/awslabs/aws-sdk-go/service/s3#ex-S3-ListBuckets
- AWS SDK for Goはまだ開発中ですが、触れます
- モデルベースのコード生成が活用されている
- ExampleやTestも自動生成されている
- どんどんつかってフィードバックしましょう