Slide 1

Slide 1 text

aws-sdk-go-v2入門 MediaDo.go#2 2020.09.25

Slide 2

Slide 2 text

株式会社メディアドゥ所属 - バックエンド、インフラエンジニア Name : Takumi Ogawa Twitter: @_ogady_

Slide 3

Slide 3 text

1. aws-sdk-goとは 2. aws-sdk-go-v2とは 3. aws-sdk-goとの違い 4. aws-sdk-go-v2を使ってみる 5. 最後に

Slide 4

Slide 4 text

aws-sdk-go、 使ってますか? Q

Slide 5

Slide 5 text

1 aws-sdk-goとは

Slide 6

Slide 6 text

aws-sdk-goとは ● おなじみGo言語用のAWS SDK ● 認証・リクエストの再試行・エラー処理など、低レイ ヤーの処理をよしなにラッピングしてくれる ● goroutineを使用したS3との大容量ファイル受け渡しな どのAWS連携が簡単にできる

Slide 7

Slide 7 text

2 aws-sdk-go-v2とは

Slide 8

Slide 8 text

aws-sdk-go-v2とは ● 現行提供されているaws-sdk-goの後継 ● パフォーマンス・一貫性・使いやすさなどを改善 ● 2017年12月22日より開発者プレビュー版がリリース →2020年9月25日現在も開発者プレビュー版のみの提供

Slide 9

Slide 9 text

3 aws-sdk-goとの違い

Slide 10

Slide 10 text

● sessionではなくexternalパッケージを使用する ● 現行のsessionパッケージとcredentialパッケージの機能 がv2ではexternalパッケージに集約され、わかりやすく なっている ● クライアントはaws.Configのみを使用して生成する。 →従来のaws.Configを生成してsession.New()する手順か ら、よりシンプルになった ・サービスクライアント生成方法の違い aws-sdk-goとの違い

Slide 11

Slide 11 text

aws-sdk-go sess := session.Must( session.NewSession() ) // S3クライアントを作成 svc := s3.New(sess) aws-sdk-go-v2 aws-sdk-goとの違い ・サービスクライアント生成方法の違い cfg, err := external.LoadDefaultAWSConfig() if err != nil { panic( err) } // S3クライアントを作成 svc := s3.New(cfg) ※上記はおおむね同じ挙動

Slide 12

Slide 12 text

● Send()メソッドを使用し、リクエストを送信する ● APIインプット構造体をRequest()に渡すのは現行と同じ ● APIコール形式が各サービスで統一されているため、わ かりやすくなった →各API要求メソッドはサフィックスに”Request”がつ いている、Send()メソッドでAPIコールする、など ・APIリクエスト発行の違い aws-sdk-goとの違い

Slide 13

Slide 13 text

aws-sdk-go svc := s3.New(sess) res, err := svc.GetObjectWithContext( context.TODO(), &s3.GetObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key)} ) } aws-sdk-go-v2 aws-sdk-goとの違い ・APIリクエスト発行の違い svc := s3.New(cfg) req := svc.GetObjectRequest( &s3.GetObjectInput{ Bucket: aws.String(bucketName), Key: aws.String(key)} ) res, err := req.Send(context.TODO())

Slide 14

Slide 14 text

● APIインプット構造体のフィールドに型指定された列挙 値を使用する →この変更により、文字列を直接使用することがなくな り、より型安全に使用できる ● 列挙値を使用する際に、APIインプットのフィールドを ポインタ型にする必要がなくなった aws-sdk-goとの違い ・APIインプット構造体に型指定された列挙値を提供

Slide 15

Slide 15 text

const ( ObjectCannedACLPrivate = "private" // 一部省略 } aws-sdk-go type PutObjectInput struct { // 一部省略 ACL *string } aws-sdk-go-v2 aws-sdk-goとの違い type PutObjectInput struct { // 一部省略 ACL ObjectCannedACL } type ObjectCannedACL string const ( ObjectCannedACLPrivate ObjectCannedACL = "private" // 一部省略 } ・APIインプット構造体に型指定された列挙値を提供(内部実装比較)

Slide 16

Slide 16 text

aws-sdk-go input := &s3.PutObjectInput{ Bucket: aws.String("myBucket"), Key: aws.String("myKey"), ACL: aws.String( s3.ObjectCannedACLPrivate ), Body: file, } aws-sdk-go-v2 aws-sdk-goとの違い ・APIインプット構造体に型指定された列挙値を提供 input := &s3.PutObjectInput{ Bucket: aws.String("myBucket"), Key: aws.String("myKey"), ACL: s3.ObjectCannedACLPrivate, Body: file, }

Slide 17

Slide 17 text

● APIインプット構造体のフィールドでスライス要素と マップ要素を値型からポインタ型に変換する必要がなく なった ・APIスライス、マップ要素指定の違い aws-sdk-goとの違い

Slide 18

Slide 18 text

aws-sdk-go type AddPermissionInput struct { _ struct{} AWSAccountIds []*string // 一部省略 } aws-sdk-go-v2 aws-sdk-goとの違い ・APIスライス、マップ要素指定の違い(内部実装比較) type AddPermissionInput struct { _ struct{} AWSAccountIds []string // 一部省略 }

Slide 19

Slide 19 text

input := &sqs.AddPermissionInput{ AWSAccountIds: []string{ "123456789", }, Actions: []string{ "SendMessage", }, // 一部省略 } aws-sdk-go input := &sqs.AddPermissionInput{ AWSAccountIds: []*string{ aws.String("123456789"), }, Actions: []*string{ aws.String("SendMessage"), }, // 一部省略 } aws-sdk-go-v2 aws-sdk-goとの違い ・APIスライス、マップ要素指定の違い

Slide 20

Slide 20 text

4 aws-sdk-go-v2を 使ってみる

Slide 21

Slide 21 text

cfg, err = external.LoadDefaultAWSConfig() cfg, err = external.LoadDefaultAWSConfig( external.WithSharedConfigProfile("example-profile-name"), ) cfg, err := external.LoadDefaultAWSConfig( external.WithCredentialsProvider{ CredentialsProvider: aws.StaticCredentialsProvider{ Value: aws.Credentials{ AccessKeyID: "AKID", SecretAccessKey: "SECRET", SessionToken: "SESSION", Source: "example hard coded credentials" }}}) aws-sdk-go-v2を使ってみる ・Config情報取得 defaultの認証情報を 使用するパターン 認証設定ファイルの 任意の認証情報を使 用するパターン 認証情報を直接指定 するパターン

Slide 22

Slide 22 text

・S3へファイルアップロード aws-sdk-go-v2を使ってみる svc := s3.New(cfg) input := &s3.PutObjectInput{ Body: bytes.NewReader(file), Bucket: aws.String(“bucketName”), Key: aws.String(“key”), ACL: s3.ObjectCannedACLPublicRead, } req := svc.PutObjectRequest(input) _, err := req.Send(context.TODO()) if err != nil { return fmt.Errorf("failed to put s3 object with key '%s' %w", key, err) } 前のスライドで生成した aws.Configを渡す リクエストを送信する

Slide 23

Slide 23 text

・SQSへメッセージ送信 aws-sdk-go-v2を使ってみる svc := sqs.New(cfg) input := &sqs.SendMessageInput{ MessageBody: aws.String(“Message”), QueueUrl: aws.String(“exampleURL”), } req := svc.SendMessageRequest(input) _, err := req.Send(context.TODO()) if err != nil { return fmt.Errorf("failed to send sqs %w", err) } 前のスライドで生成した aws.Configを渡す リクエストを送信する

Slide 24

Slide 24 text

5 最後に

Slide 25

Slide 25 text

● 確実にわかりやすくなってる(と思う) ● 内部実装も綺麗になったので、困った時に調査しやすい ● とはいえ開発者プレビュー版なので計画的にご利用くだ さい… 最後に

Slide 26

Slide 26 text

良きaws with goライフを! contact me at @_ogady_ Thanks ! !