Cloud Run/GKE上でhonchoを使う

こんにちは、AIチームの杉山です。
今回はhonchoというProcfile形式でアプリケーションの管理や実行を行うツールを、GKE/Cloud Run上で実行する際にログ周りでハマった点があったので、honchoの簡単な紹介とその解決方法について紹介します。

honcho

honchoはRubyのgemであるForemanのPython実装です。

あるWebサービスが複数のプロセス群からなる場合など、サービスのデプロイにおいて複数プロセスを管理したいケースがあると思います。
一番ナイーブな方法では、それら複数のプロセスを手動で立ち上げることが考えられますが、毎回やるのは大変ですしヒューマンエラーの入り込む可能性があります。
また起動コマンドのオプションが変更になるなどした場合に属人化により一部の開発者しかデプロイができなくなるなどDevOps的な観点から好ましくありません。
そのような場合にForemanではプロセスの名前と起動コマンドをProcfileに記述することでデプロイがコードで管理できるようなり、Foremanのコマンドからそれらのプロセスを立ち上げることができます。

機械学習系技術を用いたサービスはPythonで実装されていることが多いですがそのような場合にForemanのPython実装であるhonchoを使用することで、追加でRubyなどをインストールすることなくその恩恵を受けることができます。

Procfile

ProcfileはHerokuへのRailsアプリケーションのデプロイでおなじみの方もおられるかと思いますが、Foremanやhonchoでも使用される設定ファイルの形式です。Dockerfileのように拡張子はなくProcfileというファイルを作成します。
Procfileでは、次のフォーマットで設定を記述します。

<process_name1>: <command1>
<process_name2>: <command2>
︙

プロセス名は以降のコマンドが実行する設定をわかりやすく表す名前をつけておきましょう。
Pythonでは、例えば以下のような記述になります。

app: uvicorn --host 0.0.0.0 --port ${PORT} app:app
web: python server.py
redis: redis-server
︙

実行の際は

honcho start

のみでProcfileに記述したプロセスを一度に起動することができますし、特定のプロセスのみ実行したい場合は

honcho start <process_name>

とすればOKです。

honcho on Cloud Run/GKE

Cloud RunやGKEでhonchoを使おうとすると、Dockerfileに例えば以下のような記述をしてデプロイすることになります。

CMD honcho -f Procfile start app

実際に上記の設定でデプロイするとappは正常に起動され動作するのですが、Cloud Loggingへのログがseverityで出し分けされないという問題が発生しました。

こちらの記事でも同様の問題が発生していたのですが、こちらは修正済でしたがhonchoを使用したタイミングで再度発生したため別の原因のようです。

honchoには --no-colour --no-prefix というオプションがあり、そちらで解決できそうだったのですが以下のように通常オプションが指定される位置に設定しても問題は解決されないままでした。

CMD honcho -f Procfile --no-colour --no-prefix start app

この件について調べているとこちらのプルリクに該当しそうな記述を見つけ、オプションの位置を正しく指定しないと別の値に上書きされてしまう問題があることが判明し、以下のように修正することで解決され、severityに応じてログが正しく区別されるようになりました。

CMD honcho -f Procfile start app --no-colour --no-prefix

honchoの日本語記事はあまり見られないため同様の問題にハマる方は少ないかもしれませんが、この記事がどなたかの役に立てば幸いです。

参考

https://devcenter.heroku.com/articles/procfile

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/platforms-linux-extend.html