Tech

AWS Route53を使ったDDNS構築

無料でダイナミックDNSとかできないのかな・・?
とかみなさん考えたことあると思います。
そう、僕も考えて、AWS Route 53を使ったDDNSの構築に至りました。

だいたいの仕様

8時~20時の間、1時間ごとにcronでシェルスクリプトを実行、
前回取得したグローバルIPから変更があれば、Route53のレコードを書き換えに行く。
という仕様です。

Route53にアクセスしまくって課金されるの嫌だなーと思って元々1日1回の実行だったんですが、
それだとたまに繋がらなくなる時があって次の日まで待たないといけないということがあったので、1時間に1回確認しに行く仕様にしてます。

スクリプトは
ddns-route53
を参考にさせてもらいました。

Do What The F*ck You Want To Public License

ありがとうございます('ω')

前提

まず前提として、AWS Route53をネームサーバーとして使用しているドメインを使っている環境を想定しています。
Route53をネームサーバーとして利用するよう変更してから、これから先の内容を参照してください。

手順

1.Route53 IAMユーザ作成

Route53へのアクセスのみ許可したIAMユーザを作成します。
私が実際に使っているポリシー設定を載せておきます。
特定のHostのみに絞りたい場合は、ListHostedZonesのResourceの箇所を該当のドメインのARNに変更すればOKかと思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "route53:ListHostedZones",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "route53:GetHostedZone",
                "route53:ChangeResourceRecordSets",
                "route53:ListResourceRecordSets"
            ],
            "Resource": "arn:aws:route53:::hostedzone/*"
        }
    ]
}

作成したら、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYを控えておく。

2.AWSCLIインストール

AWS CLI のインストールと設定
このへんを参考にしてインストールしてください。
aws configureを実行して先に作成したIAMユーザの情報を入力。

3.シェルスクリプトの作成

gitに上げるのとか面倒なので適当にコピペしてください。

前に、IPアドレスを確認するために使う先がアクセスできなくなっていて
しばらく更新が止まっていたことがあるので、注意してください。
http://inet-ip.info
このスクリプト中ではここにしてますが、お好きなところに変更してもらって結構です。

#!/bin/bash -l
#
# This script deliver dynamic DNS in Amazon Route 53.
#
# Copyright (c) 2019 ggeennooxx
#
# This work is free. You can redistribute it and/or modify it under the
# terms of the Do What The F*ck You Want To Public License, Version 2.
#
# Please edit the following config file for your environment.

CONFFILE=${1:-~/.ddns-route53.conf}
if [ ! -r "$CONFFILE" ]; then
    echo "$CONFFILE does not exist or unreadable." 1>&2
    exit 1
fi

IPADFILE=${1:-~/ddns/ipaddress.txt}
if [ ! -r "$IPADFILE" ]; then
    echo "$IPADFILE does not exist or unreadable." 1>&2
    exit 1
fi

#Privious ip address
RR_VALUE=$(< $IPADFILE)

source $CONFFILE

#IP Address checking
NEW_RR_VALUE=$(curl -s http://inet-ip.info)

# Check required commands.
AWSCLI=${AWSCLI:-$(/usr/bin/which aws)}
if [ ! -x "$AWSCLI" ]; then
    $LOGGER "aws command not exist." 1>&2
    $LOGGER "Please install awscli package." 1>&2
    exit 1
fi

if [ -z "$NEW_RR_VALUE" ]; then
  echo "An error occured. Please confirm IP Address checking source."
  exit 1
elif [ $RR_VALUE = $NEW_RR_VALUE ]; then
  exit 0
fi

JSONFILE=$(mktemp /tmp/r53-XXXXXX.json)
cat > $JSONFILE <<EOF
{
    "Comment": "update a A record for the zone.",
    "Changes": [
        {
            "Action": "UPSERT",
            "ResourceRecordSet": {
                "Name": "${NAME}",
                "Type": "A",
                "TTL": ${TTL},
                "ResourceRecords": [
                    {
                        "Value": "${NEW_RR_VALUE}"
                    }
                ]
            }
        }
    ]
}
EOF

~/.local/bin/aws --profile ${KEYNAME} route53 change-resource-record-sets --hosted-zone-id ${ZONEID} --change-batch file://${JSONFILE}
if [ $? -eq 0 ]; then
    $LOGGER "UPSERT: ${NAME}, ${NEW_RR_VALUE}"
fi

echo ${NEW_RR_VALUE} > $IPADFILE
rm $JSONFILE

4.confファイル作成

~/.ddns-route53.conf
という名前で作成しておいて下さい。

# This file is example of config.
# Please edit and copy to ~/.ddns-route53.conf
#
# Please set the following variables to your environment.
KEYNAME=example          # your key name in .aws/config
TTL=300                        # TTL of this record
NAME=mente.example.com.          # Target A record
ZONEID=XXXXXXXXXXXX              # your zone ID
LOGGER=echo                    # send messages program

5.cronの設定

ここは適当にお好きな設定をしてください。実行権限は適宜変更してください。

0 8-20 * * * ~/ddns/update.sh > update.log 2>&1

まとめ

特にまとめることはないですが
固定IPを取っていない客先へのVPN接続に使っています。便利。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です