Cloning an EC2 instance for testing purposesEdit

These are notes made while creating a clone of an existing EC2 instance, based on EBS snapshots, for testing purposes. Although the notes are specific to my set-up, they give an indication of the kind of procedure that could be applied to any EBS-backed EC2 instance.

First up we look at our running instances:

ec2-describe-instances

We’ll need this information in order to create an exact clone of the instance:

  • zone (eg us-east-1d)
  • AMI (eg ami-84db39ed)
  • kernel (eg aki-94c527fd)
  • ramdisk (eg ari-96c527ff)

Now we look at our snapshots and pick a recent one (sorting by date, filtering by host "mondatta"); we pick the two latest snapshots because there are actually two EBS volumes attached to this instance:

ec2-describe-snapshots | grep mondatta | sort -k 5 | tail -n 2

You can’t just spin up a new instance by feeding these snapshot IDs into ec2-run-instances. You instead must register a snapshot to be used as a basis for a new AMI:

ec2-register \
  -n rails-snapshot-2010-06-07 \
  -d 'Rails instance snapshot 2010-06-07' \
  --root-device-name /dev/sda1 \
  -b /dev/sda1=snap-feedface

This gives us a new AMI ID that we an feed in to ec2-run-instances:

ec2-run-instances -z us-east-1d \
  --key ec2instancekey \
  -b /dev/sdh=snap-deadbeef \
  -g rails \
  --kernel aki-94c527fd \
  --ramdisk ari-96c527ff \
  ami-abcd1234

Note how we don’t need to specify the block device mapping for the root volume (at /dev/sda1) because that was effectively done using ec2-register; we only specify the second block device mapping for the data volume (at /dev/sdh).

Note also how we pass in explicit --kernel and --ramdisk values. In my initial attempt at doing this I skipped these and found that the resulting instance couldn’t mount the XFS /data volume, and trying to do so manually failed:

# mount /data
mount: unknown filesystem type 'xfs'
# modprobe xfs
FATAL: Could not load /lib/modules/2.6.16-xenU/modules.dep: No such file or directory

As soon as the instance is running, we get the hostname via ec2-describe-instances and log in via SSH:

ec2-describe-instances
ssh -i ~/.ec2/ec2instancekey.pem root@ec2-184-73-120-54.compute-1.amazonaws.com

We want to stop sendmail so that any stale mail which might be in the queue on the snapshot doesn’t get sent out again, and likewise we stop cron so that backup jobs (additional EBS snapshots and Git mirrors) don’t run:

service sendmail stop
service crond stop

Once we’ve finished testing on the instance, we terminate it:

ec2-terminate-instances i-1234abcd

We can list our AMIs:

ec2-describe-images -o self

And clean up the AMI that we created earlier:

ec2-deregister ami-abcd1234