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で認識されませんでした
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は以下のように設定しましょう。
version: 1
cron:
- name: "schedule"
url: "/worker/schedule"
schedule: "* * * * *"
これだけです。
これでEBでは毎分/worker/schedule
を実行するQueueを発行します。
オートスケール時などは、EBはDynamoDBを利用してcronを実行するインスタンスのリーダーを選出しているそうです。
リーダーのインスタンスが利用できない状態になると、別のインスタンスがリーダーに再選出される仕組みになっています。
これで安心してタスクスケジューラを利用できますね。