LoginSignup
1
0

More than 3 years have passed since last update.

ElasticBeanstalkのWorkerサーバーでLaravelのスケジューラを実行する

Posted at

ElasticBeankTalk及び、Workerサーバー、またLaravelについての説明はしないので知らない人は対象外です。

まず、Laravelのタスクスケジューラですが、一般的にはcronを以下のように設定して利用します。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

ElasrticBeanstalkで利用する場合にどの様にcronを設定するのが良いでしょうか。
また、オートスケールなどでインスタンスが増えても1台だけが実行されることを守るにはどうしたら良いでしょう。

そんなときはElasticBeanstalkの機能を利用すると実現できます。
まずはcron.yamlというファイルをアプリケーションのルートディレクトリに作成します。
※このとき、cron.ymlというファイル拡張子だと何故かEBで認識されませんでした

cron.yaml
version: 1
cron:
 - name: "backup-job"
   url: "/backup"
   schedule: "0 */12 * * *"
 - name: "audit"
   url: "/audit"
   schedule: "0 23 * * *"

こちらは公式開発者ガイドの例です。
scheduleにcronの時間設定、urlにその際に実行してほしいHTTPエンドポイントが設定できることが見てわかります。

これだけではHTTPエンドポイントが利用されるのでLaravelのタスクスケジューラは利用できません。
なので、以下のライブラリを導入しましょう。

https://github.com/dusterio/laravel-aws-worker
導入方法はリポジトリを参照してください。

先程のcron.yamlは以下のように設定しましょう。

cron.yaml
version: 1
cron:
 - name: "schedule"
   url: "/worker/schedule"
   schedule: "* * * * *"

これだけです。
これでEBでは毎分/worker/scheduleを実行するQueueを発行します。

オートスケール時などは、EBはDynamoDBを利用してcronを実行するインスタンスのリーダーを選出しているそうです。
リーダーのインスタンスが利用できない状態になると、別のインスタンスがリーダーに再選出される仕組みになっています。

これで安心してタスクスケジューラを利用できますね。

1
0
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
1
0