laravelで定期バッチを実行する基盤の選定
laravelに標準でバッチを実行する機能がついてますが、cronが基盤となっている為、少し実行環境の考慮が必要です。そこで実行する基盤を検討してみたいと思います。
- EC2でCron実行
- ECSでCron実行
- lambda
- AWS Batch
- ECSでScheduledTaskを利用
色々考えましたが、今回はECSでScheduledTaskを利用する事とします。
理由としては、現状のプロジェクト構成が
- ユーザー側API用ECS
- 管理者側API用ECS
と別れていて、管理者側API用ECSにバッチ処理を追加して
そのdocker imageをそのまま利用して、実行コマンドを叩けばよいので
新たに、batch用のイメージを作成する手間がなさそうと言う事が大きいです。
ECSのスケジュールについては、コンソールだと下記で簡単に作成できそうです。(現状旧コンソールでしかこちらは表示されないので注意です。)
laravelを使ったスケジューリングについて
laravelにはTask Schedulingといった便利な機能があります。
こちらもcronを使って実行前提の機能なのですが、通常はcronで午前2時にこれを実行してーって感じで特定の時間帯のみ実行するのですが
laravelのTask Schedulingは毎分cronでlaravelのスケジュールを呼び出して、必要があれば実行する方式です。
ECSの場合も、同じ感じで実行します。
ECSのでスケリューズを毎分にしておいて、コンテナの起動を繰り返して、該当の時間にバッチを実行する感じです。1分毎にコンテナが起動して終了する感じで結構力技に思えるのですが、今ならこれが一番簡単かも。
バッチの実行ログについて
laravelでstorage配下にログを吐き出しする事もできますが、コンテナ基盤なので破棄されてしまうので
ログをS3で管理する。- CloudWatchLogに出力する。(config/logging.phpから簡単に設定できます。)
- RDSで管理
が必要になります。
CloudWatchLogを設定する為に、標準設定をしておきます。
ローカルで正しく出力されているかをまず確認します。