This is basically part-2 continue from Setup Laravel 5 in Amazon Elastic Beanstalk.

In most cases, we need to run some long process tasks in background, by either cronjob or queue.

Here I'll demostrate both.

Create a worker tier

We need to separate normal http operation from long process background tasks. So let's create a worker environment

1
$ eb create <environment> -t worker

Post hook after eb deploy

First, create a directory in your project root

1
2
$ cd /path/to/project
$ mkdir .ebextensions

You can read the official documentation here

From now onward, I assume the current directory is in project root

Setup queue with supervisor & sqs

First you need to create a .config file

1
2
3
4
5
6
packages:
yum:
python27-setuptools: []
container_commands:
01-supervise:
command: ".ebextensions/supervise.sh"

Where the supervise.sh you can download here

(credit to Günter Grodotzki)

Once you done this, you must add an environment variable in your elastic beanstalk console (worker tier only) "SUPERVISE=enable" to activate

AWS Elastic Beanstalk environment

Because you don't want the webapp environment to listen to the queue, thus this variable is used to identify which environment need to run this.

Create a queue

Create a queue in SQS console, then copy the URL to environment variable, e.g.

1
https://sqs.ap-southeast-1.amazonaws.com/999999999999/laravel-queue

For how to use queue in laravel, refer here

Setup cronjob

Create a file named cron.config

1
2
3
container_commands:
01-crontab:
command: ".ebextensions/cron.sh"

Where the cron.sh you can download here and also download the crontab (you may modify if you need)

Place this 2 files in .ebextensions. Again, same as supervise, you need to add INS_CRONTAB environment variable in worker tier, and set the value to enable.

One thing to take note, whenever the environment scale up to multiple server, your crontab may run multiple times, thus, I suggest that create a table (e.g. cronjob) in database, and add 2 attributes: executed_at and completed_at.

Thus, in your php script, you only run those job with executed_at = null, to avoid duplication.

Deploy your app

1
$ eb deploy <worker environment>

Done

References: