Lấy cảm hứng chủ yếu từ các bài đăng trên blog và ý chính đã được liên kết trong các câu trả lời khác, đây là vấn đề của tôi.
Tôi đã sử dụng một số chức năng JMESpath phức tạp để có được một danh sách các ảnh chụp nhanh và không yêu cầu tr
.
Tuyên bố miễn trừ trách nhiệm : Sử dụng rủi ro của riêng bạn , tôi đã cố gắng hết sức để tránh mọi vấn đề và giữ mặc định lành mạnh, nhưng tôi sẽ không nhận bất kỳ trách nhiệm nào nếu nó gây ra vấn đề cho bạn.
#!/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"
Tôi hy vọng kịch bản chính nó được bình luận đủ.
Việc sử dụng mặc định (không có thông số) sẽ liệt kê các lệnh xóa các ảnh chụp nhanh mồ côi cho tài khoản hiện tại và khu vực eu-west-1, giải nén:
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
Bạn có thể chuyển hướng đầu ra này thành một tệp để xem xét trước khi tìm nguồn cung ứng để thực hiện tất cả các lệnh.
Nếu bạn muốn tập lệnh thực thi lệnh thay vì in chúng, hãy thay thế print(cmd)
bằng system(cmd)
.
Cách sử dụng như sau với một tập lệnh có tên snap_cleaner
:
cho các lệnh chạy khô trong khu vực us-west-1
./snap_cleaner no us-west-1
cho các lệnh có thể sử dụng trong eu-centre-1
./snap_cleaner IAMSURE eu-central-1
Tham số thứ ba có thể được sử dụng để truy cập tài khoản khác (tôi thích chuyển đổi vai trò sang tài khoản khác trước đó).
Phiên bản rút gọn của tập lệnh với tập lệnh awk là một 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"