समय आधारित कार्यक्रम के आधार पर AWS EC2 उदाहरण को कैसे शुरू और बंद किया जाए


17

क्या प्रत्येक दिन एक निश्चित समय पर AWS EC2 उदाहरणों को शुरू करने और रोकने का एक आसान तरीका है? यह मुझे मेरे विकास और परीक्षण सर्वर के लिए काफी पैसा बचा सकता है।

जवाबों:


16

अपडेट करें

AWS ने " इंस्टालेशन शेड्यूलर " नामक एक टूल जारी किया है , जिसमें एक पूर्ण कॉन्फ़िगरेशन गाइड शामिल है जो उस पेज से जुड़ा हुआ है। यह EC2 शेड्यूलर की एक वृद्धि के रूप में दिखता है जिसका मैं नीचे वर्णन करता हूं, कुछ और विशेषताओं के साथ, लेकिन यह अनिवार्य रूप से एक ही बात है।

नीचे दिया गया मार्गदर्शिका अभी भी काम करेगा, लेकिन नई स्थापनाओं के लिए उदाहरण शेड्यूलर को देखना बेहतर होगा।

मूल पोस्ट

AWS के पास EC2 शेड्यूलर नामक एक उपकरण है जो EC2 उदाहरणों को शुरू करने और रोकने पर आपको बहुत लचीला नियंत्रण प्रदान करता है।

टूल आपको टूल सेट करते समय डिफ़ॉल्ट स्टार्ट और स्टॉप समय को परिभाषित करने की अनुमति देता है, जिसे आप बाद में बदल सकते हैं। आप चुन सकते हैं कि कौन से उदाहरण नियंत्रित होते हैं, आप और टैग का उपयोग करके प्रत्येक उदाहरण के लिए अलग-अलग प्रारंभ और स्टॉप समय निर्दिष्ट कर सकते हैं।

हालांकि यह एक महान उपकरण है प्रलेखन कुछ अस्पष्ट और भ्रमित है। यह ऐसा है जैसे प्रलेखन एक इंजीनियर द्वारा लिखा गया है जिसने उपकरण लिखा था और तकनीकी लेखक के बजाय इसके बारे में सब कुछ जानता है।

नोट : यदि आपके पास प्रतिक्रिया या सुधार है तो टिप्पणियों की सराहना की जाती है। यदि आपके पास इस पर आधारित कोई प्रश्न है तो कृपया अपना प्रश्न शुरू करें।

EC2 शेड्यूलर क्या है

यह उपकरण एक लैम्ब्डा फंक्शन है जो क्लाउडवॉच इवेंट्स और डायनमोबी के साथ काम करता है। इसे क्लाउडफॉर्म टेम्प्लेट का उपयोग करके तैनात किया गया है, जो आवश्यक IAM भूमिकाओं और नीतियों को भी सेट करता है। आप यहां की वास्तुकला के बारे में पढ़ सकते हैं ।

AWS EC2 शेड्यूलर आर्किटेक्चर

तैनाती

इस पृष्ठ पर जाकर शुरू करें और "लॉन्च समाधान" पर क्लिक करें। अभी सीधा लिंक यहाँ है , लेकिन यह बदल सकता है।

उस क्षेत्र का चयन करें जिसे आप कंसोल के शीर्ष पर तैनात संसाधन चाहते हैं। स्क्रिप्ट किसी भी क्षेत्र में EC2 उदाहरणों को नियंत्रित करती है, लेकिन यह एक क्षेत्र में चलती है।

EC2 उदाहरणों को टैग करना

यह यहाँ प्रलेखन में शामिल है , लेकिन यह उतना सरल नहीं है जितना कि यह हो सकता है।

आप नियंत्रित करते हैं कि कौन से इंस्टेंस आपके इंस्टेंसेस को टैग करके शुरू और बंद किए जाते हैं।

सबसे सरल मामला आपको प्रत्येक EC2 उदाहरण को टैग करने की आवश्यकता है जिसे आप शेड्यूल के अनुसार शुरू और बंद करना चाहते हैं। ऐसा करने के लिए कंसोल में अपना EC2 उदाहरण ढूंढें, टैग पर क्लिक करें और इस टैग को बनाएं

शेड्यूलर के लिए EC2 इंस्टेंस टैगिंग

कॉपी और पेस्ट सक्षम करने के लिए:

  • कुंजी: अनुसूचक: ec2-startstop
  • मूल्य: सच है

यदि आप चाहते हैं कि एक विशिष्ट शेड्यूल शुरू हो और बंद हो जाए तो आप टैग कुंजी और मान के लिए अतिरिक्त जानकारी जोड़ते हैं। उदाहरण के लिए यदि आप 1500 यूटीसी पर शुरू करना चाहते हैं और मंगलवार, गुरुवार और शुक्रवार को 2400 यूटीसी पर रुकना चाहते हैं, तो आप निम्नलिखित दर्ज करें।

कुंजी: अनुसूचक: ec2-startstop: late value: 1500; 2400; utc; tue, thu, fri;

ध्यान दें कि शब्द "लेट" कोई भी स्ट्रिंग हो सकता है, "लेट" का कोई विशेष अर्थ नहीं है।

आप इस टूल का उपयोग करके UTC को अपने स्थानीय समय में बदल सकते हैं ।

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

CloudFormation Parameters

जब आप CloudFormation टेम्पलेट चलाते हैं, तो आपको बहुत सारे पैरामीटर दर्ज करने होते हैं। अधिकांश आप डिफ़ॉल्ट रूप से छोड़ सकते हैं। यहाँ कुछ सबसे महत्वपूर्ण पैरामीटर हैं

  • स्टैक नाम: इसे आप की तरह कुछ भी कहते हैं। क्लाउडफ़ॉर्मेशन में इसे ही कहा जाता है।
  • कस्टम टैग नाम: यह उस टैग की "कुंजी" है जिसे आपने EC2 उदाहरण के विरुद्ध रखा है। इसे डिफ़ॉल्ट मूल्य पर छोड़ दें जब तक कि आपके पास एक अच्छा कारण नहीं है, या कई प्रतिष्ठानों की आवश्यकता है।
  • डिफ़ॉल्ट स्टार्ट / स्टॉप टाइम: इंस्टेंसेस को शुरू करने और रोकने के लिए डिफ़ॉल्ट यूटीसी समय
  • DynamoDB: DynamoDB में सेटिंग्स संग्रहीत की जाती हैं। आप तालिका का नाम और ऐसे बदल सकते हैं। क्योंकि DynamoDB फ्री टियर की समय सीमा समाप्त नहीं होती है, इसलिए अधिकांश लोगों से शुल्क नहीं लिया जाता है।
  • (दूसरी स्क्रीन) अनुमतियाँ - यह एक लाल हेरिंग है, नीचे अनुभाग देखें। जब आप EC2 शेड्यूलर सेट करने का प्रयास करते हैं, तो इसे डिफ़ॉल्ट के रूप में छोड़ दें, और व्यवस्थापक के रूप में चल रहा हो।
  • अधिसूचना विकल्प: मुझे एसएनएस नोटिफिकेशन सेट करना उपयोगी लगा, ताकि मैं यह सत्यापित कर सकूं कि यह काम कर रहा है। मैंने उन्हें निष्क्रिय करने के तरीके के लिए समय नहीं बिताया है, मैंने इसे पुनः स्थापित करने के लिए क्लाउडफॉर्म टेम्पलेट को फिर से चलाया।

अनुमतियाँ, नीतियाँ और भूमिकाएँ

CloudFormation टेम्पलेट का अनुमतियाँ / IAM भूमिका अनुभाग एक लाल हेरिंग है - अर्थात यह काफी हद तक अप्रासंगिक है। यह केवल क्लाउडफ़ॉर्मेशन स्क्रिप्ट को चलाने के लिए उपयोग की जाने वाली भूमिका को निर्दिष्ट करता है, यह बनाए गए संसाधनों या लैंबडा फ़ंक्शन चलाने पर उपयोग की जाने वाली भूमिका से कोई फ़र्क नहीं पड़ता है। पूर्वव्यापी में यह स्पष्ट है, लेकिन जब मैंने शुरू किया तो यह मेरे लिए स्पष्ट नहीं था।

इस स्क्रिप्ट को आप जो भी भूमिका निभाते हैं वही भूमिका और इनलाइन अनुमतियां IAM के भीतर बनाई जाती हैं। लैम्ब्डा फ़ंक्शन एक "ec2 अनुसूचक भूमिका" का उपयोग करता है जो स्क्रिप्ट बनाता है।

मैंने अपनी नीतियों को नीचे शामिल कर लिया है, जब वे किसी के लिए सहायक हों।

क्लाउडवाच इवेंट्स एंड मेट्रिक्स

यदि आप अपने लैम्बडा फंक्शन से लॉग देखना चाहते हैं तो क्लाउडवॉच इवेंट्स में जाएं। लॉगिंग काफी अच्छी है। साथ ही मेट्रिक्स भी हैं, इसलिए आप देख सकते हैं कि यह कब चलता है, कब चलता है, आदि।

अतिरिक्त

लैम्ब्डा फ़ंक्शन के लिए कोड Github पर उपलब्ध है ।

नीतियाँ

ये आम तौर पर आवश्यक नहीं होते हैं, लेकिन किसी के लिए हो सकते हैं इसलिए मैं उन्हें शामिल करूंगा।

IAM भूमिका के लिए नीति

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

IAM भूमिका के लिए ट्रस्ट नीति

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

अमेज़ॅन ने तब से चीजों को बदल दिया है - "EC2 शेड्यूलर को एडब्ल्यूएस इंस्टेंस शेड्यूलर द्वारा अधिगृहीत किया गया है"
मैक्स बैरक्लोफ़

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

1
यह अविश्वसनीय है कि वे चीजों को कैसे जटिल करना पसंद करते हैं ...
मेहंदी

10

यदि आप केवल उदाहरणों को शुरू करना और रोकना चाहते हैं, तो यहां एक और तरीका है जो लैम्बडा सेवा का उपयोग करता है। यह मानता है कि आप एक विशिष्ट इंस्टेंस आईडी को नियंत्रित करना चाहते हैं। आप अल्पविराम द्वारा अलग किए गए अधिक आईडी जोड़कर कई उदाहरणों को नियंत्रित कर सकते हैं। (उदा: 'i-3453453', 'i-45656745')। आप अपने उदाहरण की आईडी AWS कंसोल इंस्टेंस सेक्शन में पा सकते हैं।

लैंबडा कंसोल में

  1. AWS लैम्ब्डा कंसोल खोलें, और क्रिएट फंक्शन चुनें।
  2. स्क्रैच से लेखक चुनें।
  3. अपने फ़ंक्शन के लिए एक नाम दर्ज करें, जैसे "StopEC2Instances।"
  4. रनटाइम के लिए, पायथन 2.7 का चयन करें
  5. रोल ड्रॉप-डाउन मेनू का विस्तार करें, और एक कस्टम रोल बनाएँ चुनें। यह आपके ब्राउज़र में एक नया टैब या विंडो खोलता है।
  6. IAM रोल ड्रॉप-डाउन मेनू में, एक नया IAM रोल बनाएँ का चयन करें, और एक रोल नाम दर्ज करें, जैसे कि "lambda_start_stop_ec2।"
  7. दस्तावेज़ीकरण पढ़ने के लिए संकेत मिलने पर दृश्य नीति दस्तावेज़, संपादन चुनें और फिर Ok चुनें। नीति के सभी पाठ इस से बदलें:

नीचे कोड

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}
  1. भूमिका बनाना समाप्त करने की अनुमति दें और AWS लैम्ब्डा कंसोल पर लौटें।
  2. अपने इंस्टेंस को रोकने के लिए, फंक्शन कोड एडिटर के सभी टेक्स्ट को निम्न के साथ बदलें:

नीचे कोड

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

क्षेत्र और उदाहरण के मूल्यों को अपने साथ बदलना याद रखें।

  1. रनटाइम ड्रॉप-डाउन मेनू से, Python2.7 चुनें।
  2. मूल सेटिंग्स में, फ़ंक्शन टाइमआउट के लिए 10 सेकंड दर्ज करें।
  3. सहेजें चुनें।
  4. एक और फ़ंक्शन बनाने के लिए सभी चरणों को दोहराएं जो आपके उदाहरणों को शुरू करेगा, लेकिन फिर यह सब शुरू करने के लिए इस अजगर स्क्रिप्ट का उपयोग करें:

नीचे कोड

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

कार्यों को शेड्यूल करें

यहां आप क्लाउडवेच इवेंट बनाएंगे जो रात में आपके लैम्ब्डा फ़ंक्शन को ट्रिगर करेगा

  1. Amazon CloudWatch कंसोल खोलें।
  2. ईवेंट चुनें, और फिर नियम बनाएँ चुनें।
  3. ईवेंट स्रोत के तहत शेड्यूल चुनें।
  4. समय या क्रॉन अभिव्यक्ति का अंतराल दर्ज करें जो आपके उदाहरणों को रोकने के लिए लैम्ब्डा को बताता है। सही सिंटैक्स पर अधिक जानकारी के लिए, नियमों के लिए शेड्यूल एक्सप्रेशन सिंटैक्स देखें।

नोट: UTC में क्रोन अभिव्यक्तियों का मूल्यांकन किया जाता है। अपने पसंदीदा समय क्षेत्र के लिए अभिव्यक्ति को समायोजित करना सुनिश्चित करें। यहाँ एक उदाहरण है जो प्रतिदिन 08:00 GMT / UTC पर फ़ंक्शन चलाएगा):

0 08 * * ? *
  1. जोड़ें लक्ष्य चुनें, और फिर लैम्ब्डा फ़ंक्शन चुनें।
  2. फ़ंक्शन के लिए, लैंबडा फ़ंक्शन चुनें जो आपके उदाहरणों को रोकता है।
  3. कॉन्फ़िगर विवरण चुनें।
  4. दिए गए क्षेत्रों में निम्नलिखित जानकारी दर्ज करें: नाम के लिए, एक सार्थक नाम दर्ज करें, जैसे कि "StopEC2Instances।" विवरण के लिए, सार्थक विवरण जोड़ें, जैसे "रात में हर दिन ईसी 2 इंस्टेंसेस को रोकता है।" राज्य के लिए, सक्षम का चयन करें।
  5. नियम बनाएँ चुनें।

सुबह अपने उदाहरणों को पुनः आरंभ करने के लिए, इन चरणों को दोहराएं और अपने पसंदीदा प्रारंभ समय का उपयोग करें। यदि आप एक मेल संदेश भेजना चाहते हैं जब भी फ़ंक्शन विफल हो जाते हैं, तो आप एक SNS विषय सेट कर सकते हैं और Lmbda फ़ंक्शन क्रिएशन विंडो में डीबगिंग के तहत उस संदेश को भेजने को कॉन्फ़िगर कर सकते हैं।

इस सब का स्रोत यहां पाया जा सकता है: एडब्ल्यूएस प्रलेखन


कैसे पृथ्वी पर आप संपादक में पायथन कोड को ठीक से देख सकते हैं, जैसे यह अभी-अभी निकला है?
3

मदद पर क्लिक करें '' और आपको मार्कडाउन फॉर्मेटिंग का उपयोग करने पर अधिक मिलेगा। serverfault.com/editing-help
jscott

1
यह स्वरूपण कोड में एक बग है। आपको अलग-अलग प्रारूपण के बीच सादा पाठ रखना होगा - इस मामले में एक कोड ब्लॉक और एक नंबर ब्लॉक। इसलिए मैं "कोड नीचे" डालता हूं - सभी जगहों पर इसका कोई मतलब नहीं है, लेकिन यह काम करता है।
टिम

@ स्पष्ट करने के लिए धन्यवाद। मैं नहीं जानता था कि। इसने क्रोन अभिव्यक्ति के प्रारूपण को भी हल किया। एक बार फिर धन्यवाद।
नेटफेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.