LoginSignup
4
1

More than 5 years have passed since last update.

AWS Elastic Beanstalkでmonit監視するための注意点

Last updated at Posted at 2017-05-18

最近、インフラのお仕事をしています

Ruby on railsのアプリケーションでよしなにキューを使いたいという用件があり、shoryukenを使っておりました
sidekiqでいいんじゃね、というツッコミはなしにして、インフラ担当の自分はデプロイ時下記の要件を満たすインフラを作る必要がありました

  • shoryukenのジョブが立ち上がっていなかったら立ち上げる
  • shoryukenのジョブが落ちたら復旧する

元々Elastic Beanstalkで構成していたのですが、上記の用件を満たすために .ebextensions で実現しようとしましたがなかなかハマったのでメモを残しておきます

shoryukenを立ち上げるために

shoryukenを立ち上げるために下記のファイルを配置しました

 .ebextensions/shoryuken.config
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管理下におく

 .ebextensions/monit.config
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を使っていると遭遇する問題かと思いますので、何かの参考になりましたら幸いです

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1