Route53で管理されたドメインでDDNS的な振る舞いをさせる

Route53で管理されたドメインに対して自宅サーバーのIPを振りたかった。
DDNS使えって話なんですけどAWSで済ませたかったので。。
具体的な方法としては単純に動的IPを持ったサーバーのcrontabに次のようなシェルを突っ込んで、crontabに入れるだけ。
{
            "Comment": "UPSERT 適当なコメント",
            "Changes": [{
            "Action": "UPSERT",
                        "ResourceRecordSet": {
                                    "Name": "設定したいFQDN",
                                    "Type": "A",
                                    "TTL": 300,
                                 "ResourceRecords": [{ "Value": "1.1.1.1"}]
}}]
}

#!/bin/bash
set -e
AWS_PROFILE=AWSプロファイル名
HOSTZONE_ID=ホストゾーンID
EXEC_AWS="/usr/local/bin/aws --profile ${AWS_PROFILE}"
WORK_DIR=/path/to/scripts/
CURRENT_IP=`curl inet-ip.info`
IP_CHANGED=`grep "\"${CURRENT_IP}\"" ${WORK_DIR}batch.json | wc -l`
if [ $IP_CHANGED = "0" ];then
  sed -i "s/\(\"Value\": \"\).\+\(\"\)/\1${CURRENT_IP}\2/g" ${WORK_DIR}batch.json
  echo "`date` ip address changed"
  $EXEC_AWS route53 change-resource-record-sets --hosted-zone-id $HOSTZONE_ID --change-batch file://${WORK_DIR}batch.json
else
  echo "`date` ip address unchanged"
fi
AWS_PROFILE, HOSTZONE_ID, WORK_DIRを書き換えそれぞれ適当なワーキングディレクトリで batch.json script.sh と名付けてscript.shには実行権限を付けてcrontabに設定。
* * * * * /home/xxxxxx/scripts/route53-ddns/script.sh >> ~/log/route53-ddns.log 2>> ~/log/route53-ddns.log
処理はUPSERT(INSERT OR UPDATE)なので、crontabに設定してログにAWSの操作ログが出ていて、Route53で正しくレコードが設定されていれば設定完了。
雑に書いてるので、本当はdigなりnslookupなりで正しくレコードが設定されているか(このスクリプトが正常に機能しているか)を検証して、スクリプトの実行に失敗している場合はslackに通知するとかしておいた方が良いと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする