这是我使用AWS SSM Send-Command做的超级酷的事情!
使用Apache Airflow,我使用云形成模板(简称CFT)创建了一个全新的EC2-Instance,这只是一个JSON文件,其中包含我想要的EC2-Instance的所有配置值。还请注意,在此CFT中,我还有一个引导程序命令,该命令将Python脚本从S3位置复制到新的EC2-Instance,以便稍后可以使用SSM Send-Command执行它。我使用Python3和称为Boto3库的适用于Python3的AWS开发工具包执行此操作。这是用于创建新的CFT堆栈的命令的一部分,而该CFT堆栈又创建了我的新EC2-Instance:
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
然后,我可以使用以下方法获取新EC2-Instance的Instance-ID(使用SSM Send-Command必需):
response = cft.describe_stacks(
StackName='foobarStackName',
)
然后,我可以wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
通过Python 运行以下命令来获取当前Airflow Worker服务器的EC2-Instance的实例ID :
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-Instance上执行脚本,然后将该脚本发送给我所需的任何参数/参数...包括发送SSM Send-Command的服务器的Instance-ID,以便在完成脚本后使用该方法在新的EC2-Instance上运行,它可以将另一个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