다음은 AWS SSM Send-Command로 수행하는 멋진 기능입니다!
Apache Airflow를 사용하여 원하는 EC2-Instance의 모든 구성 값이 포함 된 JSON 파일 인 Cloud Formation Template (또는 CFT)을 사용하여 새로운 EC2-Instance를 만듭니다. 또한이 CFT에는 S3 위치에서 새 EC2- 인스턴스로 Python 스크립트를 복사하여 나중에 SSM Send-Command를 사용하여 실행할 수있는 부트 스트랩 명령도 있습니다! Python3과 Boto3 라이브러리라는 Python3 용 AWS SDK를 사용하여이 작업을 수행합니다. 다음은 새로운 EC2 인스턴스를 생성하는 새로운 CFT 스택 생성 명령의 일부입니다.
import boto3
cft = boto3.client("cloudformation", "us-east-1")
response = cft.create_stack(
StackName='foobarStackName',
TemplateBody=json.dumps(json_data))
그런 다음 다음과 같은 방법으로 새 EC2-Instance (SSM Send-Command를 사용해야 함)의 Instance-ID를 얻을 수 있습니다.
response = cft.describe_stacks(
StackName='foobarStackName',
)
그런 다음 wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Python을 통해이 명령 을 실행하여 현재 Airflow Worker 서버의 EC2-Instance의 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