Jak wyczyścić osierocone migawki AWS EC2?


22

Skończyliśmy z dużą ilością migawek AWS EC2, w których usunięto AMI, ale migawka pozostawia się do zgnilizny. Chciałbym nie-ręczny sposób identyfikowania i usuwania tych sierot, aby zaoszczędzić nam pieniądze i miejsce.

Idealnie myślę o skrypcie bash wykorzystującym CLI , ale mój AWS-fu jest słaby. Zakładam, że ktoś już to zrobił, ale nie mogę znaleźć skryptu, który faktycznie działa.

W najlepszym przypadku sprawdzi to również woluminy i je wyczyści, ale to może być lepiej dostosowane do drugiego pytania.


Moja wersja na python. Jak korzystać i link do github
E.Big

Odpowiedzi:


13

W dużym stopniu zainspirowany postami na blogu i treściami już linkowanymi w innych odpowiedziach, oto moje podejście do problemu.

Użyłem zawiłych funkcji JMESpath, aby uzyskać listę migawek i nie wymagałemtr .

Oświadczenie : Użyj na własne ryzyko , dołożyłem wszelkich starań, aby uniknąć problemów i zachować rozsądne wartości domyślne, ale nie będę winien, jeśli będzie to powodować problemy.

#!/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"

Mam nadzieję, że sam skrypt jest wystarczająco skomentowany.

Domyślne użycie (bez parametrów) wyświetli listę poleceń usuwania osieroconych migawek dla rachunku bieżącego i regionu eu-west-1, wypakuj:

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

Możesz przekierować to wyjście do pliku w celu przejrzenia przed uzyskaniem go w celu wykonania wszystkich poleceń.

Jeśli chcesz, aby skrypt wykonywał polecenie zamiast je drukować, zamień print(cmd)na system(cmd).

Sposób użycia jest następujący: skrypt o nazwie snap_cleaner:

dla poleceń suchobiegu w regionie us-west-1

./snap_cleaner no us-west-1

dla użytecznych poleceń w eu-central-1

./snap_cleaner IAMSURE eu-central-1 

Trzeci parametr może być wykorzystany do uzyskania dostępu do innego konta (wolę wcześniej zmienić rolę na inne konto).

Skrócona wersja skryptu ze skryptem awk jako 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"

Wspaniale! I poza „podążaniem” (które IMO powinno „podążać”), myślę, że tę odpowiedź należy traktować jako próbkę postów wysokiej jakości. Jedyną rzeczą, która wydaje się nieco zbędna, jest zrzeczenie się odpowiedzialności (wszystko, czego używa się z czegoś na stronie SE, ma „używać na własne ryzyko”). Mogę myśleć tylko o 1 dodatkowej poprawy może chcesz dodać: wskazanie, czy ty sam przetestować ten scenariusz, a jeśli tak, w jaki sposób podsumować jego wyniki testów (coś jak „działa zgodnie z przeznaczeniem”?). Oczywiście, jeśli już go używasz, jest to jeszcze lepsze wskazanie.
Pierre.Vriens

@pierre napisał to dziś rano, częściowo przetestowany, prawdopodobnie wejdzie do naszego rurociągu dziś po południu i chociaż zgadzam się co do ogólnego pomysłu „pod warunkiem, że jest”, poziom ryzyka usunięcia „kopii zapasowej” jest wysoki i uważam, że powinienem to podkreślić nawet więcej.
Tensibai

Hm, więc możemy zaangażować Cię w uruchomienie bezpłatnej usługi pisania kodu dla tego rodzaju potrzeb DevOps (z dołączonymi ciągami zastrzeżeń) ... ciekawe! Sugeruję, aby później (kiedy nadejdzie właściwy czas) dodać niewielką aktualizację (na końcu), na przykład „ mój skrypt wszedł do naszego rurociągu dziś po południu ”.
Pierre.Vriens

@ Pierre.Vriens Powiedziałem prawdopodobnie, bez gwarancji, może być też w przyszłym tygodniu lub później;)
Tensibai

1
Idealne, dzięki za edycję! Działa dokładnie zgodnie z przeznaczeniem.
Alex

5

Użyłem następującego skryptu na GitHub autorstwa Rodrigue Koffi (bonclay7) i działa całkiem dobrze.

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

Dowództwo:

amicleaner --check-orphans

Z posta na blogu dokumentacji robi jeszcze kilka rzeczy:

W rzeczywistości robi coś więcej, dziś pozwala:

  • Usuwanie listy obrazów i powiązanych migawek
  • Mapowanie AMI:
    • Używanie nazw
    • Używanie tagów
  • Filtrowanie AMI:
    • używany przez uruchamianie instancji
    • z grup automatycznego skalowania (konfiguracje uruchamiania) z pożądaną pojemnością ustawioną na 0
    • od konfiguracji uruchamiania odłączonych od grup skalowania automatycznego
  • Określanie, ile AMI chcesz zachować
  • Czyszczenie migawek osieroconych
  • Trochę raportowania

3

Oto jeden skrypt, który może pomóc Ci znaleźć osierocone migawki

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' ' '

( stąd )

Możesz również sprawdzić ten artykuł przed awarią serwera

PS Oczywiście możesz zmienić region, aby odzwierciedlić swój

PPS Oto zaktualizowany kod:

 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' ' '

Przykładowe egzaplanacje tego, co robi kod:

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

wyślij do STDOUT listę migawek. ta konstrukcja:

<(...)

utwórz wirtualny tymczasowy moduł obsługi plików, aby commodczytać polecenie z dwóch „plików” i porównać je


Testowałeś to? Znalazłem ten sam artykuł, ale nie mogę go uruchomić. Jeśli możesz, błąd użytkownika po mojej stronie, ale obawiam się, że może być nieaktualny w zależności od wieku artykułu.
Alex

@Alex, może to sprawdzić jutro
Romeo Ninov

Polecenie zobacz uległo zmianie, użyj aws ec2 opisz / usuń
Tensibai

1
Znalazłem to samo źródło, ale łączenie bohatera w awk z sortowaniem i uniq powoduje, że mój koder powłoki jest smutny, opublikuję swoją wersję jutro :)
Tensibai

1
Świetnie dla mnie, chciałem tylko przekazać Ci (konstruktywne) informacje zwrotne, aby poinformować Cię, że coś, co prawdopodobnie wygląda jak zwykły angielski dla eksperta (takiego jak Ty), dla mnie wygląda prawie jak chiński, ok? PS: i to też nie brzmi Flamandzko ... Dodaj mi dodatkowy komentarz, jeśli chcesz powiadomić mnie po zakończeniu (jeśli chcesz mojej zaktualizowanej opinii).
Pierre.Vriens

2

Oto fragment kodu GitHub Gist dokładnie tego, o co prosił Daniil Yaroslavtsev.

Wykorzystuje listę wszystkich obrazów i ich migawek i porównuje identyfikatory z listą wszystkich identyfikatorów migawek. Cokolwiek pozostaje, to osierocone. Kod działa na tej samej zasadzie co powyższa odpowiedź, ale jest lepiej sformatowany i nieco bardziej czytelny.

Kod korzysta z JMESPath z --query Snapshots[*].SnapshotIdopcją (możesz również użyć do tego narzędzia wiersza poleceń jp, jeśli jest już w twojej dystrybucji. Formatuje dane wyjściowe jako tekst --output text. Oto link do odwołania API i kilka przykładów. Jest nieco bardziej elegancki niż długi łańcuch rur grep / awk / sort / uniq / tr.

Ostrzeżenie Todda Waltona : nie pomyl się z narzędziem „jq”, które używa innego języka zapytań do parsowania dokumentów json.


Po prostu FYI, narzędzie wiersza polecenia jq nie jest tym samym językiem zapytań JSON, jakiego używa polecenie „aws”. Komenda „aws” używa JMESPath.
Todd Walton

Dziękuję za zwrócenie na to uwagi. Nauczyłem się dziś czegoś nowego.
Jiri Klouda

0

Napisałem skrypt snapshots.py, który iteruje wszystkie migawki (na zdefiniowanej liście regionów) i generuje report.csv. Ten plik zawiera informacje o instancji, AMI i woluminie, do których odnoszą się wszystkie migawki.

Istnieje również polecenie interaktywnego usuwania wiszących migawek.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.