Upgrading an EC2 instance from m1.micro to something bigger

By on

Time & Bill has grown. I have started with an m1.micro instance from Amazon AWS EC2 which was available for free for one 1 year. But now these period is ending and I have considered to stay or to move to other services. For example, Jiffy Box came to my mind. But calculating a little bit, Jiffy is not much cheaper than Amazon EC2 when you use reserved instances (and calculate for a year). Google App Engine tied me to much to the Google SDK and honestly I want more access to my database. Google Computing Engine is restricted to a small amount of people and so I cannot use it. I like RedHats OpenShift and will consider going there later, but for now it still needs to grow and improve. So, finally I decided to stick with Amazon AWS because of the great tools and services available.

Now the problem was to upgrade to a bigger instance as sometimes it was not really funny anymore when it came to performance.

I decided to install the Commandline Tools. Basically this is downloading the package and putting it on your path. I do that with writing the following into ~/.profile

export EC2_HOME=/path/to/ec2-api-tools-1.5.6.0
export PATH=/path/to/ec2-api-tools-1.5.6.0/bin:$PATH

On Mac OS X you have to set your JAVA_HOME variable. You don't need that very often these days. It can achieved very easily with putting this into your .profile too:

export JAVA_HOME=$(/usr/libexec/java_home)

Now you should already be able to use the client tools, when you:

source .profile

You will recognize that you need to authenticate against AWS to use these tools. It took me a little to find out that the keys I created for my EC2 instance are not the same I need to access with the CLI tools. You need to create keys on the security page. I uploaded my X.509 cert and as I only work with one AWS account, I could reference these keys in my .profile file too:

export EC2_PRIVATE_KEY=/path/to/pk-AAAAAAAA.pem
export EC2_CERT=/path/to/cert-AAAAAAAA.pem

Now I am able to easily access AWS.

One thing I found out was, that I needed to sync my computers clock automatically. If you don't do that, you'll run into that error:

$ ec2-describe-regions
Client.InvalidSecurity: Request has expired

Once you synced the clock, it takes a few minutes then it will look better:

$ ec2-describe-regions
REGION  eu-west-1   ec2.eu-west-1.amazonaws.com
REGION  sa-east-1   ec2.sa-east-1.amazonaws.com
REGION  us-east-1   ec2.us-east-1.amazonaws.com
REGION  ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
REGION  us-west-2   ec2.us-west-2.amazonaws.com
REGION  us-west-1   ec2.us-west-1.amazonaws.com
REGION  ap-southeast-1  ec2.ap-southeast-1.amazonaws.com

Now it is time stop my EC2 instance, upgrade it to a new type and restart it again. I found out what my instance id is (looked at the web console, but surely there is a CLI trick too).

Then I tried:

$ ec2-stop-instances i-123456
Client.InvalidInstanceID.NotFound: The instance ID 'i-123456' does not exist

Well... I was sure this ID was there. Somewhere I found the tip to apply a region. I copied the region from the web console:

$ ec2-stop-instances i-123456 --region eu-west-1a
Unknown host: 'https://ec2.eu-west-1a.amazonaws.com'

Looking at the available regions, well, eu-west-1a should be eu-west-1 (without a).

This finally worked well:

$ ec2-stop-instances i-123456 --region eu-west-1
INSTANCE    i-123456    running stopping

Quickly I "upgraded" the size of my instance:

$ ec2-modify-instance-attribute --instance-type m1.small i-123456 --region eu-west-1
Client.IncorrectInstanceState: The instance 'i-123456' is not in the 'stopped' state.

Ups - please wait a little time, otherwise you'll get that above. A few seconds later I was able to perform that change:

$ ec2-modify-instance-attribute --instance-type m1.small i-123456 --region eu-west-1
instanceType    i-123456    m1.small

And now we need to start the instance again:

$ ec2-start-instances i-123456 --region eu-west-1
INSTANCE    i-123456    stopped pending

Very well - the instance was starting up again as I could see on the web console. After it started, my app was not reachable. This happened because the elastic IP i had was not longer associated with my instance. Once I fixed that, everything went well and was available as usual.

That being said, I am deeply impressed by all that technology. I would prefer not do deal with such low level details and work a little bit more in the direction of OpenShift, which lets me deal only with my app (PaaS). But well, Amazon EC2 is now - OpenShift is tomorrow. Let's see what the new day brings.

Tags: Cloud, Time & Bill