AWS Elastic Beanstalk環境でLaravelバッチを定期実行する

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


--------------------------
システム開発のご要望・ご相談はこちらから

2件のコメント

  1. 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
    を追加すると正しく動作しているようです。

    もしお手すきであれば教えていただけると嬉しいです。

    1. カサレアルの大友と申します。

      こちらで追加しても、crontab -lでscheduleが確認できないです。

      上記の現象について、こちらでは同様の現象が発生していないため確かなことは言えませんが、
      記事に載せているconfigファイル と コメントで頂いたconfigファイルで
      異なる点があるとすればCronエントリの作成の仕方くらいではないかと思います。

      ・記事:「/tmp/laravel-batch」に一旦作成してから「/etc/cron.d/」にコピー
      ・コメント:「/etc/cron.d/」に直接作成

      こちらが直接の原因かはなんとも言えないところですが、ご参考になれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です