Artık AWS EC2 anlık görüntüleri nasıl temizlenir?


22

AMI'nin silindiği yerde bir miktar AWS EC2 anlık görüntüsü elde ettik, ancak anlık görüntü çürümeye bırakıldı. Bize paradan ve yerden tasarruf etmek için bu yetimlerin tanımlanması ve silinmesinin manuel olmayan bir yolunu istiyorum .

İdeal olarak , CLI'dan yararlanan bir bash betiğini düşünüyorum , ancak AWS-fu'm zayıf. Bunu daha önce birinin yaptığını varsayıyorum ama gerçekten işe yarayan bir senaryo bulamıyorum.

En iyi senaryoda, bu aynı zamanda hacimleri de kontrol edecek ve bunları da temizleyecektir, ancak bu ikinci bir soru için daha uygun olabilir.


Python'daki versiyonum. Nasıl kullanılır ve github link
E.Büyük 5:17

Yanıtlar:


13

Blog yazılarından büyük ölçüde esinlenilmiş ve diğer cevaplarla zaten bağlantılı olan özü, işte benim sorunum.

Bazı anlık JMESpath işlevlerini, anlık görüntülerin bir listesini almak için kullandım ve gerektirmedik tr.

Feragatname : Kendi risklerinizde kullanın, herhangi bir sorunu önlemek ve aklı başında olmak için elimden gelenin en iyisini yapmak için elimden gelenin en iyisini yaptım, ama eğer sana soruna neden olursa suçlamayacağım.

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

Umarım betiğin kendisi yeterince yorumlanır.

Varsayılan kullanım (param olmadan), cari hesap ve bölge eu-west-1 için artık anlık görüntülerin silme komutlarını listeler:

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

Tüm komutları yürütmek için kaynak göstermeden önce bu çıktıyı incelenmek üzere bir dosyaya yönlendirebilirsiniz.

Eğer komut yerine onları baskı komutunu çalıştırmak istiyorsanız, yerine print(cmd)göre system(cmd).

Kullanımı şu adında bir script ile takip edilir snap_cleaner:

us-west-1 bölgesindeki kuru komutlar için

./snap_cleaner no us-west-1

eu-central-1'de kullanılabilir komutlar için

./snap_cleaner IAMSURE eu-central-1 

Başka bir hesaba erişmek için üçüncü bir parametre kullanılabilir (Daha önce bir hesaba rol değiştirmeyi tercih ederim).

Bir oneliner olarak awk betiği ile betiğin çıkarılmış sürümü:

#!/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! Ve 'takip et' dışında (IMO'nun 'takip etmesi gereken') dışında, bu cevabın yüksek kaliteli mesajların bir örneği olarak kabul edilmesi gerektiğini düşünüyorum. İçinde biraz gereksiz görünen tek şey, feragatnamedir (SE sitesindeki bir şeyden birinin kullanması "kendi sorumluluğunuzdadır" ile birlikte gelir). Sadece eklemek isteyebileceğiniz 1 ilave gelişme düşünebilirim: bu betiği test ettiyseniz ve eğer öyleyse test sonuçlarını nasıl özetleyeceğinizin bir göstergesi ("tasarlandığı gibi çalışır" gibi bir şey). Açıkçası, zaten kendiniz kullanıyorsanız, bu daha da iyi bir göstergedir.
Pierre.Vriens

@pierre bu sabah, kısmen denenmiş, muhtemelen bu öğleden sonra boru hattımıza gireceğini yazdı ve genel olarak “olduğu gibi” genel fikrine katılıyorum, ancak bir “yedeklemeyi” kaldırmanın risk seviyesi yüksek ve bunu vurgulamam gerektiğini düşünüyorum hatta daha fazla.
Tensibai

Hm, bu yüzden bu tür DevOps ihtiyaçları için ücretsiz bir kod yazma hizmeti vermeye başlayabiliriz (bazı feragatname-dizeleri eklenmiş olarak) ... ilginç! Daha sonra (zaman doğru olduğunda), " bence bu öğleden sonra komut satırım boru hattımıza girdi " gibi küçük bir güncelleme eklemenizi öneririm .
Pierre.Vriens

@ Pierre.Vriens Ben muhtemelen, garanti değil, gelecek hafta veya daha sonra da olabileceğini
söyledim

1
Mükemmel, düzenleme için teşekkürler! Tam olarak amaçlandığı gibi çalışır.
Alex,

5

GitHub'da Rodrigue Koffi (bonclay7) tarafından yazılan şu betiği kullandım ve oldukça iyi çalışıyor.

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

Komut:

amicleaner --check-orphans

Belgelendirme blog gönderisinden bazı daha fazla şey yapar:

Aslında bundan biraz daha fazlasını yapıyor, şu anda izin veriyor:

  • Bir görüntülerin ve ilgili anlık görüntülerin listesinin kaldırılması
  • AMI’leri Eşlemek:
    • İsimleri kullanma
    • Etiketleri kullanma
  • AMI’leri Filtreleme:
    • çalışan örnekler tarafından kullanılır
    • Otomatik ölçeklendirme gruplarından (başlatma yapılandırmaları) istenen kapasiteye 0 olarak ayarlanmış
    • Otomatik ölçeklendirme gruplarından ayrılan başlatma yapılandırmalarından
  • Kaç tane AMI tutmak istediğinizi belirtmek
  • Yetim anlık görüntülerin temizlenmesi
  • Biraz raporlama

3

Artık artık görüntüleri bulmanıza yardımcı olabilecek bir komut dosyası

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

( buradan )

Ayrıca bu makaleyi serverfault adresinden inceleyebilirsiniz.

PS Tabii ki bölgenizi yansıtacak şekilde değiştirebilirsiniz.

PPS İşte kod güncellendi:

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

Örnek açıklamalar kodun ne yaptığını:

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

anlık görüntülerin listesini STDOUT gönder. bu yapı:

<(...)

commiki "dosyadan" komutu okumak ve karşılaştırmak için sanal geçici dosya yöneticisi oluşturun


Test ettin mi? Aynı makaleyi buldum ancak çalışamıyorum. Yapabiliyorsanız, kullanıcı benim tarafımda hata, ama makalenin yaşına göre modası geçmiş olabileceğinden korkuyorum.
Alex

@Alex, yarın kontrol edebilir
Romeo Ninov

Komut görmek değişti, aws ec2 tanımla / sil
komutunu kullan

1
Aynı kaynağı buldum, ancak zincirleme kahraman awk sıralama ve uniq kabuk kodlayıcı tarafımı üzüyor, yarın versiyonumu
yayınlayacağım

1
Benim için iyi, sadece bir uzmana (sizin gibi) normal İngilizcenin neye benzediğini, bana Çince gibi göründüğünü bildirmek için bazı (yapıcı) geribildirimler sunmak istedim, tamam mı? Not: ve Flamanca da gelmiyor ... Yaptıktan sonra beni bilgilendirmek istiyorsanız (eğer güncellenmiş geri bildirimlerimi istiyorsanız) bana ek bir yorum bırakın.
Pierre.Vriens

2

İşte Daniil Yaroslavtsev tarafından tam olarak ne istediğinizi içeren bir GitHub Gist kod pasajı.

Tüm görüntülerin listesini ve bunların anlık görüntülerini kullanır ve kimlikleri, tüm anlık görüntü kimlikleri listesiyle karşılaştırır. Geriye kalanlar artık yetim olanlar. Kod, yukarıdaki cevapla aynı prensipte çalışır, ancak daha iyi biçimlendirilmiş ve biraz daha okunaklıdır.

Kod ile JMESPath yararlanır --query Snapshots[*].SnapshotId, bunu da dikkate jp komut satırı yardımcı programını kullanabilirsiniz (opsiyon, onun zaten dağılımında ise. Biçimleriyle metin olarak çıktı --output text. İşte olan bağlantı API referans ve birkaç örneklere. Biraz olduğunu grep / awk / sort / uniq / tr uzun bir zincir zincirinden daha zarif.

Todd Walton tarafından uyarısı : Json belgelerini ayrıştırmak için farklı sorgu dili kullanan 'jq' yardımcı programında hata yapma.


Sadece FYI, jq komut satırı yardımcı programı "aws" komutunun kullandığıyla aynı JSON sorgu dili değildir . "Aws" komutu JMESPath'i kullanır.
Todd Walton,

Bunu gösterdiğin için teşekkürler. Bugün yeni bir şey öğrendim.
Jiri Klouda

0

Tüm anlık görüntüleri yineleyen (tanımlanmış bölgeler listesinde) ve oluşturan snapshots.py komut dosyasını yazdım report.csv. Bu dosya tüm anlık görüntülerin referans aldığı örnek, AMI ve birim hakkında bilgi içerir.

Ayrıca sarkan anlık görüntüleri etkileşimli olarak kaldırmak için bir komut var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.