ログってなんぼ

エンジニアのメモです

ELBに追加した任意のEC2インスタンスでcronを実行する

qiita.com

上記記事がとても参考になりました。

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)ならこんな感じでしょうか