レガシーサービスでもそれなりに面白いことはある

はじめに

@cosmeのBtoBサービスを開発・マネージメントしてる北原です。

@cosmeは美容系のメディアだけでなくビジネス側のサービスもあり
ブランド、小売など連携させるサービス開発を担当しております。

この記事は アイスタイル Advent Calendar 2019 4日目の記事です。

okashitay先生のあとに感想文で恐縮ですが、今年引き継いだレガシーシステムを調査しながらDockerで構築した話を書きたいと思います。

どこの会社でも多かれ少なかれレガシーになってしまったものはあるかと思います。
「古いシステム引き継いでテンション下がるわー」
って人がちょっとだけ前向きになってもらえると書いた甲斐があります。

モチベーション

引き継いだサービスですが社内管理画面で商品や顧客管理を行っています。
どの程度古いかと言うと。

  • 8年くらい運用されている
  • マイナーなオープンソースCMSをカスタマイズ
  • ライブラリの管理はなく、その時のもので稼働
  • ジョインしたサービスだったりもするので作った人などいない状態
  • 前任者が3年くらい前にサーバー移設を実施

まるっと8年熟成ではないのですが、当時のパッケージのコードや担当者によって変わる設計、実装などが積み重なって、このまま運用していても崩壊する日もそう遠くない感じでした。

ただ運用するだけだと嫌になっちゃうので何かないかなぁと思ってたところ
次の案件でコンテナベースの設計にしたいと思ってたこともあり、このサービスもdockerで動かしてみようと思いました。

古い環境のサービスでもdocker化すると良いことが多い。
(いろんな記事に書いてあるとおりです)

  • インフラ構築のコード化
    使っていないことがコードによって可視化できる
  • ミドルウェア類の設定ファイルの管理
    サーバー直修正がなくなる&コード化されていると調査系で見落としが減る
  • 可用性、可搬性UP
    管理系で複雑風なシステムなので、延命されてもちょっとだけ安心
  • サーバーセキュリティー
    社内の管理画面だとしても古いサーバーで維持し続けるのは良くない

チームとしてもdockerを開発では利用しているものの、運用を意識したものではなかったので
これを期にコンテナ運用を想定して作ってみようということとなりました。

なによりもサービスを調べることへの目的ができモチベーションがあがる!
どうせ動作検証もするので、バージョン上げられるやつは上げちゃおう。

調査&構築

PHP & apacheなので、それっぽいイメージ選べば動きそうな気もしますが
ひとまずどんなプロセスが動いているか調査してみました。

  • ps, lsof, netstat, rpm, chkconfig などのコマンドで何が動いているかを確認
  • アプリケーション、ミドルウェア周りは crontab, php 関連, httpd 関連の設定を確認
  • /var/log 配下のログファイル類の確認

php、apache、cron、メール(MTA)、memcached、couchbase
バッチ処理もrsyncでファイルを同期しているくらいのようでした。
アプリ系以外だと社内サーバー共通の監視やログ転送、ログローテなどがありました。

動いてないもの、使ってないものの確認はやっぱり大変なので
コンテナになにがインストールされているかわかるようになるだけでも安心。

こんなところで調査完了!

Dockerfile のベストプラクティスは公式に沿った形で作ってみました。
オンプレサーバーだと色んなものを詰め込んでいるので、それぞれ責務を切り離して
そのコンテナじゃないとダメなもの以外はコンテナから切り離してイメージを選定しました。

大きくギャップがあったのが apache でした。
apache が色々出来ちゃうこともあり、環境毎の設定差異が多かったです。
一つのイメージでリリースまで動かしたかったのでネットワークの制御はネットワーク側に、ミドル類の接続先の変更などはプログラム側で制御するようしました。
(ネットワークの制御はその設計で検討しています)

あとは個人の開発環境はデバッグツールや、ローカルからつながらないmemcachedとかは docker-compose.yml で追加するようにしてみました。

やってみて

軽いイメージにしたかったが最終的には600MB程度でした。
サービスの性質からスケールするようなものではなく、運用上停止できるので今回はそこまで削らなくてもいいのかなと思いました。

画像ファイルの処理でCPUの負荷が高くなることがあるので、画像をCDNに移すことでCPU負荷も容量も減らせたり、フロント側も古くモノリシックなので管理画面からのデータ取得をAPIにしてスケールできるようにしていきたいなど次やってみたいことも出てきたりしました。

コードがつらみなのは変わらないですが、動かしている実感は湧くようになりました。
あと、単純にライブラリやモジュールを調べながら構築していくのがパズルみたいで楽しかったです。

さいごに

引き継ぎってテンション上がるものではないですね。
せっかくやるなら、ボーイスカウトルールで「来た時よりも美しく」
(ボーイスカウトやってなかったけど)

後世のひとに引き継ぐときに口伝ではなく、指差し確認で引き継げるとハッピーです。
チームで勉強会しながら進められたのでちょうどいい題材でした。

BID部では開発メンバー・テックリードポジションを募集しています。
@cosmeの BtoB サービス開発に興味のある方、採用ページにてお待ちしております。
あとBID部1グループでは出戻り歓迎中!!!