Aqui está algo super legal que eu faço com o AWS SSM Send-Command!
Usando o Apache Airflow, crio uma Instância EC2 totalmente nova, usando um Modelo de formação em nuvem (ou CFT), que é apenas um arquivo JSON com todos os valores de configuração para minha Instância EC2 que eu quero; observe também que nesta CFT também tenho um comando de autoinicialização que copia um script Python de um local S3 para a nova instância do EC2, para que eu possa executá-lo posteriormente usando um comando de envio do SSM! Eu faço isso usando Python3 e o AWS SDK para Python3 chamado biblioteca Boto3. Aqui está parte do comando para criar a nova pilha CFT que, por sua vez, cria minha nova instância EC2:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
Em seguida, posso obter o ID da instância da nova instância do EC2 (necessária para usar o comando de envio do SSM) usando algo como isto:
response = cft.describe_stacks(
StackName='foobarStackName',
)
Em seguida, posso obter o ID da instância da Instância EC2 do servidor do Airflow Worker atual executando este comando wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
através do 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]
AGORA!!!! PARA A GRANDE FINAL
Posso executar um script na nova Instância EC2 que eu criei e enviar esse script para quaisquer parâmetros / argumentos que eu quiser ... incluindo o ID da instância do servidor que enviou o Comando de Envio do SSM para que seja executado assim que meu script for concluído executando na nova instância do EC2, ele pode enviar outro comando de envio do SSM de volta ao meu servidor Airflow para informar que o script foi concluído. Este é um nível muito alto, sem detalhes, mas é apenas para demonstrar uma ideia :)
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'))
Não tenho certeza se isso ajudou alguém, mas é um exemplo interessante e divertido de fazer algo com o AWS SSM Send-Command! Embora, provavelmente, um cheiro de código xD