Oto coś super fajnego, co robię z AWS SSM Send-Command!
Za pomocą Apache Airflow tworzę zupełnie nową instancję EC2 przy użyciu szablonu formacji chmurowej (w skrócie CFT), który jest tylko plikiem JSON ze wszystkimi wartościami konfiguracji dla mojej instancji EC2, którą chcę; Zauważ też, że w tym CFT mam również polecenie bootstrap, które kopiuje skrypt Pythona z lokalizacji S3 do nowej instancji EC2, dzięki czemu mogę go później wykonać za pomocą polecenia wysyłania SSM! Robię to za pomocą Python3 i AWS SDK dla Python3 o nazwie biblioteka Boto3. Oto część polecenia tworzenia nowego stosu CFT, który z kolei tworzy moją nową instancję EC2:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Następnie mogę uzyskać identyfikator nowej instancji EC2 (wymagany do użycia polecenia wysyłania SSM) za pomocą czegoś takiego:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Następnie mogę uzyskać identyfikator wystąpienia bieżącej instancji EC2 serwera bieżącego pracownika Airflow, uruchamiając tę komendę wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
za pomocą języka 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]
TERAZ!!!! NA WIELKI FINAŁ
Następnie mogę wykonać skrypt na utworzonej przeze mnie nowej instancji EC2 i wysłać ten skrypt bez względu na parametry / argumenty, jakie chcę ... w tym identyfikator instancji serwera, który wysłał polecenie wysyłania SSM, w ten sposób po zakończeniu skryptu działając na nowej instancji EC2, może wysłać kolejną komendę SSM Send-Command z powrotem na mój serwer Airflow, aby poinformować go, że skrypt został zakończony. To jest na bardzo wysokim poziomie bez szczegółów, ale to tylko demonstracja pomysłu :)
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'))
Nie jestem pewien, czy to pomogło komukolwiek, ale jest to fajny i zabawny przykład robienia czegoś z AWS SSM Send-Command! Chociaż prawdopodobnie kod pachnie xD