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
nashiox
December 11, 2017
Programming
13
6.3k
闇のBashをGoに置き換える技術 / golang.tokyo #11
golang.tokyo #11 の発表資料です。
nashiox
December 11, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
160
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.2k
チームリードになって変わったこと
isaka1022
0
200
Ruby on cygwin 2025-02
fd0
0
140
Introduction to kotlinx.rpc
arawn
0
690
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.6k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
9
1.8k
iOSエンジニアから始める visionOS アプリ開発
nao_randd
3
130
ファインディの テックブログ爆誕までの軌跡
starfish719
2
1.1k
Formの複雑さに立ち向かう
bmthd
1
840
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
110
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Code Reviewing Like a Champion
maltzj
521
39k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
Practical Orchestrator
shlominoach
186
10k
Bash Introduction
62gerente
611
210k
Scaling GitHub
holman
459
140k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Building Applications with DynamoDB
mza
93
6.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
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化もした - メンテナンス出来るって素晴らしい - 動き続けてても放置はダメ - 先々を考えた技術選定も大切