I know it's kind of tangential, but one of the MASSIVE benefits of using EC2 and clouds for hosting is the simplicity of provisioning new machines when problems occur (nodes dying, high traffic, etc.).
One attitude to take when using Infrastructure as a Service (IaaS) is to always expect failure - nodes can easily disappear when a problem occurs and take out your entire website.
The best backup plan you can have for this is to capture the entire configuration of your stack in some version controlled way. One of the tools I use for this falls under the domain of "configuration management", with the best products being Chef[1] or Puppet[2], or just writing a normal bash script that installs your Rails stack and checks out your code from github.
When utilizing these technologies, I usually do the following:
1. Create a virtual image that has your CM tools + dependencies installed on it.
2. Add a bootstrap script that runs at boot (usually /etc/rc.local on Linux). This script will acquire and parse user-data[3] that is provided in the provisioning request to EC2[4], an then kick off your main configuration logic.
3. Capture the image and use it as your base image that you perform deployments from.
Feel free to let me know if you have any questions with this method! It's a bit overkill at the learning phases of IaaS clouds and OS administration, but it will save you a TON of time down the road as a programmer.
[1] Chef: http://www.opscode.com/chef/
[2] Puppet: http://puppetlabs.com
[3] http://docs.amazonwebservices.com/AWSEC2/2007-03-01/Develope...
[4] This user-data should contain runtime arguments that your configuration scripts can use to run properly (e.g. a specific git commit version or the hostname of your database node).