¡Aquí hay algo súper genial que hago con AWS SSM Send-Command!
Usando Apache Airflow, creo una nueva instancia EC2 usando una plantilla de formación en la nube (o CFT para abreviar) que es solo un archivo JSON con todos los valores de configuración para mi instancia EC2 que quiero; También tenga en cuenta que en este CFT también tengo un comando de arranque que copia un script de Python desde una ubicación S3 a la nueva instancia EC2 para que pueda ejecutarlo más tarde usando un comando de envío SSM. Hago esto usando Python3 y el SDK de AWS para Python3 llamado la biblioteca Boto3. Aquí está parte del comando para crear la nueva pila CFT que a su vez crea mi nueva instancia EC2:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Entonces puedo obtener la ID de instancia de la nueva instancia EC2 (requerida para usar SSM Send-Command) usando algo como esto:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Luego puedo obtener la ID de instancia de la instancia EC2 del servidor del trabajador de flujo de aire actual ejecutando este comando a wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
través de 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]
¡¡¡¡AHORA!!!! PARA LA GRAN FINAL
Luego puedo ejecutar una secuencia de comandos en la nueva instancia EC2 que creé y enviar esa secuencia de comandos cualquier parámetro / argumento que desee ... incluyendo el ID de instancia del servidor que envió el comando de envío SSM para que así cuando termine mi secuencia de comandos ejecutándose en la nueva instancia EC2, puede enviar otro comando de envío SSM a mi servidor Airflow para indicarle que el script ha finalizado. Esto está en un nivel muy alto sin detalles, pero es solo para demostrar una idea :)
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'))
No estoy seguro de si esto ayudó a alguien, ¡pero es un ejemplo divertido y divertido de hacer algo con el comando de envío de AWS SSM! Aunque, probablemente un código de olor xD