Ось щось надзвичайно круто, що я роблю з AWS SSM Send-Command!
Використовуючи Apache Airflow, я створюю абсолютно новий EC2-екземпляр за допомогою шаблону формування хмари (або коротко CFT), що є лише файлом JSON з усіма значеннями конфігурації для мого EC2-інстанції, який я хочу; також зауважте, що в цьому CFT у мене також є команда завантаження, яка копіює скрипт Python з місця розташування S3 до нового EC2-інстанції, щоб я міг виконати його пізніше, використовуючи SSM Send-Command! Я роблю це за допомогою 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))
Тоді я можу отримати ідентифікатор інстанції нового 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 Send-Command так, коли мій сценарій виконаний працює на новому EC2-інстанції, він може відправити ще один SSM Send-Command назад на мій сервер 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