Laravelで作成したバッチをAWS Elastic Beanstalk環境(以下、EB環境)で定期実行する手順をご紹介致します。
Laravelバッチを定期実行するには
Laravelバッチを定期実行するにはサーバ側に以下のCronエントリを追加します。
あとはアプリ側でバッチ毎にスケジュール定義していく流れとなります。
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
詳細は以下のLaravel公式サイトのドキュメントをご参照ください。
なお、今回の内容はLaravelバージョン「5.5」前提でのご紹介となります。
https://readouble.com/laravel/5.5/ja/scheduling.html
EB環境にCronエントリを追加するには
アプリケーション用zipファイル内に.ebextensionsディレクトリを作成し、そのディレクトリ内にCronエントリを追加するためのconfigファイルを作成します。
これにより、アプリケーション用zipファイルのデプロイ時にconfigファイルが読み込まれ、EB環境にCronエントリが追加されます。
今回は以下のサイトを参考にconfigファイルを作成しました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cron-job-elastic-beanstalk/
files: "/tmp/laravel-batch": mode: "000644" owner: root group: root content: | * * * * * webapp php /var/app/current/artisan schedule:run >> /dev/null 2>&1 commands: make_webapp_home: command: | mkdir -p /home/webapp chown webapp:webapp /home/webapp chmod 700 /home/webapp container_commands: set_cron: command: | cp -f /tmp/laravel-batch /etc/cron.d/ leader_only: true
上記のconfigファイルのポイントとして、「leader_only: true」を設定しています。
この記述があることで、EC2が複数台の構成であっても、バッチの実行は1台からのみになります。
設定確認
上記のconfigファイルを含めてアプリケーション用zipファイルをデプロイすると、「/etc/cron.d/」にCronエントリが追加されました。
また、Cronエントリが追加されたことでLaravelバッチが定期実行されるようになりました。
おわりに
AWS Elastic BeanstalkはAWSのよくある基本構成を手軽に構築するのに便利なサービスです。
負荷分散やオートスケーリングなども手軽に構成できます。
今回のように、基本構成から外れる部分は.ebextensionsディレクトリにconfigファイルを作成してカスタマイズしていく必要があったりしますが、カスタマイズ部分がそれほど多くなければAWS Elastic Beanstalkを活用するのも一つの手だと思います。
もしこれからAWS Elastic Beanstalkを利用したいという方は以下のサイトなどが参考になるかと思います。
https://aws.amazon.com/jp/elasticbeanstalk/
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html
Elastic Beanstalk Laravelでタスクスケジューラを動かしたいのですがebextensionからデプロイされたときに動作正しく動作してくれません。
files:
“/etc/cron.d/schedule_run”:
mode: “000644”
owner: root
group: root
content: |
* * * * * root /usr/bin/php /var/www/html/artisan schedule:run
commands:
remove_old_cron:
command: “rm -f /etc/cron.d/*.bak”
こちらで追加しても、crontab -lでscheduleが確認できないです。
tail -f /var/log/cronをみるとschedule.runが実行されております。
しかし、eb ssh からcrontab -e で
* * * * * root /usr/bin/php /var/www/html/artisan schedule:run
を追加すると正しく動作しているようです。
もしお手すきであれば教えていただけると嬉しいです。
カサレアルの大友と申します。
上記の現象について、こちらでは同様の現象が発生していないため確かなことは言えませんが、
記事に載せているconfigファイル と コメントで頂いたconfigファイルで
異なる点があるとすればCronエントリの作成の仕方くらいではないかと思います。
・記事:「/tmp/laravel-batch」に一旦作成してから「/etc/cron.d/」にコピー
・コメント:「/etc/cron.d/」に直接作成
こちらが直接の原因かはなんとも言えないところですが、ご参考になれば幸いです。