Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
スタブサーバ自動生成ツール 〜負荷試験をもっと楽に〜
Search
teru0x1
December 13, 2022
Technology
2.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スタブサーバ自動生成ツール 〜負荷試験をもっと楽に〜
DMM.go #5
https://www.youtube.com/watch?v=EZyKip6dmMs
teru0x1
December 13, 2022
More Decks by teru0x1
See All by teru0x1
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
2.1k
開発効率と信頼性を両立する Ubieのプラットフォームエンジニアリング
teru0x1
0
740
マルチクラスタの認知負荷に立ち向かう! Ubieのプラットフォームエンジニアリング
teru0x1
4
5.1k
ブラウザの外側でWasmを使おう
teru0x1
0
410
バッチシステムをクラウドネイティブにするために考えたこと
teru0x1
17
8.7k
クラウド環境をFargateに 移行して得た知見
teru0x1
0
1.7k
Goと定数 DMM.go #3
teru0x1
0
2.9k
はてなインターン2020成果発表
teru0x1
0
1.2k
入門QUIC
teru0x1
0
630
Other Decks in Technology
See All in Technology
DevelopersIO2026 -バックアップは“消されないこと”が9割-
yoshida0129
0
430
E2Eってつらくないですか?E2Eの管理コストを下げる手段とその実践
akaboshinit
5
2.6k
渡米前の準備を制す!re:Invent 2026徹底準備術 / The Ultimate Preparation Guide for re:Invent 2026
yuj1osm
1
370
Jev の中身は50行で再現できる。でも本物との差はどこにあるのか
hisuzuya
0
140
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
410
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
180
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
2
660
AIで選択肢が広がった組織設計の理想と現実
konifar
15
6.7k
「社外イベント=意識高い」の壁を壊せ!元々無関心だった僕らが部内で社外イベントを民主化して15人を連れ出すまで
say_no_w
0
160
素人でもできた!AIを使った短編小説創作入門
delhi09
PRO
0
160
データマネジメント × 法務で作りあげる、 freeeの新しいデータガバナンスへの軌跡
freee
PRO
2
530
Vue で書く 空間コンピューティング、TresJS と WebXR を使ったXR デバイスのフロントエンド開発
hiranuma
0
120
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
490
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
New Earth Scene 8
popppiees
4
2.7k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Believing is Seeing
oripsolob
1
250
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Music & Morning Musume
bryan
48
7.5k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Transcript
© DMM © DMM スタブサーバ自動生成ツール 〜負荷試験をもっと楽に〜 DMM.go #5
© DMM 2 小野 輝也 合同会社DMM.com SRE 2021年新卒入社 Twitter: @teru0x1
https://cha-shu00.hatenablog.com/
今日のテーマ 負荷試験
© DMM 想定する負荷試験対象 4 • ベンチマークサーバ ◦ リクエストをたくさん投げる • 試験対象システム
(SUT: System Under Test) • 外部API ◦ 別の組織が管理してるAPI ◦ 勝手に変更できない Amazon Web Services、“Powered by AWS”ロゴ、[およびかかる資料で使用されるその他のAWS商標] は、米国その他の諸国における、Amazon.com Inc.またはその関連会社の商標です。
© DMM 想定する負荷試験対象 5 • ベンチマークサーバ ◦ リクエストをたくさん投げる • 試験対象システム
(SUT: System Under Test) • 外部API ◦ 別の組織が管理してるAPI ◦ 勝手に変更できない このまま負荷試験をするとどうなるか? → 外部APIに猛烈な負荷がかかる → 外部APIの死、課金増 などが発生
© DMM 負荷試験アーキテクチャ 6
© DMM 7 外部APIと同等の振る舞いを するサーバ →スタブサーバ 負荷試験アーキテクチャ
© DMM スタブサーバ • 外部のAPIと同等の振る舞いをするサーバ • 外部のAPI数が少なくて単純、OpenAPIなどの定義がある場合 • →普通に手作業で作ってもそこまで大変でない •
外部のAPI数が多い(10以上)、複雑、ドキュメントも充実してない場合 • 試験対象のコード(つまり外部APIに対するクライアント側)を見て実装する • →つらい • 外部APIに対するリクエスト/レスポンスをプロキシでキャプチャし、そこから生成 • →業務ではmitmproxyのキャプチャからスクリプトで生成した • https://mitmproxy.org/ • →行き当たりばったり 8
gstbgen
© DMM 10 gstbgen := “go stub server generator” スタブサーバのGoコードをいい感じに生成
負荷試験の面倒な作業を大幅短縮!!! https://github.com/teru01/gstbgen で公開中
© DMM gstbgenがやること 11 • SUTと外部APIの間に挟まるプロキシとなる • SUTと外部APIとのリクエスト・レスポンスを記録する • 記録が終わると、スタブサーバのGoコードを出力する
© DMM 使い方(1/4) 12 1. 適当なサーバにgstbgenを起動し、 SUTのフォワードプロキシとして 指定する $ export
http_proxy=http://xx.xx.xx.xx:yyyy $ export https_proxy=http://xx.xx.xx.xx:yyyy
© DMM 使い方(2/4) 13 2. ベンチマークサーバで負荷試験 シナリオを負荷にならない程度に 流す gstbgenにリクエスト/レスポンス の記録が溜まり始める
© DMM 使い方(3/4) 14 3. gstbgenを終了させると、記録 したリクエスト・レスポンスから スタブサーバのコードが出力される
© DMM 使い方(4/4) 15 4. 生成されたコードでスタブサーバ を起動し、SUTで外部APIとして 使う接続先をスタブサーバに向ける あとは負荷試験するだけ
© DMM ポイント1: いい感じのコード生成 • スタブサーバを生成するのではなく、スタブサーバのGoコードを生成 する • 自由に編集できる •
記録したHTTPのフローをそのまま再現するだけでは不適切な場合も あるため • コード生成にはdave/jenniferを利用 16 If(Id("i").Op("==").Id("j")).Block( Return(Id("i")), ) if i == j { return i }
© DMM コード生成 17 GET http://external.com/foo mux.HandleFunc("/foo", func(rw http.ResponseWriter, r
*http.Request) { if r.Method == "GET" { rw.WriteHeader(200) fmt.Fprint(rw, "{\"contents\":\"hello\"}") return } }) リクエスト レスポンス 200 OK {“contents”: “hello”}
© DMM 全体のコード生成イメージ host path method query param reqbody response
host path method query param reqbody response host path method query param reqbody response host path method query param reqbody response method query param reqbody response path method query param reqbody response mux.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) { body, _ := stringify(r.Body) if r.Method == "GET" { if q, _ := stringifyUrlValues(r.URL.Query()); q == "{}" { if body == "{\"token\":\"abc\"}" { rw.WriteHeader(200) fmt.Fprint(rw, "{\"foo\":\"bar\"}") return } } } if r.Method == "POST" { if q, _ := stringifyUrlValues(r.URL.Query()); q == "{}" { if body == "{\"token\":\"abc\"}" { rw.WriteHeader(200) fmt.Fprint(rw, "{\"foo\":\"bar\"}") return } } } }) mux.HandleFunc("/hoge", func(rw http.ResponseWriter, r *http.Request) { body, _ := stringify(r.Body) if r.Method == "GET" { if q, _ := stringifyUrlValues(r.URL.Query()); q == "{}" { if body == "{\"token\":\"abc\"}" { rw.WriteHeader(200) fmt.Fprint(rw, "{\"foo\":\"bar\"}") return } } } }) 溜まっていく 深さ優先でツリーを巡回して生成
© DMM ポイント2: HTTPS対応 • 普通、プロキシでHTTPS通信の中身は取得できない • 通信はE2Eで暗号化されている • 暗号化された通信内容は取得できる
• どうするか: サーバー証明書を偽造する • TLSをgstbgenで終端させて、SUTには偽の証明書を返す • 偽の証明書をSUTが信頼すれば良い • gstbgen側に持たせたCA証明書を信頼させる 19
© DMM 20 1 2 3 4 5
© DMM その他話してないこと • コマンドラインツール製作にはurfave/cli/v2を使用 • 引数の処理、自動help生成などが便利 • プロキシのベースとしてはelazarl/goproxyを使用 •
TLS、 証明書周りは標準ライブラリに入っている • crypto/tlsやcrypto/x509など • GoではOpenSSLに依存せず、自前実装している • そのためGoのスクリプトだけで鍵ペアを生成できる 21
© DMM おわりに • 負荷試験をはじめとするシステムの解析に使えるツールをGoで作成 • Google SREのプラクティス: 50%ルール •
業務時間の50%はソフトウェアエンジニアリングに使おう • パワーではなくてツールで解決することも重要 22
© DMM We are hiring! 大規模なサービスや新事業の立ち上げなど規模の大小、ジャンル・フェーズ が存在するDMM.comでSREを実践してみませんか? https://dmm-corp.com/recruit/engineer/8/
Thank You !