こんにちは。エンジニアリンググループでSREチームの寺岡(@yteraoka)です。前回の US 出張レポート記事 の続きです。
私は MDLinx の現行サーバーを Linux の Container (Docker) で実行できるようにするということを担当しました。
本番環境用のセットアップよりもまず、ローカルで開発や検証ができるように docker-compose を使って必要なもの一式が揃うということを目指しました。
現行サーバーは Windows 上で ColdFusion という歴史あるアプリケーションサーバーで稼働する構成でした。以前から名前だけは聞いていたけれども ColdFusion とは何ぞや?という状況からのスタートでした (JVM上で動作する PHP/FI or PHP3.0 みたいなやつでした)。が、幸い CommandBox *1 という便利なツールがあり、その提供元が Docker Image も公開しているとのことでしたので、それを使って既存アプリが動作するように調整しました。また、Web サーバーとしての IIS と同居しており、こちらで行っている URL Rewrite や Redirect を nginx へ移す作業も行いました。
ColdFusion アプリの Docker 化
前述の通り、ortussolutions/commandbox を元にした docker image を作成しました。ColdFusion には Lucee *2 という OpenSource の互換 Engine が存在するようで CommandBox を使えば Adobe11, 2016, 2018 と Lucee 4, 5 から選択して実行できます、便利!! (2016以降であれば Adobe も Docker Image を公開してくれてました *3 )。CommandBox 版には box コマンドで簡単にインストール可能な cfengine *4 というツールがあり、設定を JSON で管理することができます。元々存在した開発環境セットアップドキュメントにはサーバー起動後に管理画面から Datasource やら SMTP サーバーなどの設定が必要でしたが、コンテナ起動の度にこれは行いたくありませんでしたので JSON で管理することにしました。Datasource などは当然開発環境と本番環境では値が異なりますので Entrykit *5 を使って環境変数から埋めるようにしました。
CommandBox ではアプリケーションサーバー起動に関する設定も box server start コマンドの引数以外に JSON (server.json) *6 で指定可能でしたので、こちらも Entrykit を使って環境依存の値については環境変数から埋めるようにしました。
SMTP サーバーも開発環境ではわざわざメールソフトで確認することもなかろうと Mailhog *7 を使うようにしました。
DB サーバーもコンテナとして起動させたいところですが、こちらは既存の開発用サーバーを使うことになりました。
と、振り返って書いてしまえば一般的なコンテナ化手順ですね。ColdFusion も CommandBox も初見でしたのでスクリプトを追いかけて起動の流れを確認したり、JSON の階層を読み間違えてハマったりしてました...
IIS から nginx への切り替え
運良く ColdFusion では Windows にまつわる作業は発生しませんでしたが、IIS はそうはいきません、リモートデスクトップでアクセスしてポチポチしながら Rewrite / Redirect ルールを読み出しました(沢山ある)。しかし、なぜかそれだけでは機能しないページがあり、私にはもうお手上げでした。が、現地のエンジニアは当然ながら知っていました。サーバー設定だけでなく Apache の .htaccess のように web.config という XML ファイルでも定義できるのですね。アプリのリポジトリ内にありました。これも nginx の rewrite (とか if とか location) に書き換えて完成です。
FusionReactor
さて、コンテナ化だけでは時間が余ってしまいました。プロファイラーがあると現状を可視化できたりして便利だねとなり FusionReactor *8 という APM (Application Performance Monitoring) があるという情報を得ました。これも今回のコンテナで使えるようにすれば便利じゃないかとごにょごにょやってたら実は CommandBox はこれにも対応していたのです *9 楽ちん。
コンテナ環境で使う場合はライセンスの扱いに注意が必要だったのですが、トライアル申し込んだらすぐに「何かあったら連絡してね」というメールが届いていたので連絡して解決策を聞いたり使えなくなってしまったライセンスを使えるようにしてもらったりして助かりました (いつもは鬱陶しく感じてるこの手のメールですが大変役に立ちました)。
FusionReactor はなかなか便利で、処理する HTTP のリクエストごとに DB へのクエリが、SQL文も処理時間も呼び出し元コードも確認できますし、他のサーバーへの HTTP リクエストもかかった時間が確認できます。これで得られた情報から改善点を見つけて PullRequest を出したり Issue を立てたりして帰国しました。
FusionReactor は デモサイト で触ってみることができます。
ニューヨーク生活
私、結構な歳ですが初の海外でひとりでニューヨーク行って来いって事でしたから全てが初めてなのでわくわくドキドキでした。 古い建物の町並みは趣があって良いですね(大きな石の建物はどうやって作ったんだろうかと気になってしかたありません)。古い建物を使い続けているということもあってか、夜は大きな窓でお店の照明が街を照らす感じはなくて、通りによってはほぼ真っ暗という状況、土日に外出して昼間の状況を知るまでは非常に怖かったです。そもそも夜開いてるお店がほとんどない。
英語については日常会話は速すぎて全然聞き取れませんでした、雰囲気で過ごしてきました😅。買い物においてもしばらくした後に「あぁ、そういうことを言っていたのか」と思ったり。個人的に「マット竹内の1日5分ビジネス英語 *10」っていうポッドキャストを面白いなと思って聞いているのですが、こんなゆっくりアナウンサー口調でしゃべる人はリアルワールドには存在しませんでした😭
時差ボケで胃腸も不調だったのか和食が恋しくなって探しました
旅行の土産話的なものをここに書いていたらキリがないですね。とにかくシャワートイレが普及して欲しい
We're Hiring!!
M3 USA での現地採用 ( Job Description ) もありますし、日本でも SRE をはじめ、さまざまなポジションの募集をしております。 SRE チームでは最近「The Site Reliability Workbook」の輪読会を行っています。「入門 監視」の感想を話し合う会というのも予定されています。
ご興味のある方は下記採用サイトをご覧いただき、ページ下部のフォームよりお気軽にお問い合わせ下さい。
注釈
*1:https://www.ortussolutions.com/products/commandbox
*3:https://bintray.com/eaps/coldfusion
*4:https://cfconfig.ortusbooks.com/
*5:https://github.com/progrium/entrykit
*6:https://commandbox.ortusbooks.com/embedded-server/server.json
*7:https://hub.docker.com/r/mailhog/mailhog/
*8:https://www.fusion-reactor.com/
*9:https://commandbox.ortusbooks.com/embedded-server/fusionreactor