JCastaneyra blog

My ideas repo

Como incrementar el root EBS de una instancia EC2

| Comments

Las instancias de EC2 que corren con EBS (Elastic Block Storage) cuando se crean vienen con un tamaño relativamente pequeño (talvez 8 Gb o un poco más), ¿que hay si este tamaño lo quiero incrementar?, ¿que tengo que hacer?

Assumptions: Se asume de que ya se tienen instaladas y configuradas las herramientas de línea de comandos de AWS, también cabe mencionar que los comandos que aquí aparecen les precede el prompt $, en el caso de la instancia remota también precedido por el host.

Backups: Respaldar información sensible, si se tiene información importante en /mnt respaldarla ya que esta se perderá al hacer este proceso.

Al conectarme por ssh a mi instancia y verificar el tamaño del filesystem veo que tan sólo tiene 7.9G.

1
2
3
4
5
6
7
ubuntu@ip-10-170-185-61:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.9G  773M  6.8G  11% /
udev            288M  8.0K  288M   1% /dev
tmpfs           119M  160K  118M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            296M     0  296M   0% /run/shm

Siguiendo el tutorial de Eric Hammond de alestic.com (y modificado ligeramente ya que algunas cosas no corrieron), desde mi lap donde tengo instalada la herramienta de aws, corro lo siguiente, primero hay que obtener el id de instancia.

1
2
3
4
5
$ ec2-describe-instances                                                                            
RESERVATION   r-54a9ea12  672080195794    default
INSTANCE  i-2ddc0374  ami-0d153248    ec2-50-18-95-56.us-west-1.compute.amazonaws.com ip-10-170-185-61.us-west-1.compute.internal running jcastaneyra_west    0       t1.micro    2012-10-12T14:47:45+0000    us-west-1c  aki-8d396bc8        monitoring-disabled 50.18.95.56 10.170.185.61           ebs                 paravirtual xen vcdyJ1350053264046  sg-6b43132e default
BLOCKDEVICE   /dev/sda1   vol-3885d716    2012-10-12T14:47:49.000Z    true
TAG   instance    i-2ddc0374  Name    

El id es i-2ddc0374, y el tamaño al que quiero llegar es de 20 Gb, por lo que voy a correr lo siguiente desde línea de comandos.

1
2
$ instanceid=i-2ddc0374
$ size=20

Hay que obtener el volumen y la zona actual de la instancia.

1
2
$ oldvolumeid=$(ec2-describe-instances $instanceid | egrep "^BLOCKDEVICE./dev/sda1" | cut -f3)
$ zone=$(ec2-describe-instances $instanceid | egrep "^INSTANCE" | cut -f12)

Si se ejecuta el siguiente comando debería aparecer.

1
2
$ echo "instance $instanceid in $zone with original volume $oldvolumeid"
instance i-2ddc0374 in us-west-1c with original volume vol-3885d716

Ahora, hay que detener la instancia (ojo, detener no terminar).

1
2
$ ec2-stop-instances $instanceid
INSTANCE  i-2ddc0374  running stopping

Desasociar el volumen actual de la instancia.

1
2
$ while ! ec2-detach-volume $oldvolumeid; do sleep 1; done
ATTACHMENT    vol-3885d716    i-2ddc0374  /dev/sda1   detaching   2012-10-12T14:47:49+0000

Crear un snapshot del volumen actual.

1
2
3
4
$ snapshotid=$(ec2-create-snapshot $oldvolumeid | cut -f2)
$ while ec2-describe-snapshots $snapshotid | grep -q pending; do sleep 1; done
$ echo "snapshot: $snapshotid"
snapshot: snap-5d91ed71

Crear un nuevo volumen basado en el snapshot recien creado.

1
2
3
$ newvolumeid=$(ec2-create-volume   --availability-zone $zone   --size $size   --snapshot $snapshotid | cut -f2)
$ echo "new volume: $newvolumeid"
new volume: vol-e6b0e2c8

Asociar el nuevo volumen a la instancia.

1
2
3
$ ec2-attach-volume   --instance $instanceid   --device /dev/sda1   $newvolumeid
ATTACHMENT    vol-e6b0e2c8    i-2ddc0374  /dev/sda1   attaching   2012-10-12T15:25:12+0000
$ while ! ec2-describe-volumes $newvolumeid | grep -q attached; do sleep 1; done

Ahora bien, se arranca la instancia.

1
2
3
$ ec2-start-instances $instanceid
INSTANCE  i-2ddc0374  stopped pending
$ while ! ec2-describe-instances $instanceid | grep -q running; do sleep 1; done

Buscamos ahora la nueva ip pública.

NOTA: si la instancia tenía una elastic ip asociada tendremos que volverla a asociar de nuevo.

1
2
3
4
5
$ ec2-describe-instances $instanceid
RESERVATION   r-54a9ea12  672080195794    default
INSTANCE  i-2ddc0374  ami-0d153248    ec2-50-18-24-164.us-west-1.compute.amazonaws.com    ip-10-170-201-117.us-west-1.compute.internal    running jcastaneyra_west    0       t1.micro    2012-10-12T15:26:54+0000    us-west-1c  aki-8d396bc8            monitoring-disabled 50.18.24.164    10.170.201.117          ebs                 paravirtual xen vcdyJ1350053264046  sg-6b43132e default
BLOCKDEVICE   /dev/sda1   vol-e6b0e2c8    2012-10-12T15:25:12.000Z    false
TAG   instance    i-2ddc0374  Name    

Al conectarnos de nueva cuenta con ssh vemos que el filesystem ya está con un nuevo tamaño.

1
2
3
4
5
6
7
ubuntu@ip-10-170-201-117:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  777M   18G   5% /
udev            288M  8.0K  288M   1% /dev
tmpfs           119M  160K  118M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            296M     0  296M   0% /run/shm

Después de esto ya podríamos borrar el volumen viejo, e incluso si estamos seguros que todo quedó bien podríamos también borrar el snapshot.

1
2
3
4
$ ec2-delete-volume $oldvolumeid
VOLUME    vol-3885d716
$ ec2-delete-snapshot $snapshotid
SNAPSHOT  snap-5d91ed71

NOTA: Como el nuevo volumen fue creado manualmente, al momento de terminar la instancia este no se borra automáticamente, creo que hay un parametro en los atributos de la instancia para volver a habilitar el borrado automático, pero yo no lo encontré, pero digo, borrarlo manualmente tampoco me llevó mucho tiempo.

LINKS.

alestic blog

Comments