अनाथ AWS EC2 स्नैपशॉट को कैसे साफ़ करें?


22

हम एडब्ल्यूएस ईसी 2 स्नैपशॉट की एक उचित मात्रा के साथ समाप्त होते हैं जहां एएमआई हटा दिया गया है, लेकिन स्नैपशॉट को सड़ने के लिए पीछे छोड़ दिया गया है। मुझे इन अनाथों को पहचानने और हटाने का एक गैर-मैनुअल तरीका चाहिए, जिससे हम पैसे और जगह बचा सकें।

आदर्श रूप से मैं CLI का लाभ उठाने वाली एक बैश स्क्रिप्ट के बारे में सोच रहा हूं , लेकिन मेरा AWS-fu कमजोर है। मुझे लगता है कि किसी ने ऐसा किया है, लेकिन मुझे ऐसी स्क्रिप्ट नहीं मिल रही है जो वास्तव में काम करती हो।

सर्वोत्तम-स्थिति में यह वॉल्यूम की भी जाँच करेगा और साथ ही उन को साफ़ भी करेगा, लेकिन यह एक दूसरे प्रश्न के लिए बेहतर हो सकता है।


अजगर पर मेरा संस्करण। कैसे और उपयोग करने के लिए लिंक लिंक
ई.पिग

जवाबों:


13

बड़े पैमाने पर ब्लॉग पोस्टों से प्रेरित और पहले से ही अन्य उत्तरों में जुड़े हुए, यहाँ मेरी समस्या है।

मैंने स्नैपशॉट की सूची प्राप्त करने और आवश्यकता नहीं करने के लिए कुछ जटिल JMESpath फ़ंक्शन का उपयोग किया tr

डिस्क्लेमर : अपने जोखिम पर उपयोग करें , मैंने किसी भी समस्या से बचने और समझदार चूक रखने के लिए अपनी पूरी कोशिश की, लेकिन अगर यह आपके लिए समस्या का कारण है तो मैं कोई दोष नहीं लूंगा।

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

मुझे उम्मीद है कि स्क्रिप्ट में ही पर्याप्त टिप्पणी की गई है।

डिफ़ॉल्ट उपयोग (नो-पैराम्स) चालू खाते और क्षेत्र के लिए अनाथ स्नैपशॉट के कमांड को हटा देगा, जो कि उत्तर-पश्चिम -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:

हमारे-पश्चिम -1 क्षेत्र में शुष्क-रन कमांड के लिए

./snap_cleaner no us-west-1

यूरोपीय-मध्य -1 में प्रयोग करने योग्य आदेशों के लिए

./snap_cleaner IAMSURE eu-central-1 

तीसरे पैरामीटर का उपयोग किसी अन्य खाते तक पहुंचने के लिए किया जा सकता है (मैं पहले किसी अन्य खाते में भूमिका स्विच करना पसंद करता हूं)।

ऑनलाइनर के रूप में awk स्क्रिप्ट के साथ स्क्रिप्ट के संस्करण को नीचे ले जाया गया:

#!/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 'फॉलो' होना चाहिए) को छोड़कर, मुझे लगता है कि इस उत्तर को उच्च गुणवत्ता वाले पदों के नमूने के रूप में माना जाना चाहिए। इसमें केवल एक चीज जो थोड़ी सी बेमानी लगती है, वह है डिस्क्लेमर (कुछ भी जो किसी एसई साइट पर किसी चीज का उपयोग करता है, "अपने जोखिम पर इसका इस्तेमाल करें") के साथ आता है। मैं केवल 1 अतिरिक्त सुधार के बारे में सोच सकता हूं जिसे आप जोड़ना चाह सकते हैं: एक संकेत यदि आपने इस स्क्रिप्ट का परीक्षण किया है और यदि ऐसा है तो इसके परीक्षा परिणामों को संक्षेप में प्रस्तुत करें (कुछ इस तरह "डिजाइन किए गए काम करता है?")। जाहिर है, अगर आप पहले से ही इसका इस्तेमाल करते हैं, तो यह एक बेहतर संकेत है।
Pierre.Vriens

@ पियरे ने इसे आज सुबह लिखा है, आंशिक रूप से परीक्षण किया है, शायद आज दोपहर को हमारी पाइपलाइन में प्रवेश करेगा, और जब मैं सामान्य विचार पर सहमत हूं, जैसा कि 'है,''बैकअप 'को हटाने का जोखिम स्तर अधिक है और मुझे लगता है कि मुझे तनाव हो सकता है और भी अधिक।
तेनसीबाई

हम्म, इसलिए हम आपको इस प्रकार के DevOps की ज़रूरतों के लिए एक मुफ्त कोड लेखन सेवा शुरू करने के लिए शामिल कर सकते हैं (कुछ अस्वीकरण-तार संलग्न) ... दिलचस्प! मेरा सुझाव है कि बाद में (जब समय सही हो), तो आप " मेरे स्क्रिप्ट ने आज दोपहर हमारी पाइपलाइन में प्रवेश किया " जैसे एक मामूली अद्यतन (अंत में) जोड़ें ।
Pierre.Vriens

@ पियरे.वीयरेंस मैंने कहा शायद, गारंटी नहीं, अगले हफ्ते या बाद में भी हो सकता है;)
तेनसीबाई

1
बिल्कुल सही, संपादन के लिए धन्यवाद! जैसा ठीक वैसा ही काम करता है।
एलेक्स

5

मैं रॉड्रिगो कॉफ़ी (bonclay7) द्वारा GitHub पर निम्नलिखित स्क्रिप्ट का इस्तेमाल किया और यह बहुत अच्छा काम करता है।

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

कमान:

amicleaner --check-orphans

प्रलेखन ब्लॉग पोस्ट से यह कुछ और बातें करता है:

यह वास्तव में इससे कहीं अधिक है, आज की अनुमति देता है:

  • छवियों और संबंधित स्नैपशॉट की एक सूची निकाल रहा है
  • मानचित्रण AMIs:
    • नाम का उपयोग करना
    • टैग का उपयोग करना
  • फ़िल्टरिंग एएमआई:
    • उदाहरणों का उपयोग करके
    • एक वांछित क्षमता के साथ ऑटोसालिंग समूहों (लॉन्च कॉन्फ़िगरेशन) से 0 पर सेट किया गया
    • ऑटोकॉस्टिंग समूहों से अलग किए गए लॉन्च कॉन्फ़िगरेशन से
  • यह निर्दिष्ट करना कि आप कितने एएमआई रखना चाहते हैं
  • सफाई अनाथ फोटो
  • थोड़ी सी रिपोर्टिंग

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

नमूना छूट जाता है कि कोड क्या है:

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

स्नैपशॉट की सूची के बारे में भेजें। यह निर्माण:

<(...)

commदो "फाइलों" से कमांड पढ़ने और उनकी तुलना करने के लिए वर्चुअल अस्थाई फाइलहैंडलर बनाएं


क्या आपने इसका परीक्षण किया? मुझे वही लेख मिला लेकिन वह काम नहीं कर सकता। यदि आप कर सकते हैं, मेरे अंत में उपयोगकर्ता त्रुटि, लेकिन मुझे डर है कि यह लेख की उम्र के आधार पर पुराना हो सकता है।
एलेक्स

@ एलेक्स, कल इसकी जाँच कर सकते हैं
रोमियो

कमांड देखें बदल गए हैं, aws ec2 वर्णन / डिलीट का उपयोग करें
Tensibai

1
मैं एक ही स्रोत पाया, लेकिन हीरो जगा सॉर्ट और uniq मेरे खोल कोडर पक्ष उदास बनाता है, मैं कल अपने संस्करण पोस्ट करेंगे :)
Tensibai

1
मेरे लिए ठीक है, बस आपको कुछ (रचनात्मक) प्रतिक्रिया प्रदान करना चाहता था ताकि आपको पता चल सके कि शायद एक विशेषज्ञ (आप जैसे) को नियमित अंग्रेजी की तरह क्या दिखता है, मेरे लिए चीनी बहुत अच्छा लगता है, ठीक है? पुनश्च: और यह या तो फ्लेमिश ध्वनि नहीं करता है ... मुझे एक अतिरिक्त टिप्पणी छोड़ दें यदि आप कर रहे हैं के बाद मुझे सूचित करना चाहते हैं (यदि आप मेरी अद्यतन प्रतिक्रिया चाहते हैं तो)।
Pierre.Vriens

2

यहाँ एक GitHub Gist कोड स्निपेट है जिसे आप डेनियल यारोस्लावसेव द्वारा मांग रहे हैं।

यह सभी छवियों और उनके स्नैपशॉट की सूची का उपयोग करता है और आईडी की तुलना सभी स्नैपशॉट आईडी से करता है। जो भी अवशेष हैं वे अनाथ हैं। कोड ऊपर दिए गए उत्तर के रूप में एक ही सिद्धांत में काम करता है, लेकिन बेहतर स्वरूपित और थोड़ा अधिक पठनीय है।

--query Snapshots[*].SnapshotIdविकल्प के साथ कोड JMESPath का लाभ उठाता है (यदि आप इसके वितरण में हैं, तो आप इसके लिए jp कमांड लाइन उपयोगिता का उपयोग कर सकते हैं। पाठ के साथ आउटपुट स्वरूपित करता है --output text। यहां एपीआई संदर्भ और कुछ उदाहरणों के लिए एक लिंक है। यह थोड़ा है grep / awk / sort / uniq / tr पाइप की एक लंबी श्रृंखला से अधिक सुरुचिपूर्ण।

टॉड वाल्टन द्वारा चेतावनी : 'jq' उपयोगिता के साथ गलती न करें जो json दस्तावेजों को पार्स करने के लिए विभिन्न क्वेरी भाषा का उपयोग करता है।


बस FYI करें, JQ कमांड लाइन उपयोगिता है नहीं क्या "एडब्ल्यूएस" कमांड का उपयोग करता है के रूप में ही JSON क्वेरी भाषा। "Aws" कमांड JMESPath का उपयोग करता है।
टॉड वाल्टन

उसे इंगित करने के लिए धन्यवाद। मैंने आज कुछ नया सीखा है।
जिरी क्लौडा

0

मैं लिखा है snapshots.py स्क्रिप्ट जो (क्षेत्रों में से परिभाषित सूची में) सभी स्नैपशॉट से अधिक iterates और उत्पन्न करता है report.csv। इस फ़ाइल में सभी स्नैपशॉट द्वारा संदर्भित उदाहरण, AMI और वॉल्यूम के बारे में जानकारी है।

अंतःक्रियात्मक रूप से झूलने वाले स्नैपशॉट को हटाने का आदेश भी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.