EC2 on Rails
Deploy a Ruby on Rails app on EC2 in five minutes
Unfortunately I am no longer maintaining this project. Please feel free to fork it and give it new life!
Main Page: http://ec2onrails.rubyforge.org
Code on Github: http://github.com/pauldowman/ec2onrails
EC2 on Rails is an Ubuntu Linux server image for Amazonâs EC2 hosting service thatâs ready to run a standard Ruby on Rails application with little or no customization. Itâs a Ruby on Rails virtual appliance.
If you have an EC2 account and can start EC2 instances youâre five minutes away from deploying your Rails app.
EC2 on Rails is opinionated software: the opinion is that for many rails apps the server setup can be generalized and shared the same way as the web application framework itself. For many people (Twitter, this isnât for you) the server image can be treated the same way as other shared libraries. And if the day comes when your needs areunique enough that EC2 on Rails canât be configured to work for you then you can bundle your own image from it or fork the build source and customize it.
But until then, why spend your time configuring servers?
Features of the EC2 image:
- Ready to deploy a Rails app with little or no configuration of the server required
- Optional Amazon Elastic Block Store (EBS) setup and support for MySQL database persistence.
- Automatic backup of MySQL database to S3 (EBS enabled: snapshots taken every 2 hrs; Non-EBS enabled: full backup nightly + incremental backup using binary logs every 5 minutes if not using )
- Capistrano tasks to customize the server image, archive and restore the database to/from S3, and more (available as a rubygem)
- Nginx + Passenger
- Varnish proxy for load balancing across multiple instances, and optionally HTTP caching.
- Ruby on Rails 2.3.4, 2.2.3, 2.1.2, 2.0.5 and 1.2.6
- Ruby 1.8.6
- MySQL 5
- memcached
- god configured to monitor apache or nginx, mongrel, mysql, memcached, drive space and system load
- Ubuntu 9.04 âJauntyâ base image built using Eric Hammondâs EC2 Ubuntu script
- SSL support (currently needs fixing since the switch to Nginx)
- Amazon AMI tools installed
- MySQL, Nginx, varnish, syslog, etc. configured to use /mnt for data and logging so you donât fill up EC2âs small root filesystem
- Automatically archives logs to S3 nightly.
- 32-bit and 64-bit images available (supports all instance types, small to extra large).
- Created using a build file, full source is available (the EC2 on Rails script is run from Eric Hammondâs EC2 Ubuntu script)
- Can be used as a clustered Rails app running on multiple instances
- Automatically runs hourly, daily, weekly and monthly scripts if they exist in Rails applicationâs script directory
- Local Postfix SMTP mail server (only available from within the instance, not listening on external network interfaces)
Using the image
This documentation will be improved soon, for now hopefully this covers the basics.
The current AMI idâs are:
- ami-c9bc58a0 (32-bit)
- ami-cbbc58a2 (64-bit)
I will keep these images available for as long as possible, they will not be deleted for at least a few years.
1. Install the gem
sudo gem install ec2onrails
2. Add the config files to your Rails app
You will need to place Capfile in the root of your rails folder, and put deploy.rb and s3.yml in the config folder.
Within your rails directory, run
wget -q -O Capfile http://github.com/pauldowman/ec2onrails/raw/master/examples/Capfile
wget -q -O config/deploy.rb http://github.com/pauldowman/ec2onrails/raw/master/examples/deploy.rb
wget -q -O config/s3.yml http://github.com/pauldowman/ec2onrails/raw/master/examples/s3.yml
Be sure to customize those files and read the comments.
In your database.yml file, add host: db_primary
to the host of other database configuration options. After running âcap ec2onrails:server:set_rolesâ it will resolve to the instance defined in your Capistrano âdbâ role.
3. Start up one or more instances of the image.
There is nothing EC2 on Rails-specific here yet (though soon there will be a Capistrano task to do this for you), if youâve started EC2 instances before you can skip this section. Otherwise, Iâm not going to lie, this part is complicated and will take a lot more than 5 minutes the first time.
Read the running an instance section in Amazonâs getting started guide.
For the AMI idâs of the current images do cap ec2onrails:ami_ids
from within the app that you configured in the previous step (theyâre also listed earlier on this page).
NOTE: Only use the images that match the current version of the gem.
Please see the change log for release notes, and see the list of open issues.
As is standard for public AMIâs, password-based logins are disabled. You log in with your own public/private keypair.
Most basic things can be configured automatically by the Capistrano tasks, but if you want to you can login by ssh as a user named âadminâ (has sudo ability) or as âappâ (the user that the app runs as, does not have sudo ability). The Capistrano tasks automatically use the app user to deploy the app, and the admin user for server admin tasks that require sudo.
IMPORTANT: Double-check your firewall settings. Be sure that you havenât allowed public access to any ports other than TCP 22 and TCP 80 (and possibly TCP 443 if youâre going to enable HTTPS). If youâre using multiple instances, be sure to allow them network access to each other.
4. Copy your public key from the server to keep Capistrano happy
This is a workaround for a quirk in Capistrano. Technically all you should need to connect to the server is the private key file, the public key is on the server. But for some reason Capistrano requires that you have both the public key and the private key files together on the client.
There is a Capistrano task that tries to fix this for you. From within the root of your rails app do:
cap ec2onrails:get_public_key_from_server
Note, this will only work if you have an external ssh command in the path, it wonât work for most Windows users.
5. Deploy the app with Capistrano
Now that the gem is installed, your deploy.rb is configured and you can start and stop EC2 instances, this is the only thing youâll need to do from now on.
cap ec2onrails:setup cap deploy:migrations
Yes, itâs that easy! The setup task will set the serverâs timezone, install any gems and Ubuntu packages that you specified in the config file, and create your database.
Thatâs it, your app is now running on EC2!!
Capistrano tasks
Capistrano is the most commonly used Rails deployment tool. It comes with many standard âtasksâ, and the EC2 on Rails gem includes Capistrano tasks specifically for configuring the server instance.
Capistrano is run from the command-line using the âcapâ command, with a task name given as an argument.
Commonly-used tasks
Youâll mostly need just the following Capistrano tasks:
cap ec2onrails:ami_ids
Shows the AMI idâs of the images that match the current version of the gem.
cap ec2onrails:db:enable_ebs
This task will move the primary mysql database onto an Amazon Elastic Storage Block (EBS) volume. You can call this task with the optional SIZE parameter defined (defaults to 10 gigs) likecap ec2onrails:db:enable_ebs SIZE=10
You should then specify your own volume (or the one created by this task) in your capistrano deploy.rb file like so:
role :db, âec2-xx-xxx-xx-xxx.compute-1.amazonaws.comâ, :primary => true, :ebs_vol_id => âvol-12345abcâ
NOTE MySQL EBS is not enabled by default. You may call this task at anytime to move your MySQL over to EBS, but just make sure you keep track of the volume-id that is printed out by this task and use it to modify your deploy.rb file
cap ec2onrails:server:set_roles
Customizes each instance for itâs role(s) (as defined in your Capistrano deploy.rb file). Run this after starting or stopping instances. For now this just makes sure that only the appropriate services (Apache, Mongrel, and/or MySQL) are running. Eventually this will customize settings for the running services also. Note that an instance can have more than one role. If thereâs only one instance it will have all roles.
Note that due to the way that Capistrano works all tasks are run against all hosts that are currently defined in the deploy.rb file. So if you start a new instance then add it to your deploy.rb you will need to run âcap ec2onrails:setupâ again which will be run on all existing instances.
Database management tasks
cap ec2onrails:db:archive
Archive the MySQL database to the bucket specified in your deploy.rb. This is for archiving a snapshot of your database into any S3 bucket. For example, you might want to do this before deploying.
cap ec2onrails:db:restore
Restore the MySQL database from the bucket specified in your deploy.rb For example, I use this to restore the current production data (from my actual production backup bucket) onto a staging server that has the current production version of my app. I then deploy the new version which tests migrations exactly as theyâll run on the production server.
To get a full list of the Capistrano tasks at any time type cap -T
from with your rails app root.
Building the image
The EC2 on Rails server image is built using Eric Hammondâs EC2 Ubuntu build script
Note that building your own AMI is not necessary, other options are:
- Use one of the public AMIâs and configure it at run-time (recommended).
- Re-bundle one of the public AMIâs and save it as your own (not recommended because you wonât be able to take advantage of any bug fixes or updates).
Instructions:
1. Start an EC2 instance that will be used to run the build script. The recommended AMIâs are Amazonâs public developer images:
32-bit: ami-f51aff9c
64-bit: ami-f21aff9b
2. Copy your certificate file and private key file to the EC2 instance ephemeral storage, using your ssh IDENTITY (key) file:
scp -i IDENTITY pk-XXXXXXXXXX.pem root@_HOSTNAME_:/mnt/
scp -i IDENTITY cert-XXXXXXXXXX.pem root@_HOSTNAME_:/mnt/
3. Copy the entire ec2onrails source folder EC2ONRAILS to the EC2 instance ephemeral storage, using your ssh IDENTITY file:
rsync -rlvzcC âdelete âexclude=âoutput*â âexclude=â.gitâ ârsh=âssh -i IDENTITYâ EC2ONRAILS root@_HOSTNAME_:/mnt/
Note: make sure NOT to include a trailing slash on the ec2onrails directory name, rsync behaves differently when copying directories if there is no slash at the end of the folder name! After this step you should have a directory on the server named /mnt/ec2onrails (e.g. use /rails/ec2onrails not /rails/ec2onrails/ or /rails/ec2onrails/.)
4. Using ssh, log in to the EC2 instance HOSTNAME using your ssh IDENTITY file:
ssh -i IDENTITY root@_HOSTNAME_
5. On the server, run the build script with the appropriate arguments: (ARCH is either i386 or amd64)
ruby /mnt/ec2onrails/server/build \
âbucket ec2onrails \
âprefix ec2onrails-custom \
âarch ARCH
âuser XXXX-XXXX-XXXX \
âaccess-key XXXXXXXXXX \
âsecret-key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
âprivate-key /mnt/pk-XXXXXXXXXX.pem \
âcert /mnt/cert-XXXXXXXXXX.pem
Mailing lists
There are two Google groups, one for announcements (usually just new release announcements) and one for discussion.
Comments
Comments are welcome. Send an email to Paul Dowman or to the Google group. If you find bugs please file them here or send me an email.
Change log
See the change log.
How to submit patches
Please read the 8 steps for fixing other peopleâs code. The source code can be checked out anonymously using:
git clone git://github.com/pauldowman/ec2onrails.git
Patches can be submitted to the RubyForge Tracker or emailed directly to me .
Contributors
(In alphabetical order)
Adam Greene
Arpit Jain
Barry Paul
Ben Woosley
Chris Nolan
Ed Wagner
Mark Lane
Paul Dowman
Pivotal Labs
Randy Harmon
Robert J. Berger
Sebastian Johnsson
(If youâve contributed code and youâre not listed here I apologize, please send me an email!)
License
This code is free to use under the terms of the GPL v2.
If you find EC2 on Rails useful please recommend Paul Dowman at Working With Rails.
Copyright 2007 Paul Dowman, http://pauldowman.com/ This is free software, and you are welcome to redistribute it under certain conditions. This software comes with ABSOLUTELY NO WARRANTY. See the file named COPYING for details.