Come ridimensionare un volume EBS su Amazon EC2 con Ubuntu 16.04 LTS
da Massimo Della Rovere · pubblicato il 4 novembre, 2017 · modificato il 5 novembre, 2017

Lavorando sugli Amazon Web Services prima o poi si ha la necessità di ridimensionare un volume EBS. La condizione più comune è quella di incrementare la dimensione per le ovvie ragioni di crescita, ma molte volte può essere utile anche decrementare il volume, come ad esempio dopo lo spostamento di contenuti su servizi CDN (content delivery network).

L’operazione di incremento è molto semplice, in quanto Amazon mette già a disposizione degli strumenti che ci facilitano il lavoro, cosa diversa è invece la funzione di decremento, dove sarà necessario fare diversi passaggi manuali su riga di comando, oltretutto l’operazione può essere diversa tra sistema operativi diversi, quella che riporto è stata testata su Ubuntu 16.04 LTS.

Come incrementare un Volume EBS

L’operazione per aumentare lo spazio di un volume EBS è abbastanza semplice, basta usare il menu di modifica volume presente nella console AWS o eseguire il seguente comando. Nel mio caso sto trasformando un volume da 8GB da uno di 20GB.

aws ec2 modify-volume --region eu-west-1 
    --volume-id <id-volume> --size 20

L’operazione dovrebbe essere quasi immediata, a questo punto entriamo nell’istanza EC2 con un collegamento SSH e aumentiamo il file system attuale con i seguenti comandi:

# Sul vs sistema /dev/xvda potrebbe essere anche diverso
# Controllate il valore con il comando df o mount

sudo growpart  /dev/xvda 1
sudo resize2fs /dev/xvda1

# Controllare se la partizione ha la nuova dimensione
# Nel mio caso la partizione ha una dimensione di 20GB

df -h

La cosa buona di questo sistema è che possiamo aumentare la dimensione del nostro storage a caldo senza perdere tempo di servizio. Cosa molto diversa nel caso in cui dobbiamo diminuire la dimensione del nostro volume EBS, operazione che vediamo qui di seguito.

Come decrementare un Volume EBS

Come detto precedentemente l’operazione di decremento è un pochino più complessa, mi raccomando fate un backup completo prima di svolgere i passi indicati e tenete sempre conto che il test è stato eseguito su una distribuzione Ubuntu 16.04 LTS su HVM, la quale potrebbe avere delle piccole differenze rispetto a distribuzioni linux o sistemi operativi diversi.

(1) Scenario attuale

Prendiamo nota dei valori che caratterizzano il volume EBS che vogliamo ridimensionare e quelli dell’istanza EC2 che lo sta utilizzando. Nel mio esempio sono i seguenti, vi consiglio anche a voi di prenderne note prima di iniziare le operazioni di ridimensionamento.

Istanza EC2 (id) = i-089077533730e2d0a
Istanza EC2 (ip) = 10.31.91.11 (connessione SSH)
Volume  EBS (id) = vol-0e77b1b24f3432cd6 di 20GB da portare a 10GB
Mount point      = /dev/sda1

(2) Fermare l’istanza EC2 interessata

Eseguire il comando di stop sull’istanza EC2 collegata al volume EBS.  Mi raccomando non usate il comando (terminate), l’istanza deve essere fermata ma tutte le risorse ad essa associata devono rimanere disponibili. Potete usare la console AWS o eseguire il seguente comando:

aws ec2 stop-instances --instance-ids i-089077533730e2d0a

Come l’istanza EC2 risulta stoppata eseguite il detach del volume EBS.

aws ec2 detach-volume --volume-id vol-0e77b1b24f3432cd6

(3) Creazione di uno snapshot e di un nuovo volume

Adesso che le nostre risorse sono isolate dobbiamo creare uno snapshot del volume EBS origine da cui creare un volume identico all’originale e subito dopo creare un’altro nuovo volume vuoto della dimensione finale che vogliamo raggiungere. (nel mio caso 10GB).

aws ec2 create-snapshot --volume-id vol-0e77b1b24f3432cd6 
    --description "COPIA ORIGINE"

aws ec2 create-volume --snapshot-id snap-077cd0a00868ccdd6 
    --region eu-west-1 --availability-zone eu-west-1a 
    --volume-type gp2

aws ec2 create-volume --size 10 
    --region eu-west-1 --availability-zone eu-west-1a 
    --volume-type gp2

NB: Sui comandi di creazione volume specificate la regione e la zona di disponibilità in cui è stata avviata l’istanza EC2 origine. In modo da poter eseguire la prossima associazione.

(4) Attach dei volumi alla nostra istanza EC2

Terminata l’operazione precedente vi dovreste trovare tre diversi volumi EBS, l’originale, la copie dell’originale e il volume vuoto della dimensione di destinazione. A questo punto si deve eseguire il comando di (attach) rispettando questi mount point.

aws ec2 attach-volume --volume-id vol-0e77b1b24f3432cd6 
    --instance-id i-089077533730e2d0a --device /dev/sda1

aws ec2 attach-volume --volume-id vol-0ca91b702b641c556 
    --instance-id i-089077533730e2d0a --device /dev/sdf

aws ec2 attach-volume --volume-id vol-033d769e111b8a66a 
    --instance-id i-089077533730e2d0a --device /dev/sdg

Vi allego qui di seguito la mia schermata per darvi un’idea del risultato finale. Ricordatevi che ho usato /dev/sda1 per il volume originale in quanto era il mount point che avevo appuntato prima di stoppare l’istanza, se dovesse essere diverso usate il vostro.

Per gli altri volumi ho usato i mount point che mi risultano liberi nella mia condizione, se per qualsiasi motivo avete occupato queste posizioni con altri mount cambiateli con altri lettere.

(5) Avviare l’istanza EC2

A questo punto non ci resta che riavviare la nostra istanza ed eseguire una connessione SSH che ci permetterà di eseguire i comandi di preparazione e copia sul volume di destinazione.

aws ec2 start-instances --instance-ids i-089077533730e2d0a
ssh -i chiave.pem ubuntu@indirizzoIP

(6) Montare i nuovi volumi 

Preparare il nuovo volume di destinazione con un filesystem ext4, creare delle directory per un mount ed eseguire il mount dei due volumi, copia originale e risultato.

sudo mkfs.ext4 /dev/xvdf

sudo mkdir /mnt/risultato
sudo mkdir /mnt/copiaoriginale

sudo mount /dev/xvdf /mnt/risultato
sudo mount -t ext4 /dev/xvdg1 /mnt/copiaoriginale

(7)  Impostazione della Label

Sui dischi di avvio in cloud la label del disco è una informazione indispensabile, quindi settare la stessa label per il disco di destinazione in modo da essere idoneo come disco di boot.

sudo e2label /dev/xvda1 (dovrebbe darvi cloudimg-rootfs)
sudo e2label /dev/xvdf cloudimg-rootfs

(8) Copia del Volume sulla nuova destinazione

Adesso che il volume di destinazione è pronto possiamo eseguire una copia dal volume che ha la copia dell’originale con il seguente comando. Il tempo di esecuzione può variare molto in base alla dimensione del vostro disco. Nel mio caso è durato circa 5 minuti.

sudo rsync -ax /mnt/copiaoriginale/ /mnt/risultato/

(9) Installazione di GRUB

Dato che la maggior parte delle volte ci troviamo a ridimensionale il disco che coincide anche con il volume di boot, dobbiamo configurare anche i parametri che riguardano GRUB.

sudo grub-install --root-directory=/mnt/risultato/ --force /dev/xvdf
sudo umount /mnt/risultato

# Questo comando serve per vedere il valore id UUID
# Appuntare il valore UUID associato a /dev/xvda1

blkid

# Esempio del risultato del mio comando

/dev/xvda1: UUID="3e13556e-d28d-407b-bcc6-97160eafebe1"
/dev/xvdg1: UUID="3e13556e-d28d-407b-bcc6-97160eafebe1"

# Una volta che avete il valore di UUID dovete
# impostarlo anche sul disco di nuova destinazione
 
sudo tune2fs -U 3e13556e-d28d-407b-bcc6-97160eafebe1 /dev/xvdf

(10) Riavviare istanza EC2 con nuovo volume

Adesso che il nostro volume è pronto possiamo fermare la nostra istanza con (stop), eseguire il detach di tutti i volumi collegati, ed eseguire il comando di attach del nuovo volume.

aws ec2 stop-instances --instance-ids i-089077533730e2d0a

aws ec2 detach-volume --volume-id vol-0e77b1b24f3432cd6
aws ec2 detach-volume --volume-id vol-033d769e111b8a66a
aws ec2 detach-volume --volume-id vol-0ca91b702b641c556

aws ec2 attach-volume --volume-id vol-0ca91b702b641c556 
    --instance-id i-089077533730e2d0a --device /dev/sda1

Terminate queste operazioni dovreste ottenere un’istanza EC2 funzionante con il nuovo volume ridimensionato secondo le vostre esigenze. Quando siete sicuri che funziona tutto fate pulizia di tutti gli snapshot e volumi temporanei che abbiamo usato per l’operazione di copia.

Disclaimer

Tutte le operazioni indicate sono state eseguite con successo su Ubuntu 16.04 LTS e sistema di virtualizzazione HVM, in nessun caso posso garantire il funzionamento della procedura su altri ambienti che non siano esattamente uguali al mio. Quindi prendete tutte le precauzioni del caso e create dei backup per tornare alla situazione originale in caso di insuccesso. Tutte le azioni che andrete ad eseguire sono sotto la vostra responsabilità quindi consideratelo con attenzione.

Guida completa su AWS

Questo articolo appartiene ad una serie di pubblicazioni che costituiscono una guida completa dedicata agli Amazon Web Services. Molti servizi che trattiamo in questo blog vengono anche spiegati con dei video che trovate nel nostro canale youtube. Se volete seguire questo percorso didattico iscrivetevi alla community Cloud AWS.

1 Commento

  1. Ho letto la guida e finalmente sono riuscito a riportare alcuni volumi alla loro dimensione originale, però ho letto che la dimensione influisce anche sulla velocità del disco, come faccio a controllare la differenza di velocità tra ad esempio un 10GB e un 100GB? esiste un tools?

condividi