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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
7k
Other Decks in Programming
See All in Programming
Oxcを導入して開発体験が向上した話
yug1224
4
310
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
10
4k
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.6k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
100
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.5k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
110
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
570
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
190
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
430
Between Models and Reality
mayunak
4
340
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Tell your own story through comics
letsgokoyo
1
950
Skip the Path - Find Your Career Trail
mkilby
1
150
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Six Lessons from altMBA
skipperchong
29
4.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Producing Creativity
orderedlist
PRO
348
40k
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 ! !