นี่คือสิ่งที่ยอดเยี่ยมที่ฉันทำกับ 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