thumbnail

シェルスクリプトでRoute53に自サーバのipアドレスを登録する

2022/02/26

昔、サーバを起動するたびにシェルスクリプトでAWSのRoute53のレコードを変更するということを行っていました。

もしかしたらまた利用するかもしれないのでその方法を備忘録として残しておきます。

aws cliのインストール

aws cliをインストールしていない場合は以下の手順に従い、aws cliをインストールします。 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

credentialのセットアップ

Route53を変更する権限を持ったIAMを作成します(ポリシーはAmazonRoute53FullAccessとか)。

IAMに紐付いているアクセスキーシークレットキーを控えておきます。

$ aws configure --profile Route53

アクセスキーシークレットキーを設定し、ローカルにprofile Route53を用意します。

使用するシェルスクリプト

使用するシェルスクリプトはこちらを参考にしています。

シェルスクリプト内のHosted Zone IDを設定すれば基本的には使用可能です。

※ ホストゾーンIDはawsのコンソール上のRoute53ぺーじから以下のとおり確認できます。

hosted-zone-id

update-route53.sh
#!/bin/bash

# (optional) You might need to set your PATH variable at the top here
# depending on how you run this script
# PATH=PATH

# Hosted Zone ID e.g. BJBK35SKMM9OE
ZONEID=BJBK35SKMM9OE

# Specify the profile name set in the aws cli
PROFILE=Route53

# The CNAME you want to update e.g. hello.example.com
RECORDSET=hello.example.com

# More advanced options below
# The Time-To-Live of this recordset
TTL=300
# Change this if you want
COMMENT="Auto updating @ `date`"
# Change to AAAA if using an IPv6 address
TYPE="A"

# Get the external IP address from OpenDNS (more reliable than other providers)
IP=`dig +short myip.opendns.com @resolver1.opendns.com`

function valid_ip()
{
    local  ip=$1
    local  stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
}

# Get current dir
# (from http://stackoverflow.com/a/246128/920350)
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
LOGFILE="$DIR/update-route53.log"
IPFILE="$DIR/update-route53.ip"

if ! valid_ip $IP; then
    echo "Invalid IP address: $IP" >> "$LOGFILE"
    exit 1
fi

# Check if the IP has changed
if [ ! -f "$IPFILE" ]
    then
    touch "$IPFILE"
fi

if grep -Fxq "$IP" "$IPFILE"; then
    # code if found
    echo "IP is still $IP. Exiting" >> "$LOGFILE"
    exit 0
else
    echo "IP has changed to $IP" >> "$LOGFILE"
    # Fill a temp file with valid JSON
    TMPFILE=$(mktemp /tmp/temporary-file.XXXXXXXX)
    cat > ${TMPFILE} << EOF
    {
      "Comment":"$COMMENT",
      "Changes":[
        {
          "Action":"UPSERT",
          "ResourceRecordSet":{
            "ResourceRecords":[
              {
                "Value":"$IP"
              }
            ],
            "Name":"$RECORDSET",
            "Type":"$TYPE",
            "TTL":$TTL
          }
        }
      ]
    }
EOF

    # Update the Hosted Zone record
    aws route53 change-resource-record-sets \
        --profile $PROFILE \
        --hosted-zone-id $ZONEID \
        --change-batch file://"$TMPFILE" >> "$LOGFILE"
    echo "IP Changed in Route53" >> "$LOGFILE"

    # Clean up
    rm $TMPFILE
fi

# All Done - cache the IP address for next time
echo "$IP" > "$IPFILE"
$ sh update-route53.sh

で以下のログが出たら、レコードへのip登録完了です。

IP has changed to xx.xxx.xxx.xxx
{
    "ChangeInfo": {
        "Status": "PENDING",
        "SubmittedAt": "20xx-xx-xxTxx:xx:xx.xxxZ",
        "Id": "/change/xxxxxxxxxx"
    }
}
IP Changed in Route53

おわり

サーバ起動時に特定のscriptを走らせると組み合わせれば、サーバ起動時にRoute53のレコードを変更できます。

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

Profile

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

© 2022 mitsuru takahashi