Voici quelque chose de super cool que je fais avec AWS SSM Send-Command!
En utilisant Apache Airflow, je crée une toute nouvelle instance EC2 en utilisant un modèle de formation cloud (ou CFT pour faire court) qui est juste un fichier JSON avec toutes les valeurs de configuration pour mon instance EC2 que je veux; notez également que dans ce CFT, j'ai également une commande d'amorçage qui copie un script Python d'un emplacement S3 vers la nouvelle instance EC2 afin que je puisse l'exécuter plus tard à l'aide d'une commande d'envoi SSM! Je fais cela en utilisant Python3 et le SDK AWS pour Python3 appelé la bibliothèque Boto3. Voici une partie de la commande de création de la nouvelle pile CFT qui, à son tour, crée ma nouvelle instance EC2:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Ensuite, je peux obtenir l'ID d'instance de la nouvelle instance EC2 (nécessaire pour utiliser la commande d'envoi SSM) en utilisant quelque chose comme ceci:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Ensuite, je peux obtenir l'ID d'instance de l'instance EC2 du serveur actuel d'Airflow Worker en exécutant cette commande wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
via 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]
MAINTENANT!!!! POUR LA GRANDE FINALE
Je peux ensuite exécuter un script sur la nouvelle instance EC2 que j'ai créée et envoyer ce script quels que soient les paramètres / arguments que je veux ... y compris l'ID d'instance du serveur qui a envoyé la commande d'envoi SSM de cette façon lorsque mon script est terminé exécuté sur la nouvelle instance EC2, il peut renvoyer une autre commande SSM Send-Command à mon serveur Airflow pour lui indiquer que le script est terminé. C'est à un niveau très élevé sans détails mais c'est juste pour démontrer une idée :)
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'))
Je ne sais pas si cela a aidé quelqu'un, mais c'est un exemple sympa et amusant de faire quelque chose avec l'AWS SSM Send-Command! Quoique, probablement une odeur de code xD