Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you call db:seed on AWS Elastic Beanstalk apps?

I know that you can run tasks as part of each deploy, but I only want to bootstrap the database once.

like image 863
heavysixer Avatar asked Jan 17 '13 03:01

heavysixer


People also ask

How do I use a database with Elastic Beanstalk?

To add a DB instance to your environmentOpen the Elastic Beanstalk console , and in the Regions list, select your AWS Region. In the navigation pane, choose Environments, and then choose the name of your environment from the list. If you have many environments, use the search bar to filter the environment list.

What are the three main services that Elastic Beanstalk uses to launch your application?

Elastic Beanstalk is a service for deploying and scaling web applications and services. Upload your code and Elastic Beanstalk automatically handles the deployment—from capacity provisioning, load balancing, and auto scaling to application health monitoring.

When launching an Elastic Beanstalk environment for the first time which three items must be selected?

Instance type, root volume, key pair, and AWS Identity and Access Management (IAM) role. Internal Amazon RDS database.

What database solutions can we use with AWS Elastic Beanstalk?

AWS Elastic Beanstalk does not restrict you to any specific data persistence technology. You can choose to use Amazon Relational Database Service (Amazon RDS) or Amazon DynamoDB, or use Microsoft SQL Server, Oracle, or other relational databases running on Amazon EC2.


3 Answers

Kristian's answer is close, but you should also add:

container_commands:
  seeddb:
    command: 'export HOME=/root; rake db:seed'
    leader_only: true

So that the DB is only seeded from 1 EC2 instance, rather than all of them at the same time. Depending on your EB deployment/version, the export HOME may or may not be needed.

like image 85
Peter Sankauskas Avatar answered Nov 07 '22 15:11

Peter Sankauskas


I used the information provided at this address to create a script that will run AFTER migrations and after each deploy: http://www.emind.co/how-to/how-to-run-rake-dbseed-in-amazon-elastic-beanstalk

I preferred this method so that I could keep track of the file on the EC2 instance. When I initially deployed this on my old servers (which were running Linux <1.0.9) I had no issue. However, I recently had to upgrade the server machines to 64bit Amazon Linux 2014.03 v1.0.9 running Ruby 2.0 (Puma) and the script began to fail. It will likely fail if you are using different Linux versions.

The key here is /usr/local/bin/ to your rake command to use the proper rake. I took this directly from the other scripts found at /opt/elasticbeanstalk/hooks/appdeploy/pre/:

#.ebextensions/db_seed.config
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/13_db_seed.sh":
    mode: "00755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/containerfiles/envvars
      cd $EB_CONFIG_APP_ONDECK
      su -c "leader_only /usr/local/bin/rake db:seed" $EB_CONFIG_APP_USER ||
      echo "Rake task failed to run, skipping seeding."
      true

It should be noted that this script is still not correct as I am not running "bundle exec rake" which is highly advised if you plan to run any rake command (it's a feature request currently on AWS for other scripts). If you wish to have ALL scripts run the bundle exec before "rake" take a look at the .config files posted here: https://github.com/alienfast/elastic-beanstalk

If this still doesn't work for you, I suggest sshing to one of your EC2 instances that are running your app, or deploy a new one running the same Linux/Ruby version and navigate to the "/opt/elasticbeanstalk/hooks/appdeploy/pre/" to see what the other scripts are doing.

I hope others find this useful!

like image 29
DeusExMachina25 Avatar answered Nov 07 '22 16:11

DeusExMachina25


to do commands on your elastic beanstalk instance, you can setup custom commands configurations that will get run when you do update your application. (In fact, there is a whole docs page dedicated to the different types of container commands you can do).

  1. if you don't already have an .ebextensions directory in the root of your application, create one.
  2. any file you put in here will be run. name it whatever you want as long as it ends with ".config" -- I arbitrarily named mine seed.config
  3. borrowing from what hfogel wrote, you can put something in there like this:

    container_commands:
      01seed:
        command: rake db:seed
    
  4. add this new code to your repo: git add . then git commit -m 'added seed config script' then git push

  5. then push this new code to your aws eb instance(s): git aws.push

To verify that your command actually ran, go into your elastic beanstalk console and expand the details for your environment, and navigate to the logs tab, and refresh your logs and view them. Inside there, simply do a ctrl + f for "seed" until you see your seed command was run. If you don't see it in there somewhere, then it didn't run.

like image 4
Kristian Avatar answered Nov 07 '22 16:11

Kristian