Come ripulire le istantanee orfane di AWS EC2?


22

Finiamo con una buona quantità di istantanee di AWS EC2 in cui l'AMI è stata eliminata, ma l'istantanea viene lasciata a marcire. Vorrei un modo non manuale di identificare ed eliminare questi orfani per farci risparmiare denaro e spazio.

Idealmente sto pensando a uno script bash che sfrutta la CLI , ma il mio AWS-fu è debole. Presumo che qualcuno l'abbia già fatto prima, ma non riesco a trovare uno script che funzioni davvero.

Nel migliore dei casi, questo controlla anche i volumi e li pulisce, ma potrebbe essere più adatto per una seconda domanda.


La mia versione su Python. Come usare e collegamento github
E. Big

Risposte:


13

In gran parte ispirato ai post e all'essenza del blog già collegati nelle altre risposte, ecco la mia opinione sul problema.

Ho usato alcune funzioni contorte di JMESpath per ottenere un elenco di istantanee e non richiedere tr.

Dichiarazione di non responsabilità : utilizzare a proprio rischio , ho fatto del mio meglio per evitare qualsiasi problema e mantenere impostazioni predefinite corrette, ma non mi prenderò alcuna colpa se ti causasse problemi.

#!/bin/sh
# remove x if you don't want to see the commands
set -ex

# Some variable initialisation with sane defaults
DRUN='--dry-run'
DO_DELETE=${1:-'no'}
REGION=${2:-'eu-west-1'}
ACCOUNTID=${3:-'self'}

# Get two temporary files
SNAP_FILE=$(mktemp)
IMAGE_FILE=$(mktemp)

# Get the snapshot list and the volume list
aws --region "$REGION" ec2 describe-snapshots --owner-ids "$ACCOUNTID" --query 'Snapshots[*].[SnapshotId]' --output text > "$SNAP_FILE"
aws --region "$REGION" ec2 describe-images --owners "$ACCOUNTID" --filters Name=state,Values=available --query 'Images[*].BlockDeviceMappings[*].Ebs.[SnapshotId]' --output text > "$IMAGE_FILE"

# Check if the outputed command should be dry-run (default) or not
if [ "$DO_DELETE" = "IAMSURE" ]
then
 DRUN=''
fi

# count each snapshot id, decrease when a volume reference it, print delete command for those with no volumes
awk -v REGION="$REGION" -v DRUN="$DRUN" '
FNR==NR { snap[$1]++; next } # increment snapshots and get to next line in file immediately

{ snap[$1]-- } # we changed file, decrease the snap counter when a volume reference it

END {
 for (s in snap) { # loop over the snapshots
   if (snap[s] > 0) { # if we did not decrese under 1 that means there is no volume referencing this snapshot
    cmd="aws --region " REGION " " DRUN " ec2 delete-snapshot --snapshot-id " s
    print(cmd)
  }
 }
}
' "$SNAP_FILE" "$IMAGE_FILE"
# Clean up the temp files
rm "$SNAP_FILE" "$IMAGE_FILE"

Spero che la sceneggiatura stessa sia commentata abbastanza.

L'utilizzo predefinito (no-params) elencherà i comandi di eliminazione delle istantanee orfane per l'account corrente e la regione eu-west-1, estraendo:

aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-81e5856a
aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-95c68c7e
aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-a3bf50bd

È possibile reindirizzare questo output su un file per la revisione prima di acquistarlo per eseguire tutti i comandi.

Se si desidera che lo script esegua il comando invece di stamparli, sostituirlo print(cmd)con system(cmd).

L'utilizzo è il seguente con uno script chiamato snap_cleaner:

per comandi a secco nella regione us-west-1

./snap_cleaner no us-west-1

per comandi utilizzabili in eu-central-1

./snap_cleaner IAMSURE eu-central-1 

Un terzo parametro può essere utilizzato per accedere a un altro account (preferisco passare il ruolo a un altro account prima).

Versione ridotta dello script con awk script come oneliner:

#!/bin/sh
set -ex

# Some variable initialisation with sane defaults
DRUN='--dry-run'
DO_DELETE=${1:-'no'}
REGION=${2:-'eu-west-1'}
ACCOUNTID=${3:-'self'}

# Get two temporary files
SNAP_FILE=$(mktemp)
IMAGE_FILE=$(mktemp)

# Get the snapshot list and the volume list
aws --region "$REGION" ec2 describe-snapshots --owner-ids "$ACCOUNTID" --query 'Snapshots[*].[SnapshotId]' --output text > "$SNAP_FILE"
aws --region "$REGION" ec2 describe-images --owners "$ACCOUNTID" --filters Name=state,Values=available --query 'Images[*].BlockDeviceMappings[*].Ebs.[SnapshotId]' --output text > "$IMAGE_FILE"

# Check if the outputed command should be dry-run (default) or not
if [ "$DO_DELETE" = "IAMSURE" ]
then
 DRUN=''
fi

# count each snapshot id, decrease when a volume reference it, print delete command for those with no volumes
awk -v REGION="$REGION" -v DRUN="$DRUN" 'FNR==NR { snap[$1]++; next } { snap[$1]-- } END { for (s in snap) { if (snap[s] > 0) { cmd="aws --region " REGION " " DRUN " ec2 delete-snapshot --snapshot-id " s; print(cmd) } } }' "$SNAP_FILE" "$IMAGE_FILE"
# Clean up the temp files
rm "$SNAP_FILE" "$IMAGE_FILE"

Magnific! E a parte il 'follow' (che l'IMO dovrebbe essere 'segue'), penso che questa risposta debba essere considerata come un campione di post di alta qualità. L'unica cosa che sembra un po 'ridondante è la dichiarazione di non responsabilità (tutto ciò che uno utilizza da qualcosa su un sito SE viene fornito con "usalo a tuo rischio e pericolo"). Posso solo pensare a un ulteriore miglioramento che potresti voler aggiungere: un'indicazione se hai testato questo script e in tal caso come riassumere i risultati del test (qualcosa come "funziona come progettato"?). Ovviamente, se lo usi già da solo, questa è un'indicazione ancora migliore.
Pierre.Vriens

@pierre lo ha scritto stamattina, testato parzialmente, probabilmente entrerà nella nostra pipeline questo pomeriggio, e mentre sono d'accordo sull'idea generale "fornita così com'è", il livello di rischio di rimuovere un "backup" è alto e sento che dovrei sottolinearlo ancora di più.
Tensibai,

Quindi, possiamo coinvolgerti per avviare un servizio di scrittura di codice gratuito per questo tipo di esigenze DevOps (con alcune stringhe di dichiarazione di non responsabilità allegate) ... interessante! Suggerisco che in seguito (quando sarà il momento), aggiungere un aggiornamento minore (alla fine) come "la mia sceneggiatura è entrata nella nostra pipeline questo pomeriggio ".
Pierre.Vriens

@ Pierre.Vriens Ho detto probabilmente, non garantito, potrebbe essere anche la prossima settimana o più tardi;)
Tensibai

1
Perfetto, grazie per il montaggio! Funziona esattamente come previsto.
Alex

5

Ho usato il seguente script su GitHub di Rodrigue Koffi (bonclay7) e funziona abbastanza bene.

https://github.com/bonclay7/aws-amicleaner

Comando:

amicleaner --check-orphans

Dal post del blog di documentazione fa alcune altre cose:

In realtà fa un po 'di più, a oggi consente:

  • Rimozione di un elenco di immagini e istantanee associate
  • Mappatura delle AMI:
    • Usando i nomi
    • Usando i tag
  • Filtro AMI:
    • utilizzato dalle istanze in esecuzione
    • dai gruppi con scalabilità automatica (avvia le configurazioni) con una capacità desiderata impostata su 0
    • dalle configurazioni di avvio staccate dai gruppi di scalabilità automatica
  • Specificare quante AMI si desidera conservare
  • Pulizia di istantanee orfane
  • Un po 'di segnalazione

3

Ecco uno script che può aiutarti a trovare istantanee orfane

comm -23 <(echo $(ec2-describe-snapshots --region eu-west-1 | grep SNAPSHOT | awk '{print $2}' | sort | uniq) | tr ' ' '\n') <(echo $(ec2-describe-images --region eu-west-1 | grep BLOCKDEVICEMAPPING | awk '{print $3}' | sort | uniq) | tr ' ' '\n') | tr '\n' ' '

(da qui )

Inoltre puoi consultare questo articolo da serverfault

PS Naturalmente puoi cambiare la regione per riflettere la tua

PPS Ecco il codice aggiornato:

 comm -23 \
<(echo $(aws ec2 describe-snapshots --region eu-west-1 |awk '/SNAPSHOT/ {print $2}' | sort -u) | tr ' ' '\n') \
<(echo $(aws ec2 describe-images --region eu-west-1 |  awk '/BLOCKDEVICEMAPPING/ {print $3}' | sort -u) | tr ' ' '\n') | tr '\n' ' '

L'esaplanazione di esempio che cosa fa il codice è:

echo $(aws ec2 describe-snapshots --region eu-west-1 | awk '/SNAPSHOT/ {print $2}' | sort -u) | tr ' ' '\n')

invia a STDOUT l'elenco delle istantanee. questa costruzione:

<(...)

creare un gestore di file temporaneo virtuale per commleggere i comandi da due "file" e confrontarli


L'hai provato? Ho trovato lo stesso articolo ma non riesco a farlo funzionare. Se possibile, errore dell'utente da parte mia, ma temo che possa essere obsoleto in base all'età dell'articolo.
Alex

@Alex, puoi controllarlo domani
Romeo Ninov

Il comando vedi è cambiato, usa aws ec2 descrivi / cancella
Tensibai

1
Ho trovato la stessa fonte, ma concatenare l'eroe in ordine di sorta e uniq rende triste il mio coder di shell,
pubblicherò la

1
Bene per me, volevo solo fornirti un feedback (costruttivo) per farti sapere che quello che probabilmente sembra un inglese normale a un esperto (come te), mi assomiglia un po 'al cinese, ok? PS: e non sembra nemmeno fiammingo ... Mandami un commento in più se vuoi avvisarmi dopo aver finito (se vuoi il mio feedback aggiornato allora).
Pierre.Vriens

2

Ecco uno snippet di codice GitHub Gist di esattamente ciò che stai chiedendo da Daniil Yaroslavtsev.

Utilizza l'elenco di tutte le immagini e le loro istantanee e confronta gli ID con l'elenco di tutti gli ID delle istantanee. Ciò che resta sono gli orfani. Il codice funziona con lo stesso principio della risposta precedente, ma è meglio formattato e leggermente più leggibile.

Il codice sfrutta JMESPath con l' --query Snapshots[*].SnapshotIdopzione (puoi anche usare l'utilità della riga di comando jp per questo, se è già nella tua distribuzione. Formatta l'output come testo con --output text. Ecco un link al riferimento API e alcuni esempi. È leggermente più elegante di una lunga catena di tubi grep / awk / sort / uniq / tr.

Avvertenza di Todd Walton : non confondere con l'utilità "jq" che utilizza un linguaggio di query diverso per analizzare i documenti json.


Cordiali saluti, l'utilità della riga di comando jq non è lo stesso linguaggio di query JSON utilizzato dal comando "aws". Il comando "aws" utilizza JMESPath.
Todd Walton,

Grazie per averlo sottolineato. Ho imparato qualcosa di nuovo oggi.
Jiri Klouda,

0

Ho scritto uno script snapshot.py che scorre su tutte le snapshot (in un elenco definito di regioni) e genera report.csv. Questo file contiene informazioni su istanza, AMI e volume a cui fanno riferimento tutte le istantanee.

È inoltre disponibile il comando per rimuovere in modo interattivo le istantanee sospese.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.