shimgo
4/13/2020 - 10:50 AM

ElastickBeanstalkでwhenever gemを使ってrakeタスクを実行しようとしたらうまくいかなかった

bundle exec whenever --update-crontabを実行して作られたcrontabは下記のような感じだった

* * * * * /bin/bash -l -c 'hoge.sh'

しかし色々出てだめだった。ログが残ってなくて下記くらいしか例がないが。
No such file or directory @ dir_s_mkdir - (Errno::ENOENT)

結局は生成されたcrontabの/bin/bashの-lオプションが悪かった。
EBでは通常webappが実行ユーザになる。しかし、/home/webappは存在しないので、 ログインシェルとしてbashを立ち上げるとホームディレクトリが無いためにコケてしまう。

結論としてはebextensionsに下記のようにcronを追加した。wheneverでも job_templateという設定で-lオプションなしのcrontabが生成できるっぽい。

files:
  "/etc/cron.d/delayed_job":
    mode: "000644"
    owner: root
    group: root
    content: |
        */5 * * * * root /usr/local/bin/check_delayed_job.sh

  "/usr/local/bin/check_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      # Loading environment data
      EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
      EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
      EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
      EB_APP_CURRENT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
      EB_APP_PIDS_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)
      # Setting up correct environment and ruby version so that bundle can load all gems
      . $EB_SUPPORT_DIR/envvars
      . $EB_SCRIPT_DIR/use-app-ruby.sh
      cd $EB_APP_CURRENT_DIR
      su -s /bin/bash -c "bundle exec rake check_delayed_job:exec" $EB_APP_USER
commands:
  remove_old_cron:
      command: "rm -f /etc/cron.d/delayed_job.bak" # バックアップを削除
  remove_old_shell:
      command: "rm -f /usr/local/bin/check_delayed_job.sh.bak" # バックアップを削除