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
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.6k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Agentic UI
manfredsteyer
PRO
0
160
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
750
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
5.8k
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
570
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
660
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.1k
Featured
See All Featured
The Curse of the Amulet
leimatthew05
1
13k
Between Models and Reality
mayunak
4
340
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Thoughts on Productivity
jonyablonski
76
5.2k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Test your architecture with Archunit
thirion
1
2.3k
The World Runs on Bad Software
bkeepers
PRO
72
12k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Building an army of robots
kneath
306
46k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
160
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 ! !