LIVESENSE ENGINEER BLOG

リブセンスエンジニアの活動や注目していることを発信しています

マッハバイトの開発環境の負債を返済した

はじめに

Livesense Advent Calendar 2021の9日目を担当するマッハバイトのバックエンドを主に担当している @ayumu838 です。

リブセンスでは技術投資10%ルールがあり業務時間の10%ほどを業務以外のことに充てることができます。
時間の使い方は人によってさまざまで、普段業務で使わないフレームワークや言語を学んだり、ブログやOSSで外部発信するなどに使っています。
その中で自分は現在の技術的負債で普段の業務では困ってはいるがそこまで大きな問題とはなりにくい部分を返済しています。

前置きが長くなりましたが、今回の内容としてはタイトル通り開発環境の構築で負債になっていた部分を(一部)返済したことになります。

マッハバイトの開発環境について

マッハバイトは、名前を変える前のジョブセンス時代から合わせて15年ほど経っているプロダクトです。
アーキテクチャリニューアルを実施し、現在はPHPとRubyが入り混じった構造になっています。

サービス開始当初からPHPを使い、そこからアーキテクチャリニューアルとしてRuby on Rails(RoR)に移行しています。
現在では外部に公開している部分は全てRoRに移行が終わっていますが、社内向けの古い管理画面などはまだPHPのままです。

社内向け管理画面と外部に公開している画面がもともと一つのリポジトリで管理されていたことと、現在も同一なドメインで運用されています。
開発環境では、当初から使用されているPHP側の振り分け機能に依存する形になっています。
振り分け機能はApacheのmod_rewriteを使用しています。

イメージ的には以下の図のような感じです。

PHP側とルーティング用のApacheはVagrant+VirtualBoxでVMを構築しています。
その際ホスト側にあるPHPとApacheをnfsを使いマウントしています。
しかし、このnfsをマウントするときにOSのバージョンアップやセキュリティソフトなどの関係でハマりどころが多く初期構築の際に時間がかかっていました。

  • ハマりどころが一人一人違く、長い人では一週間ぐらいかかることもあったので、環境構築を素早くしたい
  • Vagrantの機嫌次第では、充電しながらでもバッテリーが減るので辛い
  • 業務ではあまりないdockerの環境を一から構築するということを経験したい

以上の3点から技術投資の時間を使い、この部分をdocker移行したのが今回の話になります。

※実際にはdocker単体ではなく、docker-composeでですが

どのようにしたのか

構築方針

  • 開発環境全部をdocker化せずに、まずはVagrantを置き換える
  • 開発している人が主にintel Macを使っているので、intel Macを前提にする
    • とはいえ、できるだけ他のOSでもできるようにする

実際に構築してハマったとところ

dockerに構築したApache側のルーティング振り分け機能でどのようにホスト側に割り振るか

extra_hostsにホストのIPアドレスを入れれば良いのですが、それではIPアドレスが変わるたびに置き換える必要があるので、非常にめんどくさいです。

そこでドキュメントを漁っていたところ、Docker Desktop for Macでは host.docker.internal という便利なDNSが内部的に用意されているのでそちらを使うようにしました。
ref. Networking features in Docker Desktop for Mac

こちらは、docker内部からみたホストのIPアドレスになります。
こちらはLinux版のdockerでは使えないようなので、Linux向けの人のために環境変数で変更できるようにしています。

HOST_SERVER_IP=host.docker.internal
 cat temp_hosts | sed \
  -e "s#RAILS_SERVER_IP#$HOST_SERVER_IP#g" \
  >> /etc/hosts

とシステムの動作に必要なhostsが記載されているtemp_hostsを/etc/hostsに入れる処理の部分を少し置き換える形にしました。

PowerDNSのホストをどう引くか

弊社では外部に公開しない組織内のみで使う開発用DBなどはPowerDNSを用いてDNSレコードに登録されています。
docker内部から、こちらで登録されているDNSの名前解決ができないため一工夫する必要があります。

PowerDNS向けの内製clientツールがあるので、その機能を使いホスト側で必要サーバーのIPアドレスを取得して起動時に入れ込もうかと思いましたが、こちらはインストールしている人がいなかったりするため、別の方法にしようと決めました。
結果的に二つのサーバーのIPさえわかればよかったので、少ないなら直接環境変数に入れる方に倒しました。

以下のように環境変数にいれ、それをdockerの環境変数として持たせ、hostsに加えるという形です。

POWERDNS_IP1=192.168.0.1
POWERDNS_IP2=192.168.0.2
environment:
  - "POWERDNS_IP1=${POWERDNS_IP1}"
  - "POWERDNS_IP2=${POWERDNS_IP2}"
echo $POWERDNS_IP1 >> /etc/hosts
echo $POWERDNS_IP2 >> /etc/hosts

docker移行後

Vagrantの機嫌次第では、充電しながらでもバッテリーが減るという現象がなくなりました。
常に充電量 > 消費量となっているので仕事が快適になっています。

また、ハマりどころも少なくなったため初期構築の手間も減りました。
2021年12月09日現在では、M1 MacではVirtualBoxのサポートがされていない、かつ現行で発売中のMBPはM1のみのため、今後開発環境を構築できない人が現れることを防げたと思います。
(もちろんdockerで使っているイメージがM1対応していることが前提ですが)

さいごに

技術投資でやった内容について紹介しましたが、他にもやっていることがあるのでまた紹介できたら良いなと思います。
自分は現在自作でE2Eテストツールを作って見たくて、格闘中です。
(実は今回のもそれの前段階で解消したかった箇所だったので、微妙にこの内容と関係あったりします)