How do I perform Laravel Artisan migrations on AWS Elastic Beanstalk?

oskarth picture oskarth · Apr 9, 2014 · Viewed 12.1k times · Source

I have a Laravel installation and have set up three environments with their own corresponding config directories:

  • local
  • staging
  • production

I use php artisan migrate:make create_users_table etc as described here to create database migrations.

In my local environment I use Vagrant and a simple MySQL server setup, and on staging & production I use AWS RDS.

To configure database access for the staging environment I have a app/config/staging/database.php file with settings like this:

...
"mysql" => array(
    "driver" => "mysql",
    "host" => $_SERVER["RDS_HOSTNAME"],
    "database" => $_SERVER["RDS_DB_NAME"],
    "username" => $_SERVER["RDS_USERNAME"],
    "password" => $_SERVER["RDS_PASSWORD"],
    "charset" => "utf8",
    "collaction" => "utf8_unicode_ci",
    "prefix" => "",
),
...

I use git to deploy the app with git aws.push as described here.

The question is: How do I run the migration on my staging (and later production) EBS server when deploying?

Answer

oskarth picture oskarth · Apr 9, 2014

I solved it by creating a new directory in the root of my project named .ebextensions. In that directory I created a script file my-scripts.config:

.ebextensions/
    my-scripts.config
app/
artisan
bootstrap
...

The file my-scripts.config gets executed when EBS deploys, is a YAML file and looks like this:

container_commands:
    01-migration:
        command: "php /var/app/ondeck/artisan --env=staging migrate"
        leader_only: true

Add the directory and file to git, commit, and run git aws.push and it will migrate.

Explanations on how stuff in .ebextensions works can be found here.

The path /var/app/ondeck is where your application lives when your script runs, it will afterwards be copied into /var/app/current.

The artisan option --env=staging is useful for telling artisan what environment it should run in, so that it can find the correct database settings from app/config/staging/database.php

If you need a quick and dirty way to log why the migrate command fails you might want to try out something like "php /var/app/ondeck/artisan --env=staging migrate > /tmp/artisan-migrate.log" so that you can log into your ec2 instance and check the log.