Speaker Deck
Speaker Deck Pro
Sign in
Sign up
for free
aws-sdk-go-v2入門 MediaDo.go
TakumiOgawa
September 25, 2020
Programming
0
500
aws-sdk-go-v2入門 MediaDo.go
TakumiOgawa
September 25, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
shigeruoda
0
460
asumikan
0
280
junmikai
0
280
malvinstn
1
610
hr01
0
1.6k
thatjeffsmith
0
320
mizdra
7
4.8k
kyoheig3
0
410
chichou
1
790
hanakla
2
3k
taoshotaro
1
360
line_developers_tw
0
370
Featured
See All Featured
jmmastey
8
530
jensimmons
207
10k
garrettdimon
287
110k
chrislema
231
16k
deanohume
295
27k
moore
125
21k
tmm1
61
8.3k
dougneiner
119
7.8k
paulrobertlloyd
71
3.6k
bkeepers
321
53k
phodgson
87
3.9k
erikaheidi
13
4.2k
Transcript
aws-sdk-go-v2入門 MediaDo.go#2 2020.09.25
株式会社メディアドゥ所属 - バックエンド、インフラエンジニア Name : Takumi Ogawa Twitter: @_ogady_
1. aws-sdk-goとは 2. aws-sdk-go-v2とは 3. aws-sdk-goとの違い 4. aws-sdk-go-v2を使ってみる 5. 最後に
aws-sdk-go、 使ってますか? Q
1 aws-sdk-goとは
aws-sdk-goとは • おなじみGo言語用のAWS SDK • 認証・リクエストの再試行・エラー処理など、低レイ ヤーの処理をよしなにラッピングしてくれる • goroutineを使用したS3との大容量ファイル受け渡しな どのAWS連携が簡単にできる
2 aws-sdk-go-v2とは
aws-sdk-go-v2とは • 現行提供されているaws-sdk-goの後継 • パフォーマンス・一貫性・使いやすさなどを改善 • 2017年12月22日より開発者プレビュー版がリリース →2020年9月25日現在も開発者プレビュー版のみの提供
3 aws-sdk-goとの違い
• sessionではなくexternalパッケージを使用する • 現行のsessionパッケージとcredentialパッケージの機能 がv2ではexternalパッケージに集約され、わかりやすく なっている • クライアントはaws.Configのみを使用して生成する。 →従来のaws.Configを生成してsession.New()する手順か ら、よりシンプルになった
・サービスクライアント生成方法の違い aws-sdk-goとの違い
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) ※上記はおおむね同じ挙動
• Send()メソッドを使用し、リクエストを送信する • APIインプット構造体をRequest()に渡すのは現行と同じ • APIコール形式が各サービスで統一されているため、わ かりやすくなった →各API要求メソッドはサフィックスに”Request”がつ いている、Send()メソッドでAPIコールする、など ・APIリクエスト発行の違い
aws-sdk-goとの違い
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())
• APIインプット構造体のフィールドに型指定された列挙 値を使用する →この変更により、文字列を直接使用することがなくな り、より型安全に使用できる • 列挙値を使用する際に、APIインプットのフィールドを ポインタ型にする必要がなくなった aws-sdk-goとの違い ・APIインプット構造体に型指定された列挙値を提供
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インプット構造体に型指定された列挙値を提供(内部実装比較)
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, }
• APIインプット構造体のフィールドでスライス要素と マップ要素を値型からポインタ型に変換する必要がなく なった ・APIスライス、マップ要素指定の違い aws-sdk-goとの違い
aws-sdk-go type AddPermissionInput struct { _ struct{} AWSAccountIds []*string //
一部省略 } aws-sdk-go-v2 aws-sdk-goとの違い ・APIスライス、マップ要素指定の違い(内部実装比較) type AddPermissionInput struct { _ struct{} AWSAccountIds []string // 一部省略 }
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スライス、マップ要素指定の違い
4 aws-sdk-go-v2を 使ってみる
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の認証情報を 使用するパターン 認証設定ファイルの 任意の認証情報を使 用するパターン 認証情報を直接指定 するパターン
・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を渡す リクエストを送信する
・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を渡す リクエストを送信する
5 最後に
• 確実にわかりやすくなってる(と思う) • 内部実装も綺麗になったので、困った時に調査しやすい • とはいえ開発者プレビュー版なので計画的にご利用くだ さい… 最後に
良きaws with goライフを! contact me at @_ogady_ Thanks ! !