Hier ist etwas super cooles, was ich mit AWS SSM Send-Command mache!
Mit Apache Airflow erstelle ich eine brandneue EC2-Instanz mit einer Cloud Formation-Vorlage (kurz CFT), die nur eine JSON-Datei mit allen gewünschten Konfigurationswerten für meine EC2-Instanz ist. Beachten Sie auch, dass ich in dieser CFT auch einen Bootstrap-Befehl habe, der ein Python-Skript von einem S3-Speicherort in die neue EC2-Instanz kopiert, damit ich es später mit einem SSM-Sendebefehl ausführen kann! Ich mache dies mit Python3 und dem AWS SDK für Python3 namens Boto3-Bibliothek. Hier ist ein Teil des Befehls zum Erstellen des neuen CFT-Stapels, der wiederum meine neue EC2-Instanz erstellt:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Dann kann ich die Instanz-ID der neuen EC2-Instanz (erforderlich, um den SSM-Sendebefehl zu verwenden) wie folgt abrufen:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Dann kann ich die Instanz-ID der EC2-Instanz des aktuellen Airflow Worker-Servers erhalten, indem ich diesen Befehl wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
über Python ausführe:
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]
JETZT!!!! FÜR DAS GRAND FINALE
Ich kann dann ein Skript auf der neuen EC2-Instanz ausführen, die ich erstellt habe, und dieses Skript mit allen gewünschten Parametern / Argumenten senden ... einschließlich der Instanz-ID des Servers, der den SSM-Sendebefehl gesendet hat, damit mein Skript fertig ist Auf der neuen EC2-Instanz kann ein weiterer SSM-Sendebefehl an meinen Airflow-Server zurückgesendet werden, um ihm mitzuteilen, dass das Skript fertig ist. Dies ist auf einem sehr hohen Niveau ohne Details, aber es dient nur dazu, eine Idee zu demonstrieren :)
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'))
Ich bin mir nicht sicher, ob dies jemandem geholfen hat, aber es ist ein cooles und lustiges Beispiel dafür, wie man etwas mit dem AWS SSM Send-Command macht! Allerdings riecht wahrscheinlich ein Code xD