แรงบันดาลใจส่วนใหญ่จากการโพสต์บล็อกและส่วนสำคัญที่เชื่อมโยงแล้วในคำตอบอื่น ๆ นี่คือปัญหาของฉัน
ผมไม่ใช้บางส่วนที่ซับซ้อน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"