จะรันสคริปต์หรือคำสั่งบนอินสแตนซ์ของ EC2 ผ่าน AWS CLI ได้อย่างไร


13

อ้างอิงจากบทความข่าวใหม่ของคำสั่งเรียกใช้ EC2 Run , AWS 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 บทความนั้นมาจากปี 2558 ดังนั้นฉันจะไม่เรียกมันว่าคำสั่งย่อย "ใหม่" ฉันเช็คเอาท์ที่เก็บซอร์สโค้ด ( github.com/aws/aws-cli ) สำหรับ aws-cli และฉันไม่สามารถพูดถึงมันในเอกสารตัวอย่างบันทึกย่อรีลีสหรือดูรหัสสั้น ๆ . ฉันยื่นปัญหา ( github.com/aws/aws-cli/issues/3126 ) และจะส่งคำตอบเมื่อฉันได้รับคำติชม
PrestonM

คำตอบ:


11

วิธีรัน ipconfig จากคำสั่ง Run AWS Systems Manager:

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

หมายเหตุ: --regionหากคุณได้มีข้อผิดพลาดให้พิจารณาระบุที่เหมาะสม

สิ่งนี้ถือว่าคุณมีข้อมูลประจำตัว AWS และ CLI ที่กำหนดค่าไว้อย่างเหมาะสม ดูคำแนะนำการใช้งานระบบของผู้จัดการคำสั่งการใช้ AWS 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

นี่คือสคริปต์ Bash ของผู้ช่วยเหลือซึ่งใช้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?


ตัวอย่างที่ดีที่สุดจริง ๆ ที่นี่ โปรดอัปเดตมากขึ้น
Sanctus

3

ใช่คุณสามารถทำได้ด้วยตัวจัดการ AWS Systems คำสั่ง Run AWS Systems Manager ช่วยให้คุณสามารถเรียกใช้ชุดคำสั่งจากระยะไกลและปลอดภัยบน EC2 เช่นเดียวกับเซิร์ฟเวอร์ในสถานที่ ด้านล่างเป็นขั้นตอนระดับสูงเพื่อให้บรรลุสิ่งนี้

แนบบทบาท IAM อินสแตนซ์: อินสแตนซ์ ec2 ต้องมีบทบาท IAM กับนโยบาย AmazonSSMFullAccess บทบาทนี้เปิดใช้งานอินสแตนซ์เพื่อสื่อสารกับ Systems Manager API

ติดตั้งตัวแทน SSM: อินสแตนซ์ EC2 ต้องมีตัวแทน SSM ติดตั้งอยู่ ตัวแทน SSM ประมวลผลคำสั่งเรียกใช้และตั้งค่าอินสแตนซ์ตามคำสั่ง

ดำเนินการคำสั่ง: ตัวอย่างการใช้งานผ่าน AWS CLI:

ดำเนินการคำสั่งต่อไปนี้เพื่อดึงบริการที่ทำงานอยู่บนอินสแตนซ์ แทนที่ Instance-ID ด้วย id อินสแตนซ์ของ 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

นี่คือสิ่งที่ยอดเยี่ยมที่ฉันทำกับ AWS SSM Send-Command!

การใช้ Apache Airflow ฉันสร้าง EC2-Instance ใหม่โดยใช้เทมเพลต Cloud Formation (หรือ CFT สั้น ๆ ) นั่นเป็นเพียงไฟล์ JSON ที่มีค่าการตั้งค่าทั้งหมดสำหรับ EC2-Instance ของฉันที่ฉันต้องการ โปรดทราบว่าใน CFT นี้ฉันยังมีคำสั่ง bootstrap ที่คัดลอกสคริปต์ Python จากตำแหน่ง S3 ไปยัง EC2-Instance ใหม่เพื่อที่ฉันจะสามารถดำเนินการได้ในภายหลังโดยใช้คำสั่งส่ง SSM! ฉันทำสิ่งนี้โดยใช้ Python3 และ AWS SDK สำหรับ Python3 ที่เรียกว่าไลบรารี Boto3 นี่เป็นส่วนหนึ่งของคำสั่งสำหรับการสร้าง CFT Stack ใหม่ซึ่งจะสร้าง EC2-Instance ใหม่ของฉัน:

import boto3

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

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

จากนั้นฉันจะได้รับ Instance-ID ของ EC2-Instance ใหม่ (จำเป็นต้องใช้ SSM Send-Command) โดยใช้สิ่งนี้:

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

จากนั้นฉันจะได้รับ Instance-ID ของเซิร์ฟเวอร์ EC2-Instance ของ Airflow Worker ปัจจุบันโดยการรันคำสั่งนี้wget -q -O - http://169.254.169.254/latest/meta-data/instance-idผ่าน Python:

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 ใหม่ที่ฉันสร้างและส่งสคริปต์ใด ๆ ก็ตามที่พารามิเตอร์ / อาร์กิวเมนต์ที่ฉันต้องการ ... รวมถึง Instance-ID ของเซิร์ฟเวอร์ที่ส่งคำสั่ง SSM Send เพื่อให้วิธีการเมื่อสคริปต์ของฉันเสร็จสิ้น ทำงานบน EC2-Instance ใหม่มันสามารถส่งคำสั่งส่ง SSM อื่นกลับไปยังเซิร์ฟเวอร์ Airflow ของฉันเพื่อบอกว่าสคริปต์เสร็จสิ้นแล้ว อยู่ในระดับสูงมากโดยไม่มีรายละเอียด แต่เป็นเพียงการแสดงความคิด :)

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

ไม่แน่ใจว่าสิ่งนี้ช่วยใครก็ได้ แต่มันเป็นตัวอย่างที่ยอดเยี่ยมและสนุกกับการทำอะไรบางอย่างกับคำสั่งการส่ง AWS SSM! แม้ว่ารหัสอาจจะเป็นกลิ่น xD

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.