Ini adalah sesuatu yang sangat keren yang saya lakukan dengan AWS SSM Send-Command!
Menggunakan Apache Airflow, saya membuat EC2-Instance baru menggunakan Cloud Formation Template (atau singkatnya CFT) yang hanya berupa file JSON dengan semua nilai konfigurasi untuk EC2-Instance yang saya inginkan; juga perhatikan bahwa dalam CFT ini saya juga memiliki perintah bootstrap yang menyalin skrip Python dari lokasi S3 ke EC2-Instance baru sehingga saya dapat menjalankannya nanti menggunakan SSM Send-Command! Saya melakukan ini menggunakan Python3 dan AWS SDK untuk Python3 disebut perpustakaan Boto3. Inilah bagian dari perintah untuk membuat CFT Stack baru yang pada gilirannya menciptakan EC2-Instance baru saya:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Kemudian saya bisa mendapatkan Instance-ID EC2-Instance baru (diperlukan untuk menggunakan SSM Send-Command) menggunakan sesuatu seperti ini:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Kemudian saya bisa mendapatkan Instance-ID dari EC2-Instance server Airflow Worker saat ini dengan menjalankan perintah ini wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
melalui 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]
SEKARANG!!!! UNTUK FINAL GRAND
Saya kemudian dapat menjalankan skrip pada EC2-Instance baru yang saya buat dan mengirimkan skrip itu parameter / argumen apa pun yang saya inginkan ... termasuk Instance-ID dari server yang mengirim SSM Send-Command sehingga saat skrip saya selesai berjalan pada EC2-Instance baru, ia dapat mengirim SSM Send-Command kembali ke server Airflow saya untuk memberi tahu bahwa skrip telah selesai. Ini pada tingkat yang sangat tinggi tanpa detail tetapi hanya untuk menunjukkan ide :)
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'))
Tidak yakin apakah ini membantu siapa pun tetapi ini adalah contoh keren dan MENYENANGKAN melakukan sesuatu dengan AWS SSM Send-Command! Meskipun, mungkin kode bau xD