AWS SSMのSend-Commandを使用して、非常にクールなことを行います。
Apache Airflowを使用して、必要なEC2-Instanceのすべての構成値を含むJSONファイルである、クラウド形成テンプレート(または略してCFT)を使用して、新しいEC2-Instanceを作成します。また、このCFTには、SSM Send-Commandを使用して後で実行できるように、PythonスクリプトをS3の場所から新しいEC2-Instanceにコピーするブートストラップコマンドもあることに注意してください。これは、Python3およびBoto3ライブラリと呼ばれるAWS SDK for Python3を使用して行います。次に、新しい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(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ワーカーのサーバーの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でスクリプトを実行し、必要なパラメーター/引数をスクリプトに送信します。SSMSend-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