Global IP를 모니터링하여 Route53 업데이트

배경



자사 개발 서버를 세운 것은 좋았습니다만, 실은 Office의 Global IP가 고정되어 있지 않은 것을 알았습니다. 이제는 다소 귀찮은 일과 ISP씨에게 전화해 고정 IP의 계약을 하면 좋은 이야기입니다만, 인프라의 소프트웨어 해결의 문화를 계몽하고 싶은 생각도 있어, 트위터 Route53를 자동 갱신하는 Shell Script를 Cron 에 등록해 두자는 것입니다.

이런 Shell Script를 썼습니다.



구조로서는 Global IP를 gip.txt라는 텍스트 파일에 기록해 두고, 지금의 Global IP와 비교해 갱신이 있으면 aws-cli로 Route53의 Record의 갱신을 한다고 하는 것입니다.

ip_watch.sh
#!/usr/bin/env bash

gip=`curl inet-ip.info` # Global IPを取得
r53_hosted_id="********" # AWS Route53のHosted ID
r53_target_domain="my.host.domain.com" # 更新するドメイン(今回はA record)
gipfile="/path/to/gip.txt" # gip.txt出力先
outfile="/path/to/update.json" # JSON出力先
env_gip=`cat $gipfile` # 旧Global IP

# 以前環境変数に登録していた旧Global IPと現Global IPを比較
if [ "${gip}" != "${env_gip}" ]; then
    # aws-cli route53で渡すJSONファイル(update.json)を作成
    json="{\"Comment\" : \"\", \"Changes\" : [{\"Action\" : \"UPSERT\", \"ResourceRecordSet\" : {\"Name\" : \"${r53_target_domain}\", \"Type\" : \"A\", \"TTL\" : 300, \"ResourceRecords\" : [{\"Value\": \"${gip}\"}]}}]}"
    echo $json > $outfile
    # aws-cliでroute53のrecord set更新
    aws route53 change-resource-record-sets --hosted-zone-id $r53_hosted_id --change-batch file://$outfile
    # Slackにお知らせ。Incoming Webhook URLをご用意ください。
    curl -X POST --data-urlencode "payload={
        \"channel\": \"#infra\",
        \"username\": \"ip監視さん\",
        \"text\": \"updating global IP ${env_gip} -> ${gip}!!\", 
        \"icon_emoji\": \":elevennines:\"
    }" https://hooks.slack.com/services/******/*******/***************
    echo "${gip}" > $gipfile # Global IPをセット
fi

실행 결과



커맨드 라인에서는 다음과 같습니다.
[tokifuji@office ip_watch]$ ./ip_watch.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    15  100    15    0     0     36      0 --:--:-- --:--:-- --:--:--    36
{
    "ChangeInfo": {
        "Status": "PENDING", 
        "Comment": "", 
        "SubmittedAt": "2017-01-30T12:22:21.799Z", 
        "Id": "/change/***********"
    }
}
[tokifuji@office ip_watch]$

이후의 상태 확인은 다음과 같습니다. Status가 INSYNC가 되면 OK입니다.
[tokifuji@office ip_watch]$ aws route53 get-change --id /change/***********
{
    "ChangeInfo": {
        "Status": "INSYNC", 
        "SubmittedAt": "2017-01-30T12:22:21.799Z", 
        "Id": "/change/***********"
    }
}

Slack에는 이런 메시지가 날아갑니다.



CRONTAB로 설정



자신은 5 분 두고 설정하고 있지만, 기호로 ...
[tokifuji@office ip_watch]$ crontab -l
*/5 * * * * /path/to/ip_watch.sh

이제 당신도 편안 Route53 라이프 (??)를 즐기십시오. 그럼 다시

좋은 웹페이지 즐겨찾기