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
闇のBashをGoに置き換える技術 / golang.tokyo #11
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
nashiox
December 11, 2017
Programming
13
6.5k
闇のBashをGoに置き換える技術 / golang.tokyo #11
golang.tokyo #11 の発表資料です。
nashiox
December 11, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 02
javiergs
PRO
1
770
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
120
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
190
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
680
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
20
6.6k
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
110
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
190
AtCoder Conference 2025
shindannin
0
1k
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
170
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
170
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
47
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
910
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
110
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
170
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.9k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
770
Ethics towards AI in product and experience design
skipperchong
2
190
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
310
How to make the Groovebox
asonas
2
1.9k
Transcript
闇のBashをGoに 置き換える技術 @nashiox 2017/12/11 golang.tokyo #11
@nashiox 水野 拓 (Taku MIZUNO) - インフラエンジニア@リブセンス - オンプレ/クラウドのサーバ構築・運用 -
Go歴 - 約3年 - 最近のGo実装 - Mackerel プラグイン - Packer プラグイン
身の回りにこんなスクリプト ありませんか?
怖くて触れないけどなぜか 動いているBashスクリプト
インフラ運用に携わるとよく見かけます - 運用で利用するシェルスクリプト - 長い間メンテナンスされてない - メンテナーがいるかすらわからない - 読み解ける人がいない -
怖くて触れないけどなぜか動いている - Ex - サーバ構築スクリプト - 便利CLI - バッチスクリプト
リブセンスにもありました
10年を超える運用で積み重なった闇 - なにがどこで行われてるかわからない - けれどなぜか動いてる - それを実行しないと仕事にならない - どこを直せば良いのかすらわからない -
作成者はすでにいない - etc…
10年を超える運用で積み重なった闇 - なにがどこで行われてるかわからない - けれどなぜか動いてる - それを実行しないと仕事にならない - どこを直せば良いのかすらわからない -
作成者はすでにいない - etc… 闇を感じていただけたでしょうか?
気合を入れて直しています
リブセンスの場合 - 積み重なった闇のBash群 - サーバ構築スクリプト - Bash -> Chef ->
Ansible と変遷 - 便利CLI - PythonやGoに置き換え - バッチスクリプト - Goに置き換え
リブセンスの場合 - 積み重なった闇のBash群 - サーバ構築スクリプト - Bash -> Chef ->
Ansible と変遷 - 便利CLI - PythonやGoに置き換え - バッチスクリプト <- 今日はここの話 - Goに置き換え
強敵のバッチスクリプト
その名も開発DB構築スクリプト
こんな動作をします
10 ファイル 2128 行におよぶ Bashスクリプト
※ 事実ではありません
読めるわけがない
スクリプトの動作 - データ加工 - 元データのリストア - 並行で加工処理 - ダンプ -
データ加工後のデータをテーブルごとに並行でダンプ - DBを一度に作れるフルダンプも生成 - インポート - フルダンプからの開発DB生成 - 日次更新が必要なテーブルを並行で部分インポート
他にはこんなことをしています - 失敗した時点から再実行するためのファイルキュー - Bashで書かれたファイルキュー実装 - それを利用したリトライ処理 - GNU parallel
を使った並行実行 - データ加工 - ダンプ - インポート
※ 事実ではありません
読めるわけがない
よしGoに置き換えよう 読めるわけがないと言ったが読むしかない
Goの選定理由 - 並行実行の実装が容易 - Goroutineを使うだけで並行処理の実装が可能 - バッチなのでGoroutineのコストを気にしなくていい - Goの言語仕様のシンプルさ -
実装も利用するのもインフラエンジニア - コードを書くことが本職ではない - 複雑な実装が出来るよりも制約されるほうがいい - go testが言語仕様に組み込まれてるのもよい - IDEが使える - 補完・コードジャンプは重要
リプレースの方針 - いきなり全部Goに置き換えない - 読み解ける範囲、置き換えやすいところから - 難しいところはos/execでのBashの実行を許容 - Goらしさよりもまずは読み解けることを優先 -
置き換え中はBashっぽくなることを許容 - 徐々にGoらしく置き換えていく
ファイルキュー実装(Bash版)
ファイルキュー実装(Go版)
並行実行実装(Bash版)
並行実行実装(Go版)
Bash実行 - パイプ・リダイレクトに対応するためbash -cを使用
Bash実行(ログつき)
最近ハマった - io.MultiReader() は複数Readerの”連結” - stdoutとstderrを時系列順でログに吐きたかった - “連結”なのでstdoutがcloseされてからstderrを書く - stdoutがほとんど出ないコマンドを実行していた
- 実行後30分ほどたってドバっとログが吐かれた
初回リプレースから約9ヶ月 - 動作は順調 - 問題なく動いています - 開発・リプレースも順調 - 現在 v0.0.8
- 読める・手を入れやすくなったため、変更が容易 - 外部コマンドに頼っていた部分もリプレース開始 - ダンプ・インポート部分(mysqldump) - Pure Goで実装してOSSとして出すつもり - (今日に実装間に合わなかった)
まとめ - 闇のBashをGoに置き換えたのは良い選択だった - 読みやすい・書きやすいことは大事 - 無理に全部置き換えようとしないのはもっと大事 - Goroutineのパワーすごい -
1バイナリになるので管理も楽 - 最近自前RPM化もした - メンテナンス出来るって素晴らしい - 動き続けてても放置はダメ - 先々を考えた技術選定も大切