TL;DR
- GitHub ActionsでのDocker ARM64ビルド(QEMU)が激遅だった
- ビルド処理だけAWS CodeBuildに任せた
- 30分かかっていたビルドが5分に短縮された
- 月1ドル程度で、ビルド待ちのストレスが解消された
はじめに
個人プロジェクトのWebアプリをなるべく安く運用したくて、EC2のt4g.smallを採用しました。
コスパは抜群なのですが、いざCI/CDを組んでみると大問題が。フロントとAPI、それぞれのビルドに15分ずつかかり、合計30分も待たされるようになったのです。
ひよっこエンジニアである私は、APIの接続先URLミスや環境変数の入れ忘れなど、実際にデプロイして初めて気づく凡ミスが頻発します。GitHub Actionsは無料で使えて本当にありがたいのですが、たった1行の修正を反映するために30分も待ち続けるのは、無料というメリットを打ち消すほどの大きなストレスでした。
なぜ30分もかかっていたのか?
当時の構成はこうでした。
- デプロイ先:ARM(t4g.small)
- CI:GitHub Actions(プライベートリポジトリ)
- 作りたいもの:ARM64向けDockerイメージ
ところが、プライベートリポジトリの標準ランナーは基本x64です。
そのためARM64イメージを作るには、QEMUというエミュレーションを通す必要がありました。
ARM64の命令をx64で逐次変換しながら動かすので、ビルド処理が激遅になっていました。これは例えるなら、辞書を引きながら慣れない外国語で仕事をするような状態です。
※公開リポジトリやEnterpriseプランならARMランナーも利用可能だそうです
ビルドをARMネイティブな環境に任せる
ARMのビルドなら、最初からARMのマシンでやればいいじゃないか?
ということで、ビルド作業だけAWS CodeBuildに任せました。
CodeBuildはARM系の実行環境を選べるので、エミュレーションなしの爆速ビルドが可能です。
結果、ビルド時間が30分から5分まで短縮しました。
1ドルで25時間を買った計算
一番の懸念だった追加コストですが、計算してみると驚くほど安上がりでした。
私が1ヶ月にかかったCodeBuildのコストは約1ドル。CodeBuildは実行時間の従量課金で、私の環境の単価が約$0.005/分、無料枠が100分/月あります。
そこから逆算すると
1ドル / 0.005 = 200分、に無料枠の100分で合計300分のビルド時間。
1回のビルドが約5分なので、1ヶ月でおよそ300分 / 5分 = 60回ビルドしていた計算になります。
もしQEMUのままだったとしたら、
60回 × 30分 = 1800分、約30時間もビルド時間に費やしていたことになります。
つまり今回の構成にしたことで、
(30分 − 5分)× 60回 = 1500分、約25時間分の待ち時間を削減できたことになります。
たった1ドルでこのストレスが消えるなら、私にとっては十分すぎる投資でした。
おわりに
CI/CDといえばGitHub Actionsくらい、という知識しかなかったので、今回CodeBuildというサービスを知れたこと自体が、私にとって大きな学びになりました。