ELBに追加した任意のEC2インスタンスでcronを実行する
上記記事がとても参考になりました。
jqが入っていなくても使えるように書き換えて使うことにします。
事前準備としてインスタンスでawscliが使えるようにしておく必要がありますがEC2なら最初から使えるんじゃないかな
check_run_cron.sh
#!/bin/bash REGION="ap-northeast-1" ELB="NAME_OF_ELB" INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id/` INSTANCE_LIST=`aws elb describe-instance-health \ --output text \ --load-balancer-name ${ELB} \ --region ${REGION} \ --query 'InstanceStates[?State==\`InService\`].InstanceId'` if [[ ${INSTANCE_LIST} =~ ^${INSTANCE_ID} ]]; then exit 0 else exit 1 fi
text形式でインスタンスのリストを取ってきて、自分のIDが先頭にあるかどうかチェックするだけのものにしました
実行したいcronjobスクリプトの中でこのスクリプトを呼び出して、終了コードで分岐をハンドリングするような感じになると思いますが、横着して
$ check_run_cron.sh && echo "hello" hello
のように利用することもできます。
&&以後が実行されたのかどうなのかログなどからわかりにくくなるケースが多いのであまりおすすめしませんが・・・w
スクリプト上でアクセスキーなどを設定する必要があるなら
#!/bin/bash export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXX export AWS_SECRET_ACCESS_XXXXXXXXXXXXXXXXXXX export AWS_DEFAULT_REGION=ap-northeast-1 export AWS_DEFAULT_OUTPUT=text REGION="ap-northeast-1" ELB="NAME_OF_ELB" INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id/` INSTANCE_LIST=`aws elb describe-instance-health \ --output text \ --load-balancer-name ${ELB} \ --region ${REGION} \ --query 'InstanceStates[?State==\`InService\`].InstanceId'` if [[ ${INSTANCE_LIST} =~ ^${INSTANCE_ID} ]]; then exit 0 else exit 1 fi
このような感じになると思います。
ただ、できるだけアクセスキーはソースから隠蔽するようにしたいところです
#!/bin/bash export AWS_SHARED_CREDENTIALS_FILE=~/.aws/credentials export AWS_CONFIG_FILE=~/.aws/config ELB="awseb-e-i-AWSEBLoa-30H7DI3VT2UX" INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id/` INSTANCE_LIST=`aws elb describe-instance-health \ --output text \ --load-balancer-name ${ELB} \ --region ap-northeast-1 \ --query 'InstanceStates[?State==\`InService\`].InstanceId'` if [[ ${INSTANCE_LIST} =~ ^${INSTANCE_ID} ]]; then exit 0 else exit 1 fi
最近のバージョンのawscli(>= 1.5)ならこんな感じでしょうか