Ecco qualcosa di fantastico che faccio con AWS SSM Send-Command!
Usando Apache Airflow creo una nuovissima istanza EC2 utilizzando un modello di formazione cloud (o CFT in breve) che è solo un file JSON con tutti i valori di configurazione per la mia istanza EC2 che desidero; nota anche che in questo CFT ho anche un comando bootstrap che copia uno script Python da una posizione S3 alla nuova istanza EC2 in modo da poterlo eseguire in seguito usando un comando di invio SSM! Faccio questo usando Python3 e l'SDK AWS per Python3 chiamato libreria Boto3. Ecco parte del comando per creare il nuovo stack CFT che a sua volta crea la mia nuova istanza EC2:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Quindi posso ottenere l'ID istanza del nuovo EC2-Instance (necessario per utilizzare il comando di invio SSM) usando qualcosa del genere:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Quindi posso ottenere l'ID istanza dell'istanza EC2 del server di Airflow Worker corrente eseguendo questo comando wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
tramite 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]
ADESSO!!!! PER IL GRAND FINALE
Posso quindi eseguire uno script sulla nuova istanza EC2 che ho creato e inviare quello script qualunque parametro / argomento io voglia ... incluso l'ID istanza del server che ha inviato il comando di invio SSM in questo modo quando il mio script è terminato in esecuzione sulla nuova istanza EC2, può inviare un altro comando di invio SSM al mio server Airflow per dirgli che lo script è terminato. Questo è di altissimo livello senza dettagli ma è solo per dimostrare un'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'))
Non sono sicuro che questo abbia aiutato qualcuno, ma è un esempio divertente e DIVERTENTE di fare qualcosa con il comando di invio SSM di AWS! Anche se, probabilmente un odore di codice xD