Làm thế nào để dọn sạch ảnh chụp nhanh AWS EC2 mồ côi?


22

Chúng tôi kết thúc với một số lượng lớn các ảnh chụp nhanh AWS EC2 trong đó AMI đã bị xóa, nhưng ảnh chụp nhanh bị bỏ lại để quay. Tôi muốn một cách không thủ công để xác định và xóa những đứa trẻ mồ côi này để tiết kiệm tiền và không gian cho chúng tôi.

Lý tưởng nhất là tôi đang nghĩ một kịch bản bash tận dụng CLI , nhưng AWS-fu của tôi yếu. Tôi cho rằng ai đó đã làm điều này trước đây nhưng tôi không thể tìm thấy một kịch bản thực sự hoạt động.

Trong trường hợp tốt nhất, điều này cũng sẽ kiểm tra khối lượng và làm sạch chúng, nhưng điều đó có thể phù hợp hơn cho câu hỏi thứ hai.


Phiên bản của tôi trên python. Cách sử dụng và liên kết github
E.Big

Câu trả lời:


13

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"

Tuyệt vời! Và ngoại trừ từ 'follow' (mà IMO nên là 'follow'), tôi nghĩ câu trả lời này được coi là một mẫu bài đăng chất lượng cao. Điều duy nhất trong đó có vẻ hơi dư thừa, đó là từ chối trách nhiệm (bất cứ điều gì người ta sử dụng từ một thứ gì đó trên trang SE đều đi kèm với "sử dụng nó có nguy cơ của riêng bạn"). Tôi chỉ có thể nghĩ đến 1 cải tiến bổ sung mà bạn có thể muốn thêm: một dấu hiệu nếu bạn đã kiểm tra tập lệnh này và nếu vậy làm thế nào để tóm tắt kết quả thử nghiệm của nó (một cái gì đó như "hoạt động như thiết kế"?). Rõ ràng, nếu bạn đã sử dụng nó cho mình, đó là một dấu hiệu thậm chí còn tốt hơn.
Pierre.Vriens

$ thậm chí nhiều hơn
Tensibai

Hừm, vì vậy chúng tôi có thể giúp bạn tham gia để bắt đầu dịch vụ viết mã miễn phí cho các loại nhu cầu DevOps này (có một số chuỗi từ chối kèm theo) ... thật thú vị! Tôi đề nghị rằng sau này (khi thời gian phù hợp), bạn thêm một bản cập nhật nhỏ (ở cuối) như " kịch bản của tôi đã được đưa vào hệ thống của chúng tôi chiều nay ".
Pierre.Vriens

@ Pierre.Vriens Tôi có lẽ đã nói, không đảm bảo, có thể là vào tuần tới hoặc muộn hơn nữa;)
Tensibai

1
Hoàn hảo, cảm ơn vì đã chỉnh sửa! Hoạt động chính xác như dự định.
Alex

5

Tôi đã sử dụng đoạn script sau trên GitHub của Coleue Koffi (bonclay7) và nó hoạt động khá tốt.

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

Chỉ huy:

amicleaner --check-orphans

Từ bài viết trên blog tài liệu, nó làm thêm một số điều:

Nó thực sự làm được nhiều hơn thế, vào ngày hôm nay, nó cho phép:

  • Xóa danh sách hình ảnh và ảnh chụp nhanh liên quan
  • Ánh xạ AMI:
    • Sử dụng tên
    • Sử dụng thẻ
  • Lọc AMI:
    • được sử dụng bởi các trường hợp đang chạy
    • từ các nhóm tự động hóa (cấu hình khởi chạy) với công suất mong muốn được đặt thành 0
    • từ cấu hình khởi động tách ra từ các nhóm tự động hóa
  • Chỉ định số lượng AMI bạn muốn giữ
  • Làm sạch ảnh chụp mồ côi
  • Một chút báo cáo

3

Đây là một đoạn script có thể giúp bạn tìm các ảnh chụp nhanh mồ côi

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

(từ đây )

Ngoài ra, bạn có thể kiểm tra bài viết này từ serverfault

PS Tất nhiên bạn có thể thay đổi khu vực để phản ánh

PPS Đây là mã cập nhật:

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

Các exaplanations mẫu mà mã làm là:

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

gửi tới STDOUT danh sách ảnh chụp nhanh. công trình này:

<(...)

tạo tập tin tạm thời ảo để tạo commlệnh đọc từ hai "tập tin" và so sánh chúng


Bạn đã kiểm tra nó? Tôi tìm thấy cùng một bài viết nhưng không thể làm cho nó hoạt động. Nếu bạn có thể, lỗi người dùng ở phía tôi, nhưng tôi sợ nó có thể bị lỗi thời dựa trên tuổi của bài viết.
Alex

@Alex, có thể kiểm tra vào ngày mai
Romeo Ninov

Lệnh xem đã thay đổi, sử dụng mô tả / xóa
aws ec2

1
Tôi đã tìm thấy cùng một nguồn, nhưng việc xâu chuỗi anh hùng awk sort và uniq làm cho phía lập trình viên vỏ của tôi buồn, tôi sẽ đăng phiên bản của mình vào ngày mai :)
Tensibai 22/03/17

1
Đối với tôi, tôi chỉ muốn cung cấp cho bạn một số phản hồi (mang tính xây dựng) để cho bạn biết rằng những gì có thể trông giống tiếng Anh thông thường đối với một chuyên gia (như bạn), trông khá giống tiếng Trung đối với tôi, ok? PS: và nó cũng không giống tiếng Flemish ... Hãy gửi cho tôi một bình luận thêm nếu bạn muốn thông báo cho tôi sau khi bạn hoàn thành (nếu bạn muốn phản hồi cập nhật của tôi sau đó).
Pierre.Vriens

2

Dưới đây là đoạn mã GitHub Gist chính xác những gì bạn đang yêu cầu bởi Daniil Yaroslavtsev.

Nó sử dụng danh sách tất cả các hình ảnh và ảnh chụp nhanh của chúng và so sánh ID với danh sách tất cả các ID ảnh chụp nhanh. Những gì còn lại là những đứa trẻ mồ côi. Mã này hoạt động theo nguyên tắc giống như câu trả lời ở trên, nhưng được định dạng tốt hơn và dễ đọc hơn một chút.

Mã này tận dụng lợi thế của JMESPath với --query Snapshots[*].SnapshotIdtùy chọn (bạn cũng có thể sử dụng tiện ích dòng lệnh jp cho điều đó, nếu nó đã có trong bản phân phối của bạn. Các định dạng đầu ra dưới dạng văn bản --output text. Dưới đây là một liên kết đến tham chiếu API và một vài ví dụ. thanh lịch hơn một chuỗi dài các ống grep / awk / sort / uniq / tr.

Cảnh báo của Todd Walton : Đừng nhầm với tiện ích 'jq' sử dụng ngôn ngữ truy vấn khác nhau để phân tích các tài liệu json.


Chỉ cần FYI, tiện ích dòng lệnh jq không phải là ngôn ngữ truy vấn JSON giống như những gì lệnh "aws" sử dụng. Lệnh "aws" sử dụng JMESPath.
Todd Walton

Cảm ơn bạn đã chỉ ra rằng. Tôi đã học được một cái gì đó mới ngày hôm nay.
Jiri Klouda

0

Tôi đã viết tập lệnh snapshots.py lặp lại trên tất cả các ảnh chụp nhanh (trong danh sách các vùng được xác định) và tạo report.csv. Tệp này chứa thông tin về thể hiện, AMI và âm lượng được tham chiếu bởi tất cả các ảnh chụp nhanh.

Ngoài ra còn có lệnh để tương tác loại bỏ các ảnh chụp nhanh lơ lửng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.