ELBの持つIPとノード数を1分おきに取得(dig)し、ノード数に変更ある場合にはSlack通知する

前回「[ELBのIPと台数をひたすらdigしておく](https://qiita.com/yamazon/items/3f1c2c91ce9711104979)」の進化版です
Slackに通知してみました


* **elb-node-watch** チャンネル
  * ELBの持つIPとノード数を1分おきにdigした結果を通知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35156/216bca9d-8798-5be3-c223-1a5332748612.png)


* **elb-node-change** チャンネル
  * ELBの持つIPとノード数を1分おきにdigし、ノード数に変更ある場合に通知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35156/5690fadc-8913-4cbd-3488-1997dad9f8ad.png)

# 実行例

```sh

# 適当なEC2を使いバックグラウンド実行しておく
sh elbdig.sh xxxx.ap-northeast-1.elb.amazonaws.com testelb &

```

# elbdig.sh

```sh
#!/bin/bash -
# ELBのIPアドレスとノード数をdigコマンドから取得しSlackに通知します

# 第一引数=ELBのDNS名
elbname=$1

# 第二引数=ELBの略称 (WEB,APなど)
elbnickname=$2

# hook URL
url=https://hooks.slack.com/services/xxxx/xxxx/xxxx

# 通知チャンネル設定
channel_watch="elb-node-watch"
icon_watch=":elb_icon:"
username_watch="ELBのIPアドレス・ノード数確認bot"

# ノード数に変更あった際の通知チャンネル設定
channel_change="elb-node-watch"
icon_change=":elb_icon:"
username_change="ELBのノード数変更を通知するbot"

# 何分に1回Slackに送るか (1=1分)
sendcount=15
count=0

# TTL (DNSレコードのTTL)
ttl=60

# ノード数初期化 (ありえない数値にしておく)
number1=1000
number2=1000


# 無限ループ開始
while :
do


# 1回目
# sleep 60 (TTL=60)
sleep ${ttl}


datetime1=$(date "+%Y-%m%d-%H:%M-%S(JST)")

ipaddrlist1=$(dig ${elbname} |grep -v -E "^(;|$)" |awk '{print $5}' |sort -n -t'.' -k1,1 -k2,2 -k3,3 -k4,4 |awk -v 'RS=nothing!!!!' '{print $1,",",$2,",",$3,",",$4,",",$5,",",$6,",",$7,",",$8}')

number1=$(dig ${elbname} |grep -v -E "^(;|$)" | wc -l)

text1="${elbnickname}\t${datetime1}\t${number1}\t${ipaddrlist1}"
echo -e ${text1} |tee -a ${elbname}.txt

count=$(( count + 1 ))
countresult=$((${count} % ${sendcount}))

if [ ${countresult} -eq 0 ]; then
  curl -X POST --data-urlencode "payload={\"username\": \"${username_watch}\", \"icon_emoji\": \"${icon_watch}\", \"channel\": \"${channel_watch}\", \"attachments\": [{\"title\": \"ELB名\n${elbname}\",\"text\": \"略称\t時間\tノード数\tIPアドレス\n${text1}\"}]}" ${url} >/dev/null 2>&1
fi




# 前回の値ある場合のみ実行
if [ ${number2} -ne 1000 ]; then

    # ノード数に変更あった際の処理
    if [ ${number1} -ne ${number2} ]; then

      # ログにchangedと出力
      echo "changed" |tee -a ${elbname}.txt

      # Slackに通知
      curl -X POST --data-urlencode "payload={\"username\": \"${username_change}\", \"icon_emoji\": \"${icon_change}\", \"channel\": \"${channel_change}\", \"attachments\": [{\"title\": \"ELB名\n${elbname}\",\"text\": \"${datetime1}\n*ノード数に変更あり*\n${elbnickname}\n変更前:${number2}\n変更後:${number1}\nノード数は下記のチャンネルにおいても確認できます\n#作成中\"}], \"link_names\": 1}" ${url} >/dev/null 2>&1
    fi

fi








# 2回目
# sleep 60 (TTL=60)
sleep ${ttl}


datetime2=$(date "+%Y-%m%d-%H:%M-%S(JST)")

ipaddrlist2=$(dig ${elbname} |grep -v -E "^(;|$)" |awk '{print $5}' |sort -n -t'.' -k1,1 -k2,2 -k3,3 -k4,4 |awk -v 'RS=nothing!!!!' '{print $1,",",$2,",",$3,",",$4,",",$5,",",$6,",",$7,",",$8}')

number2=$(dig ${elbname} |grep -v -E "^(;|$)" | wc -l)

text2="${elbnickname}\t${datetime2}\t${number2}\t${ipaddrlist2}"
echo -e ${text2} |tee -a ${elbname}.txt


count=$(( count + 1 ))
countresult=$((${count} % ${sendcount}))

if [ ${countresult} -eq 0 ]; then
  curl -X POST --data-urlencode "payload={\"username\": \"${username_watch}\", \"icon_emoji\": \"${icon_watch}\", \"channel\": \"${channel_watch}\", \"attachments\": [{\"title\": \"ELB名\n${elbname}\",\"text\": \"略称\t時間\tノード数\tIPアドレス\n${text2}\"}]}" ${url} >/dev/null 2>&1
fi




# ノード数に変更あった際の処理
if [ ${number1} -ne ${number2} ]; then

      # ログにchangedと出力
      echo "changed" |tee -a ${elbname}.txt

      # Slackに通知
      curl -X POST --data-urlencode "payload={\"username\": \"${username_change}\", \"icon_emoji\": \"${icon_change}\", \"channel\": \"${channel_change}\", \"attachments\": [{\"title\": \"ELB名\n${elbname}\",\"text\": \"${datetime2}\n*ノード数に変更あり*\n${elbnickname}\n変更前:${number1}\n変更後:${number2}\nノード数は下記のチャンネルにおいても確認できます\n#作成中\"}], \"link_names\": 1}" ${url} >/dev/null 2>&1

fi








# 無限ループ終了
done
```