環境
- AWS ElasticBeanstalk + Ruby 2.2 Puma
- Rails 4.2.5
背景
AWSのElasticBeanstalkでRailsアプリを動かしており、サイトマップの更新をCronで定期的にできるようにしたいと思います。が、普通に設定してみたら、__bundle
やrake
__コマンドがうまく動かなくてハマってしまったので、残しておこうと思います。
Cron設定
/etc/cron.d
内のファイルが自動的に読み込まれてCronとして動作します。
ファイル名は何でもいいようなので、適当にsitemapとして、/etc/cron.d以下にファイルを設置します。
/etc/cron.d/sitemap
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
0 20 * * * root /var/script/sitemap.sh
次に、呼び出されるshファイルを設置しますが、普通にやるとうまく行きません。 bundle command not found
, __rake command not found
__等のエラーが発生します。パスが正しく通ってなさそうなので、色々パスをいじりましたが、rakeだけはうまく行きませんでした。
そこで、以下のようにして、ElasticBeanstalkの環境を引き継いてあげると、うまく行きます。
/var/script/sitemap.sh
# !/usr/bin/env bash
set -xe
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_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
. $EB_SUPPORT_DIR/envvars
. $EB_SCRIPT_DIR/use-app-ruby.sh
cd /var/app/current
RAILS_ENV=production bundle exec rake sitemap:refresh
あとはこれらの設定を.ebextensionsに書いてあげればOKです。
参考にしてみてください。