SlideShare a Scribd company logo
AWS SDK for Go
JAWS-UG Meguro #0
@suzu_v
アジェンダ
• AWS SDK for Goの紹介
• 内部での実装の工夫について
オフィシャルな AWS SDK いろいろ
Android, Browser (JavaScript), iOS, Java, .NET, Node.js, PHP,
Python, Ruby ...
and Go (Preview 2015/01/29, Unstable): ~
既存のGo実装 (コミュニティ版)
• go-amz/amz
• もともと: https://launchpad.net/goamz
• mitchellhのfork: mitchellh/goamz
• goamz/goamz with Canonical
• AdRollによるfork: AdRoll/goamz
私はこれらのどれも使ったことがありません。使ってる方いたら教
えて下さい。
AWS SDK for Go
https://github.com/awslabs/aws-sdk-go
AWS SDK for Go
• もともとStripe社で開発されていたもの
• codahale (Coda Hale) さんがメンテナ
• Model-basedでのコード生成を使っていて、これが他言語のAWS SDKと
作りが似ていた
• awslabsに移管して公式SDKとして開発中
• https://aws.amazon.com/jp/blogs/aws/coming-soon-aws-sdk-for-go/
• 現在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: %sn", 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
どのように各種サービスをサポートしているか?
AWS SDK for Go internal
• /service 以下は モデルベースのapi生成 によって自動生成
されたコード
• /apis/{service_name} にJSONで書かれたapiの定義があ
り、これを利用している
• ちなみにこの定義はbotoで使っているものらしい
go generate
Generating code - The Go Blog
• ライブラリ開発者のための機能
• ファイルのヘッダに go:generate gen などと書いておくと
go generate で gen が実行される
• gen を実行することでファイルが生成される
• ワンライナー実行のためのwrapper
AWS SDK for Go の Makefileより
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 あたりを読むとどのようにコードを生成し
ているかがわかります。
例: ListBuckets (apis/s3 での定義)
それぞれの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
生成されたListBucketsのコード
// 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
auto-generated example code
• GoにはExampleがテストになる機能が標準ライブラリに付い
ている
• Testable Examples in Go - The Go Blog
• AWS SDK for GoではこのExampleテストも自動生成されてい
る
• godoc で簡単に実行例をみることができる
Example Test: S3 ListBuckets()の例
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 より
これも自動生成されている
Godocから見ることができます
http://godoc.org/github.com/awslabs/aws-sdk-go/service/
s3#ex-S3-ListBuckets
まとめ
• AWS SDK for Goはまだ開発中ですが、触れます
• モデルベースのコード生成が活用されている
• ExampleやTestも自動生成されている
• どんどんつかってフィードバックしましょう
• Issues · awslabs/aws-sdk-go

More Related Content

AWS SDK for Go in #jawsmeguro

  • 1. AWS SDK for Go JAWS-UG Meguro #0 @suzu_v
  • 2. アジェンダ • AWS SDK for Goの紹介 • 内部での実装の工夫について
  • 3. オフィシャルな AWS SDK いろいろ Android, Browser (JavaScript), iOS, Java, .NET, Node.js, PHP, Python, Ruby ... and Go (Preview 2015/01/29, Unstable): ~
  • 4. 既存のGo実装 (コミュニティ版) • go-amz/amz • もともと: https://launchpad.net/goamz • mitchellhのfork: mitchellh/goamz • goamz/goamz with Canonical • AdRollによるfork: AdRoll/goamz 私はこれらのどれも使ったことがありません。使ってる方いたら教 えて下さい。
  • 5. AWS SDK for Go https://github.com/awslabs/aws-sdk-go
  • 6. AWS SDK for Go • もともとStripe社で開発されていたもの • codahale (Coda Hale) さんがメンテナ • Model-basedでのコード生成を使っていて、これが他言語のAWS SDKと 作りが似ていた • awslabsに移管して公式SDKとして開発中 • https://aws.amazon.com/jp/blogs/aws/coming-soon-aws-sdk-for-go/ • 現在Developer Preview段階
  • 7. だいたいこんな感じで使えます 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: %sn", v) } }
  • 8. 使ってみた S3にobjectをputで配置して、list, head, copy, deleteする aws-sdk-go-example/s3_misc.go at master : suzuken/aws-sdk- go-example
  • 9. 感触 • わりと書ける、がまだ基礎的なレベルのapiを直接叩く必要が ある • けれども、Exampleや型によるサポートを利用すると多少楽に かける • Exampleも自動生成されている(後述 • この感触は正式リリース時に変わる可能性があります (Unstable
  • 10. サポート予定と思われるサービス 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 どのように各種サービスをサポートしているか?
  • 11. AWS SDK for Go internal • /service 以下は モデルベースのapi生成 によって自動生成 されたコード • /apis/{service_name} にJSONで書かれたapiの定義があ り、これを利用している • ちなみにこの定義はbotoで使っているものらしい
  • 12. go generate Generating code - The Go Blog • ライブラリ開発者のための機能 • ファイルのヘッダに go:generate gen などと書いておくと go generate で gen が実行される • gen を実行することでファイルが生成される • ワンライナー実行のためのwrapper
  • 13. AWS SDK for Go の Makefileより 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
  • 14. ライブラリのコードを生成する 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 あたりを読むとどのようにコードを生成し ているかがわかります。
  • 15. 例: ListBuckets (apis/s3 での定義) それぞれの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
  • 16. 生成されたListBucketsのコード // 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
  • 17. auto-generated example code • GoにはExampleがテストになる機能が標準ライブラリに付い ている • Testable Examples in Go - The Go Blog • AWS SDK for GoではこのExampleテストも自動生成されてい る • godoc で簡単に実行例をみることができる
  • 18. Example Test: S3 ListBuckets()の例 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 より これも自動生成されている
  • 20. まとめ • AWS SDK for Goはまだ開発中ですが、触れます • モデルベースのコード生成が活用されている • ExampleやTestも自動生成されている • どんどんつかってフィードバックしましょう • Issues · awslabs/aws-sdk-go