Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
aws-sdk-go-v2入門 MediaDo.go
Search
ogady
September 25, 2020
Programming
2.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
aws-sdk-go-v2入門 MediaDo.go
ogady
September 25, 2020
More Decks by ogady
See All by ogady
大規模サービスにおける カスケード障害
takumiogawa
3
1.3k
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
7
2.8k
[JAWS DAYS 2022 - Satellites]PairsにおけるEKSセキュリティの取り組み
takumiogawa
2
3.5k
PairsにおけるSLI/SLO再定義
takumiogawa
7
7.2k
Other Decks in Programming
See All in Programming
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
230
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
680
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
210
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
450
関数型プログラミングのメリットって何だろう?
wanko_it
0
200
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
16k
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
180
[RVD26] Vibe Architecture en 2040 : Darwin a-t-il (enfin) eu raison des architectes ?
alexandretouret
0
100
5分で問診!Composer セキュリティ健康診断
codmoninc
0
630
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
730
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Balancing Empowerment & Direction
lara
6
1.2k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
We Are The Robots
honzajavorek
0
280
Believing is Seeing
oripsolob
1
170
Speed Design
sergeychernyshev
33
1.9k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
340
The browser strikes back
jonoalderson
0
1.4k
The agentic SEO stack - context over prompts
schlessera
0
850
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
600
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
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 ! !