最近、インフラのお仕事をしています
Ruby on railsのアプリケーションでよしなにキューを使いたいという用件があり、shoryukenを使っておりました
sidekiqでいいんじゃね、というツッコミはなしにして、インフラ担当の自分はデプロイ時下記の要件を満たすインフラを作る必要がありました
- shoryukenのジョブが立ち上がっていなかったら立ち上げる
- shoryukenのジョブが落ちたら復旧する
元々Elastic Beanstalkで構成していたのですが、上記の用件を満たすために .ebextensions
で実現しようとしましたがなかなかハマったのでメモを残しておきます
shoryukenを立ち上げるために
shoryukenを立ち上げるために下記のファイルを配置しました
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_shoryuken":
mode: "000777"
content: |
. /opt/elasticbeanstalk/support/envvars
. /opt/elasticbeanstalk/support/scripts/use-app-ruby.sh
# undefined $HOME when execute this script, so abort `bundle exec shoryuken`
HOME=/root; export HOME
mkdir -p /var/app/support/pids
mkdir -p /var/app/support/logs
cd /var/app/current
if [ -f /var/app/support/pids/shoryuken.pid ] && \
ps aux | grep `cat /var/app/support/pids/shoryuken.pid` | grep 'shoryuken'
then
kill -TERM `cat /var/app/support/pids/shoryuken.pid`
rm -rf /var/app/support/pids/shoryuken.pid
fi
sleep 10
bundle exec shoryuken \
-R \
-P /var/app/support/pids/shoryuken.pid \
-L /var/app/support/logs/shoryuken.log \
-d
"/opt/elasticbeanstalk/hooks/appdeploy/pre/03_mute_shoryuken":
mode: "000777"
content: |
if [ -f /var/app/support/pids/shoryuken.pid ]
then
kill -USR1 `cat /var/app/support/pids/shoryuken.pid`
fi
HOMEが定義されているのが渋いところなのですが、shoryukenを実行するコードの中にデフォルトで ~
にアクセスしているコード(ライブラリ側)があり、monitから叩かれる際には root
なので、HOMEがない状態で、タスク自体がabortしてしまいます。ちょっと他に回避策が思いつかなかったので、緊急回避的にこうなっています。
monit管理下におく
packages:
yum:
monit: []
commands:
00_copy_monit_config:
command: "cp /var/app/support/monit.d/shoryuken.conf /etc/monit.d/shoryuken.conf"
01_monit_chkconfig:
command: "/sbin/chkconfig monit on"
02_monit_restart:
command: "/sbin/service monit restart"
ignoreErrors: true
files:
"/var/app/support/monit.d/shoryuken.conf" :
mode: "000644"
owner: root
group: root
content: |
check process shoryuken-proc with pidfile /var/app/support/pids/shoryuken.pid
start program = "/usr/bin/sudo /opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_shoryuken"
stop program = "/usr/bin/sudo /bin/kill -QUIT kill -TERM `cat /var/app/support/pids/shoryuken.pid` && rm -rf /var/app/support/pids/shoryuken.pid"
注目すべきは一番最初のcommandのcopyなのですが、これは直接 /etc/monit.d/shoryuken.conf
を配置するとEBが気を利かせて過去ファイルを /etc/monit.d/shoryuken.conf.bak
を配置してしまい monit
が立ち上がらないという状態になってしまいます
これはデフォルトの monit.confが /etc/monit.d/*
のファイルすべてをIncludeしており、過去ファイルまでIncludeするとプロセス名が被ってしまうためです
回避策として /etc/monit.d/
外にファイルを一旦配置して、それをコピーすることにより
*.bak
ファイルの影響を受けないようにしました
まとめ
下記の二点の気持ち悪い機転を聞かせた対応により、shoryukenを起動しプロセス監視できるようになりました
- ダミーの環境変数定義
- confファイルの一次退避
EBを使っていると遭遇する問題かと思いますので、何かの参考になりましたら幸いです