upgrading to ruby 1.9.1 on an ec2 fedora server, and running a rails application on top of it is a multi step process but a straight forward one. below are the steps I took to get my amazon ec2 hosted production environment migrated to ruby 1.9.1
step I: launch your ec2 instance
this post assumes you know how to launch an ec2 instance, in my case i used ec2's 64bit basic fedora ami, i found the 32bit unusable due to stability issues i experienced with the original kernel. more details on this are logged here
step II: install ruby 1.9.1
first we want to get the dependancies out of the way, in my case i needed to install several libraries that will be later used by my rails app, you may have a smaller or larger dependencies list depending on the gems you need to run.
yum update yum install httpd httpd-devel mysql mysql-devel libxml2 libxml2-devel gcc-c++
now lets install ruby 1.9.1, I choose to install in in my /opt directory, but you may choose elsewhere. we will be suffixing ruby with the "19" suffix so that we can run ruby 1.9.1 side by side with the existing ec2's ruby 1.8.6
cd /opt wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p376.tar.gz tar xvfz ruby-1.9.1-p376.tar.gz cd ruby-1.9.1-p376 ./configure --enable-shared --program-suffix=191 make make install
now that we have ruby 1.9 compiled and installed, it's time to do some renaming and symbolic linking so that the system uses ruby 1.9.1 by default while overcoming ec2's hard-wired ruby 1.8.6 installation
mv /usr/bin/ruby /usr/bin/ruby186 mv /usr/bin/irb /usr/bin/irb186 mv /usr/bin/erb /usr/bin/erb186 mv /usr/bin/testrb /usr/bin/testrb186 mv /usr/bin/gem /usr/bin/gem186 mv /usr/bin/rake /usr/bin/rake186 mv /usr/bin/ri /usr/bin/ri186 mv /usr/bin/rdoc /usr/bin/rdoc186 ln -s /usr/local/bin/ruby191 /usr/bin/ruby ln -s /usr/local/bin/rake191 /usr/bin/rake ln -s /usr/local/bin/gem191 /usr/bin/gem ln -s /usr/local/bin/irb191 /usr/bin/irb ln -s /usr/local/bin/erb191 /usr/bin/erb ln -s /usr/local/bin/ri191 /usr/bin/ri ln -s /usr/local/bin/rdoc191 /usr/bin/rdoc ln -s /usr/local/bin/testrb191 /usr/bin/testrb
To confirm you are running the correct ruby version, run
>> ruby -v
you should see (assuming you download same revision as i did)
ruby 1.9.1p376 (2009-12-07 revision 26041) [i686-linux]
step III: installing rails
this step can prove to be more involved than others, depending on the gems you need to run. I have a detailed post on this here. the original post was written for OSX, but with the minor differences in ruby's location is perfectly correct any *nix.
step IV: bundling your custom AMI
now that we are done setting up the server, the next natural step is to bundle it as a custom ami so we can reuse it.
an issue we run into is that ec2's ruby based ami tools are not ruby 1.9 compatible, more specifically the ec2_upload_bundle tool which we need to use in order to bundle. luckily, we installed ruby 1.9.1 side by side to the original 1.8.6, so we have an easy way out: simply use ruby 1.8.6 to run the tools. to do so, change ec2 wrapper scripts in /usr/local to use ruby18 instead of ruby. for example change /usr/local/bin/ec2-bundle-vol from
#!/bin/bash ruby /usr/lib/site_ruby/ec2/amitools/bundlevol.rb $*
#!/bin/bash ruby186 /usr/lib/site_ruby/ec2/amitools/bundlevol.rb $*
apply the same principle to the rest of the ec2 wrapper scripts in /usr/local