Su Amazon Web Services, le virtual machines classiche vengono avviate su richiesta e il loro disco rigido è temporaneo, ovvero esiste e conserva i propri dati solo fintanto che l’instanza stessa è accesa. Un riavvio non provoca danni, ma un semplicissimo comando come:
sudo shutdown -h now
sull’instanza sbagliata (magari il vostro web server produttivo dove ospitate l’e-commerce…) manderà tutto al macero. EC2 infatti spegne e fisicamente cancella il disco rigido non più utilizzato, facendovi perdere tutti i dati. Non a caso, dal pannello di controllo questa operazione viene chiamata “Terminate”, ripensate al film di Cameron…
Che fare allora per proteggere un’instanza da una cancellazione inavvertita?
La prima soluzione, e anche la più semplice, è utilizzare adesso che sono disponibili le istanze con boot da EBS. Questo è uno spazio storage permamente di Amazon, pertanto il disco rigido della nostra istanza continua a vivere anche quando l’istanza è stata terminata. Questa scelta però ha un contro, ovvero i costi: mentre una istanza classica si paga per le ore di utilizzo e il traffico di rete prodotto, un’instanza EBS viene pagata anche per le transazioni I/O che vengono compiute sul disco EBS stesso. Ovvero qualsiasi lettura/scrittura prodotta dal sistema operativo o dagli applicativi. Se scegliete questa soluzione, dovrete in ogni caso evitare il comando shutdown dall’interno dell’istanza, che la termina in ogni caso, e affidarvi a:
ec2-run-instances –instance-initiated-shutdown-behavior stop
In questo modo l’istanza viene messa in uno stato di stop pronta per essere riavviata quando richiesta. Durante lo stato di stop pagherete solo per lo spazio disco occupato da EBS e niente altro.
Secondo metodo: imporre che il disco root ospitato su EBS non venga cancellato in fase di shutdown/terminate. Questo si ottiene tramite la seguente chiamata alle API di AWS:
ec2-run-instances –block-device-mapping /dev/sda1=::false
Possiamo anche usare un comando simile in fase di aggiunta di un volume EBS a una macchina già accesa:
–block-device-mapping /dev/sdh=SNAPSHOTID::false
In entrambi i casi, ovviamente dovremo cancellare manualmente i dischi EBS non più utilizzati una volta terminata l’instanza.
Terzo metodo: senza dubbio il più efficace, viene anch’esso realizzato tramite una chiamata API:
ec2-run-instances –disable-api-termination
Questo comando inibisce su quella istanza la possibilità di essere terminata, sia da shell sia da pannello di controllo. E’ il metodo più efficace perchè inibite completamente questi comandi, e anche perchè potete inserirlo all’interno di uno script di deploy dell’istanza stessa, che quindi può essere avviata già bloccata.
Quando poi dovreste veramente terminare l’instanza, dovrete usare i comandi:
ec2-modify-instance-attribute –disable-api-termination false INSTANCEID
ec2-terminate-instances INSTANCEID
Riepilogo: avviare un’instanza in modalità protetta
ec2-run-instances \
–key $keypair \
–availability-zone $availabilityzone \
–user-data-file $startupscript \
–block-device-mapping /dev/sda1=::false \
–block-device-mapping /dev/sdh=$snapshotid::false \
–instance-initiated-shutdown-behavior stop \
–disable-api-termination \
$amiid
Modifiche a runtime, se vi siete dimenticati di avviare la macchina in modo protetto:
ec2-modify-instance-attribute –disable-api-termination true INSTANCEID
ec2-modify-instance-attribute –instance-initiated-shutdown-behavior stop INSTANCEID
ec2-modify-instance-attribute –block-device-mapping /dev/sda1=::false INSTANCEID
ec2-modify-instance-attribute –block-device-mapping /dev/sdh=::false INSTANCEID