20
AWS SDK for Go JAWS-UG Meguro #0 @suzu_v

AWS SDK for Go in #jawsmeguro

Embed Size (px)

Citation preview

Page 1: AWS SDK for Go in #jawsmeguro

AWS SDK for GoJAWS-UG Meguro #0

@suzu_v

Page 2: AWS SDK for Go in #jawsmeguro

アジェンダ• AWS SDK for Goの紹介• 内部での実装の工夫について

Page 3: AWS SDK for Go in #jawsmeguro

オフィシャルな AWS SDK いろいろAndroid, Browser (JavaScript), iOS, Java, .NET, Node.js, PHP, Python, Ruby ...

and Go (Preview 2015/01/29, Unstable): ~

Page 4: AWS SDK for Go in #jawsmeguro

既存のGo実装 (コミュニティ版)• go-amz/amz

• もともと: https://launchpad.net/goamz

• mitchellhのfork: mitchellh/goamz

• goamz/goamz with Canonical

• AdRollによるfork: AdRoll/goamz

私はこれらのどれも使ったことがありません。使ってる方いたら教えて下さい。

Page 5: AWS SDK for Go in #jawsmeguro

AWS SDK for Gohttps://github.com/awslabs/aws-sdk-go

Page 6: AWS SDK for Go in #jawsmeguro

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段階

Page 7: AWS SDK for Go in #jawsmeguro

だいたいこんな感じで使えます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) }}

Page 8: AWS SDK for Go in #jawsmeguro

使ってみたS3にobjectをputで配置して、list, head, copy, deleteするaws-sdk-go-example/s3_misc.go at master : suzuken/aws-sdk-go-example

Page 9: AWS SDK for Go in #jawsmeguro

感触• わりと書ける、がまだ基礎的なレベルのapiを直接叩く必要がある

• けれども、Exampleや型によるサポートを利用すると多少楽にかける• Exampleも自動生成されている(後述

• この感触は正式リリース時に変わる可能性があります(Unstable

Page 10: AWS SDK for Go in #jawsmeguro

サポート予定と思われるサービスautoscaling dynamodb rdscloudformation ec2 redshiftcloudfront ecs route53cloudhsm elasticache route53domainscloudsearch elasticbeanstalk s3cloudsearchdomain elastictranscoder sescloudtrail elb simpledbcloudwatch emr snscloudwatchlogs glacier sqscodedeploy iam ssmcognitoidentity importexport storagegatewaycognitosync kinesis stsconfigservice kms supportdatapipeline lambda swfdirectconnect opsworks

どのように各種サービスをサポートしているか?

Page 11: AWS SDK for Go in #jawsmeguro

AWS SDK for Go internal• /service 以下は モデルベースのapi生成 によって自動生成されたコード

• /apis/{service_name} にJSONで書かれたapiの定義があり、これを利用している• ちなみにこの定義はbotoで使っているものらしい

Page 12: AWS SDK for Go in #jawsmeguro

go generateGenerating code - The Go Blog

• ライブラリ開発者のための機能

• ファイルのヘッダに go:generate gen などと書いておくと go generate で gen が実行される

• gen を実行することでファイルが生成される• ワンライナー実行のためのwrapper

Page 13: AWS SDK for Go in #jawsmeguro

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

Page 14: AWS SDK for Go in #jawsmeguro

ライブラリのコードを生成する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 あたりを読むとどのようにコードを生成しているかがわかります。

Page 15: AWS SDK for Go in #jawsmeguro

例: 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

Page 16: AWS SDK for Go in #jawsmeguro

生成された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

Page 17: AWS SDK for Go in #jawsmeguro

auto-generated example code• GoにはExampleがテストになる機能が標準ライブラリに付いている• Testable Examples in Go - The Go Blog

• AWS SDK for GoではこのExampleテストも自動生成されている

• godoc で簡単に実行例をみることができる

Page 18: AWS SDK for Go in #jawsmeguro

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 よりこれも自動生成されている

Page 19: AWS SDK for Go in #jawsmeguro

Godocから見ることができますhttp://godoc.org/github.com/awslabs/aws-sdk-go/service/s3#ex-S3-ListBuckets

Page 20: AWS SDK for Go in #jawsmeguro

まとめ• AWS SDK for Goはまだ開発中ですが、触れます• モデルベースのコード生成が活用されている

• ExampleやTestも自動生成されている• どんどんつかってフィードバックしましょう

• Issues · awslabs/aws-sdk-go