วิธีทำความสะอาดภาพรวม AWS EC2 ที่ไม่ได้ใช้งาน


22

เราจบลงด้วยภาพรวม AWS EC2 ในจำนวนที่พอใช้ซึ่ง AMI ถูกลบไปแล้ว ฉันต้องการวิธีการระบุและลบเด็กกำพร้าเหล่านี้แบบไม่มีคู่มือเพื่อประหยัดเงินและพื้นที่

เป็นการดีที่ฉันคิดว่าสคริปต์ทุบตีใช้ประโยชน์จาก CLIแต่ AWS-fu ของฉันอ่อนแอ ฉันคิดว่ามีคนทำสิ่งนี้มาก่อน แต่ไม่พบสคริปต์ที่ใช้งานได้จริง

ในกรณีที่ดีที่สุดสิ่งนี้จะตรวจสอบปริมาณและล้างสิ่งเหล่านั้นด้วย แต่นั่นอาจจะเหมาะกว่าสำหรับคำถามที่สอง


รุ่นของฉันในหลาม วิธีใช้และลิงก์ GitHub
E.Big

คำตอบ:


13

แรงบันดาลใจส่วนใหญ่จากการโพสต์บล็อกและส่วนสำคัญที่เชื่อมโยงแล้วในคำตอบอื่น ๆ นี่คือปัญหาของฉัน

ผมไม่ใช้บางส่วนที่ซับซ้อนJMESpathtrฟังก์ชั่นที่จะได้รับรายชื่อของภาพรวมและไม่จำเป็นต้องมี

คำเตือน : ใช้ความเสี่ยงของคุณเองฉันทำดีที่สุดเพื่อหลีกเลี่ยงปัญหาใด ๆ และให้ค่าเริ่มต้นมีสติ แต่ฉันจะไม่โทษถ้ามันทำให้เกิดปัญหากับคุณ

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

ฉันหวังว่าสคริปต์ของตัวเองจะได้รับการแสดงความคิดเห็นเพียงพอ

การใช้งานเริ่มต้น (no-params) จะแสดงรายการคำสั่งลบของสแนปชอตของ orphaned สำหรับบัญชีปัจจุบันและภูมิภาค eu-west-1, แยก:

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

คุณสามารถเปลี่ยนทิศทางเอาต์พุตนี้ไปยังไฟล์เพื่อตรวจทานก่อนที่จะทำการประมวลผลคำสั่งทั้งหมด

หากคุณต้องการสคริปต์เพื่อรันคำสั่งแทนการพิมพ์พวกเขาแทนที่โดยprint(cmd)system(cmd)

การใช้งานมีดังต่อไปนี้ด้วยสคริปต์ชื่อsnap_cleaner:

สำหรับคำสั่งรันไทม์ในภูมิภาค us-west-1

./snap_cleaner no us-west-1

สำหรับคำสั่งที่ใช้งานได้ใน eu-central-1

./snap_cleaner IAMSURE eu-central-1 

สามารถใช้พารามิเตอร์ที่สามเพื่อเข้าถึงบัญชีอื่นได้ (ฉันต้องการเปลี่ยนบทบาทเป็นบัญชีอื่นมาก่อน)

ถอดสคริปต์เวอร์ชันที่มีสคริปต์ awk เป็น 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! และยกเว้นจาก 'ติดตาม' (ซึ่ง IMO ควรเป็น 'ติดตาม') ฉันคิดว่าคำตอบนี้ถือเป็นตัวอย่างของโพสต์คุณภาพสูง สิ่งเดียวที่ดูเหมือนซ้ำซ้อนคือข้อจำกัดความรับผิดชอบ (สิ่งใดก็ตามที่ใช้จากบางสิ่งในไซต์ SE มาพร้อมกับ "ใช้ความเสี่ยงของคุณเอง") ฉันสามารถนึกถึงการปรับปรุงเพิ่มเติม 1 รายการที่คุณอาจต้องการเพิ่ม: สิ่งบ่งชี้หากคุณทดสอบสคริปต์นี้และหากเป็นเช่นนั้นจะสรุปผลการทดสอบได้อย่างไร (เช่น "ทำงานตามที่ออกแบบมา"?) เห็นได้ชัดว่าถ้าคุณใช้ด้วยตัวเองแล้วนั่นเป็นข้อบ่งชี้ที่ดียิ่งขึ้น
Pierre.Vriens

@ เพียร์เขียนเมื่อเช้านี้ทดสอบบางส่วนอาจจะเข้าสู่ขั้นตอนของเราในบ่ายวันนี้และในขณะที่ฉันเห็นด้วยกับแนวคิดทั่วไปที่ให้ไว้ว่า 'เป็น' ระดับความเสี่ยงในการลบ 'แบ็คอัพ' อยู่ในระดับสูง มากไปกว่านั้น.
Tensibai

อืมดังนั้นเราสามารถให้คุณมีส่วนร่วมในการเริ่มบริการเขียนโค้ดฟรีสำหรับความต้องการ DevOps ประเภทนี้ (โดยมีข้อจำกัดความรับผิดชอบ - แนบมาด้วย) ... น่าสนใจ! ฉันขอแนะนำว่าในภายหลัง (เมื่อเวลาเหมาะสม) คุณเพิ่มการอัปเดตเล็กน้อย (ตอนท้าย) เช่น " สคริปต์ของฉันเข้าสู่ขั้นตอนการทำงานของเราในบ่ายวันนี้ "
Pierre.Vriens

@ Pierre.Vriens ฉันบอกว่าคงไม่รับประกันอาจเป็นสัปดาห์หน้าหรือหลังจากนั้น;)
Tensibai

1
สมบูรณ์แบบขอบคุณสำหรับการแก้ไข! ทำงานตามที่ตั้งใจไว้
Alex

5

ฉันใช้สคริปต์ต่อไปนี้บน GitHub โดย Rodrigue Koffi (bonclay7) และใช้งานได้ดีทีเดียว

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

คำสั่ง:

amicleaner --check-orphans

จากการโพสต์บล็อกเอกสารมันทำบางสิ่งเพิ่มเติม:

จริง ๆ แล้วมันทำอะไรมากกว่านั้น ณ วันนี้มันอนุญาต:

  • การลบรายการรูปภาพและสแน็ปช็อตที่เกี่ยวข้อง
  • การทำแผนที่ AMIs:
    • ใช้ชื่อ
    • ใช้แท็ก
  • การกรอง AMIs:
    • ใช้โดยการเรียกใช้อินสแตนซ์
    • จากกลุ่มการปรับสเกลอัตโนมัติ (เรียกใช้การกำหนดค่า) ด้วยความจุที่ต้องการเป็น 0
    • จากการกำหนดค่าการเรียกใช้ที่แยกออกจากกลุ่มการวนอัตโนมัติ
  • ระบุจำนวน AMI ที่คุณต้องการเก็บไว้
  • ทำความสะอาดภาพรวมของเด็กกำพร้า
  • การรายงานเล็กน้อย

3

นี่คือหนึ่งสคริปต์ที่สามารถช่วยคุณค้นหาสแนปชอตของเด็กกำพร้า

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

(จากที่นี่ )

นอกจากนี้คุณสามารถตรวจสอบบทความนี้จากความผิดพลาดของเซิร์ฟเวอร์

ป.ล. แน่นอนคุณสามารถเปลี่ยนภูมิภาคเพื่อสะท้อนถึงของคุณ

PPS นี่คือรหัสปรับปรุง:

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

ตัวอย่าง exaplanations สิ่งที่รหัสทำคือ:

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

ส่งไปที่ STDOUT รายการสแน็ปช็อต การก่อสร้างนี้:

<(...)

สร้างตัวจัดการไฟล์ชั่วคราวเสมือนเพื่อให้commคำสั่งอ่านได้จาก "สองไฟล์" และเปรียบเทียบ


คุณทดสอบหรือไม่ ฉันพบบทความเดียวกัน แต่ไม่สามารถทำงานได้ หากคุณสามารถข้อผิดพลาดของผู้ใช้ในตอนท้ายของฉัน แต่ฉันกลัวว่ามันอาจจะล้าสมัยตามอายุของบทความ
Alex

@Alex สามารถตรวจสอบได้ในวันพรุ่งนี้
Romeo Ninov

คำสั่งดูมีการเปลี่ยนแปลงใช้ aws ec2 อธิบาย / ลบ
Tensibai

1
ฉันไม่พบแหล่งเดียวกัน แต่ผูกมัดพระเอก awk จัดเรียงและ UNIQ ทำให้ coder เปลือกของฉันด้านเศร้าผมจะโพสต์รุ่นของฉันในวันพรุ่งนี้ :)
Tensibai

1
ไม่เป็นไรสำหรับฉันแค่ต้องการให้คำติชม (เชิงสร้างสรรค์) ให้คุณรู้ว่าสิ่งที่อาจดูเหมือนผู้เชี่ยวชาญภาษาอังกฤษทั่วไป (เช่นคุณ) ดูเหมือนคนจีนกับฉันค่อนข้างโอเคไหม PS: และมันก็ไม่ฟังภาษาเฟลมิชเช่นกัน ... ส่งความคิดเห็นเพิ่มเติมมาให้ฉันถ้าคุณต้องการแจ้งให้ฉันทราบหลังจากคุณทำเสร็จแล้ว (ถ้าคุณต้องการคำติชมที่อัปเดตแล้ว)
Pierre.Vriens

2

นี่คือตัวอย่างโค้ด GitHub Gist ของสิ่งที่คุณต้องการโดย Daniil Yaroslavtsev

มันใช้รายการของภาพทั้งหมดและภาพรวมของพวกเขาและเปรียบเทียบรหัสกับรายการของภาพรวมทุกรหัส สิ่งที่เหลืออยู่ก็เป็นของเด็กกำพร้า รหัสทำงานในหลักการเดียวกับคำตอบข้างต้น แต่มีการจัดรูปแบบที่ดีขึ้นและอ่านง่ายขึ้นเล็กน้อย

รหัสใช้ประโยชน์จาก--query Snapshots[*].SnapshotIdตัวเลือกJMESPath (คุณยังสามารถใช้ยูทิลิตีบรรทัดคำสั่ง jp สำหรับสิ่งนั้นถ้ามันอยู่ในการแจกจ่ายของคุณแล้วฟอร์แมตเอาต์พุตเป็นข้อความด้วย--output textนี่คือลิงค์ไปยังการอ้างอิง API และตัวอย่างเล็ก ๆ น้อย ๆ สง่างามยิ่งกว่าท่อ grep / awk / sort / uniq / tr ที่มีสายยาว

คำเตือนโดย Todd Walton : อย่าเข้าใจผิดกับยูทิลิตี้ 'jq' ซึ่งใช้ภาษาคิวรีที่แตกต่างกันในการแยกวิเคราะห์เอกสาร json


เพียงแค่ FYI ยูทิลิตีบรรทัดคำสั่ง jq ไม่ใช่ภาษาแบบสอบถาม JSON เดียวกับที่ใช้ในคำสั่ง "aws" คำสั่ง "aws" ใช้ JMESPath
Todd Walton

ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันได้เรียนรู้สิ่งใหม่วันนี้
Jiri Klouda

0

ฉันได้เขียนสคริปต์snapshots.pyซึ่งวนซ้ำทุกภาพรวม (ในรายการภูมิภาคที่กำหนด) และสร้างreport.csvและสร้าง ไฟล์นี้มีข้อมูลเกี่ยวกับอินสแตนซ์ AMI และปริมาณอ้างอิงโดยภาพรวมทั้งหมด

นอกจากนี้ยังมีคำสั่งให้ลบสแนปชอตของการโต้ตอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.