Вот что-то очень крутое, что я делаю с AWS SSM Send-Command!
Используя Apache Airflow, я создаю новый EC2-экземпляр, используя шаблон формирования облака (или сокращенно CFT), это просто файл JSON со всеми значениями конфигурации для моего EC2-экземпляра, который я хочу; Также обратите внимание, что в этом CFT у меня также есть команда начальной загрузки, которая копирует скрипт Python из местоположения S3 в новый экземпляр EC2, чтобы я мог выполнить его позже с помощью команды SSM Send! Я делаю это, используя Python3 и AWS SDK для Python3, называемые библиотекой Boto3. Вот часть команды для создания нового стека CFT, которая, в свою очередь, создает мой новый экземпляр EC2:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Затем я могу получить Instance-ID нового EC2-экземпляра (необходимого для использования SSM Send-Command), используя что-то вроде этого:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Затем я могу получить идентификатор экземпляра текущего экземпляра EC2 сервера Airflow Worker, выполнив эту команду wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
через 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]
ТЕПЕРЬ!!!! ДЛЯ БОЛЬШОГО ФИНАЛА
Затем я могу выполнить сценарий для нового созданного мной экземпляра EC2 и отправить этому сценарию любые параметры / аргументы, которые я хочу ... включая идентификатор экземпляра сервера, который отправил команду отправки SSM, таким образом, когда мой сценарий будет выполнен работая на новом экземпляре EC2, он может отправить еще одну команду SSM Send обратно на мой сервер Airflow, чтобы сообщить, что сценарий завершен. Это на очень высоком уровне без подробностей, но это просто для демонстрации идеи :)
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'))
Не уверен, помогло ли это кому-нибудь, но это классный и интересный пример того, как что-то сделать с помощью AWS SSM Send-Command! Хотя, возможно, код запах XD