AWS CLI के माध्यम से EC2 उदाहरण पर स्क्रिप्ट या कमांड कैसे चलाएं?


13

के अनुसार न्यू EC2 भागो कमान समाचार लेख, एडब्ल्यूएस CLI एक नया उप-आदेश दूरस्थ EC2 उदाहरणों पर आलेख निष्पादित करने का समर्थन करना चाहिए।

हालाँकि मैं जाँच कर चुका हूँ aws ec2 help, लेकिन मैं संबंधित आदेश नहीं ढूँढ सकता।

मैंने इसके awsमाध्यम से स्थापित किया है apt-get:

$ aws --version
aws-cli/1.14.32 Python/3.5.4 Linux/4.12.7-64 botocore/1.8.36

जो उप आदेश मैं के लिए दिखना चाहिए और चलाने के लिए, मान लीजिए वाक्य रचना क्या है ipconfigमें PowerShell दूरस्थ EC2 उदाहरण पर?


1
FYI करें कि लेख 2015 से है इसलिए मैं इसे "नया" उप-कमांड नहीं कहूंगा। मैंने स्रोत कोड रिपॉजिटरी ( github.com/aws/aws-cli ) को aws-cli के लिए चेक किया , और मुझे डॉक्स, उदाहरण, रिलीज़ नोट, या संक्षेप में कोड के माध्यम से देखने का कोई उल्लेख नहीं मिला। । मैंने एक मुद्दा ( github.com/aws/aws-cli/issues/3126 ) दायर किया और प्रतिक्रिया देने पर जवाब दूंगा।
प्रेस्टोनएम

जवाबों:


11

AWS सिस्टम मैनेजर रन कमांड से ipconfig चलाने के लिए:

$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --instance-ids "<your instance id>" --parameters commands=ipconfig

नोट: यदि आपको त्रुटि मिली है, तो सही निर्दिष्ट करने पर विचार करें --region

यह मानता है कि आपके AWS क्रेडेंशियल और CLI ठीक से कॉन्फ़िगर किए गए हैं। देखें एडब्ल्यूएस CLI का उपयोग सिस्टम मैनेजर भागो कमान पूर्वाभ्यास अधिक जानकारी के लिए।


यहां कमांड आउटपुट को भेजने और प्राप्त करने का व्यावहारिक शेल कमांड उदाहरण है:

cmdid=$(aws ssm send-command --instance-ids "i-ch3ng3th1s" --document-name "AWS-RunPowerShellScript" --parameters commands=ipconfig --query "Command.CommandId" --output text)
aws ssm list-command-invocations --command-id "$cmdid" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

3

यहाँ एक हेल्पर बैश स्क्रिप्ट है जो aws ssm send-commandकमांड चलाने के लिए उपयोग करता है:

#/usr/bin/env bash -x
# Script to run PowerShell script on the Windows instance.
instanceId="$1"
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands="'${@:2}'")
[ $? -ne 0 ] && { echo "Usage: $0 instance_id command"; exit 1; }
while [ "$(aws ssm list-command-invocations --command-id "$cmdId" --query "CommandInvocations[].Status" --output text)" == "InProgress" ]; do sleep 1; done
aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

उपयोग:

 ./run_ec2_ps_cmd.sh instance-id command

उदाहरण:

$ ./run_ec2_ps_cmd.sh i-xyz hostname
ip-xyz

बड़े आउटपुट निष्पादित करने के लिए, देखें: AWS SSM कमांड को चलाने के दौरान आउटपुट से छंटनी से कैसे बचा जाए?


वास्तव में यहाँ सबसे अच्छा उदाहरण है। अधिक upvotes, कृपया।
सैन्क्ट्स

3

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

उदाहरण के लिए IAM भूमिका संलग्न करें: ec2 उदाहरण में पॉलिसी AmazonSSMFullAccess के साथ IAM भूमिका होनी चाहिए। यह भूमिका सिस्टम मैनेजर API के साथ संचार करने के लिए उदाहरण को सक्षम बनाती है।

SSM एजेंट स्थापित करें: EC2 उदाहरण में SSM एजेंट स्थापित होना चाहिए। SSM एजेंट रन कमांड अनुरोधों को संसाधित करता है और कमांड के अनुसार उदाहरण को कॉन्फ़िगर करता है।

निष्पादित आदेश: AWS CLI के माध्यम से उदाहरण का उपयोग:

उदाहरण पर चल रही सेवाओं को पुनः प्राप्त करने के लिए निम्न आदेश निष्पादित करें। इंस्टेंस-आईडी को Ec2 इंस्टेंस आईडी से बदलें।

aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text

अधिक विस्तृत जानकारी: यहाँ


3

यहाँ कुछ सुपर कूल है जो मैं एडब्ल्यूएस एसएसएम सेंड-कमांड के साथ करता हूं!

अपाचे एयरफ्लो का उपयोग करके मैं क्लाउड फॉर्मेशन टेम्प्लेट (या संक्षेप में CFT) का उपयोग करके एक बिल्कुल नया EC2-Instance बनाता हूं, जो मेरे EC2-Instance के सभी कॉन्फ़िगरेशन मूल्यों के साथ एक JSON फाइल है जो मुझे चाहिए; यह भी ध्यान दें कि इस CFT में मेरे पास एक बूटस्ट्रैप कमांड भी है जो एक S3 लोकेशन से नए EC2-इंस्टेंस पर पायथन स्क्रिप्ट को कॉपी करता है ताकि मैं SSM सेंड-कमांड का उपयोग करने पर इसे बाद में निष्पादित कर सकूं! मैं इसे Python3 और AWS SDK का उपयोग Python3 के लिए Boto3 लाइब्रेरी कहते हैं। यहाँ नया CFT स्टैक बनाने के लिए कमांड का हिस्सा है जो बदले में मेरा नया EC2-Instance बनाता है:

import boto3

cft = boto3.client("cloudformation", "us-east-1")

response = cft.create_stack(
    StackName='foobarStackName',
    TemplateBody=json.dumps(json_data))

तब मैं नए EC2- इंस्टेंस (उदाहरण के लिए SSM सेंड-कमांड का उपयोग करने की आवश्यकता) की इंस्टेंस-आईडी प्राप्त कर सकता हूं:

response = cft.describe_stacks(
    StackName='foobarStackName',
)

तब मैं wget -q -O - http://169.254.169.254/latest/meta-data/instance-idपायथन के माध्यम से इस कमांड को चलाकर वर्तमान एयरफ्लो वर्कर के सर्वर के EC2-इंस्टेंस की इंस्टेंस-आईडी प्राप्त कर सकता हूं :

output = subprocess.Popen(['wget', '-q', '-O', '-', 'http://169.254.169.254/latest/meta-data/instance-id'],
                          stdout=subprocess.PIPE)

# Do some weird stuff to get the value (I'm a Java developer so excuse my bad Python skilz)
instanceId = output.communicate()    
instanceId = str(instanceId).split("'")[1]

अभी!!!! ग्रैंड फिनाले के लिए

फिर मैं अपने द्वारा बनाए गए नए EC2-Instance पर एक स्क्रिप्ट निष्पादित कर सकता हूं और उस स्क्रिप्ट को भेज सकता हूं जो कुछ भी पैरामीटर / तर्क मैं चाहता हूं ... जिसमें एसएसएम सेंड-कमांड भेजने वाले सर्वर की इंस्टेंस-आईडी शामिल है ताकि मेरी स्क्रिप्ट पूरी हो जाए नए EC2-इंस्टेंस पर चल रहा है यह एक और एसएसएम सेंड-कमांड को मेरे एयरफ्लो सर्वर पर वापस भेज सकता है ताकि यह बता सके कि स्क्रिप्ट खत्म हो गई है। यह विवरण के बिना बहुत उच्च स्तर पर है लेकिन यह सिर्फ एक विचार को प्रदर्शित करने के लिए है :)

subprocess.run(shlex.split('sudo aws ssm send-command --document-name "AWS-RunShellScript" --parameters commands=["sudo python3 /home/ec2-user/ec2_file_sensor.py ' + filepath + ' ' + batchIdValue + ' ' + source + ' ' + fileType + ' ' + airflowWorkerInstanceId + '"] --instance-ids ' + ec2ResourceInstanceId + ' --region us-east-1'))

यकीन नहीं होता कि इससे किसी को मदद मिली, लेकिन यह एडब्ल्यूएस एसएसएम सेंड-कमांड के साथ कुछ करने का एक अच्छा और मजेदार उदाहरण है! यद्यपि, शायद एक कोड गंध xD है

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