AWS Route53 でドメインを取得し、DDNS っぽく運用する【しきぶろぐ開設の道筋(3)】

投稿者: | 2022年5月20日

連載 しきぶろぐ開設の道筋

  1. v6プラス(DS-Lite)環境下でIPv4/IPv6両対応の自宅サーバーを公開する
  2. ラズパイにWordPressを導入する
  3. AWS Route53 でドメインを取得し、DDNS っぽく運用する
  4. ブログをcertbotでHTTPS対応する

ドメイン購入サービスは色々あり、有名なのはさくらインターネットやお名前.comらしいですが、今回はAWSが提供する DNS サービスである Route53 でドメインを取得しました。crontabから定期的にAWS CLIを叩いてDNSレコードを更新することで、事実上DDNSのような運用を追加コストなしで実現することにします。

Route53を使ったドメイン取得

IAMユーザー作成

Route53 へのアクセス専用のユーザーを作成します。ルートユーザーでAWSマネジメントコンソールにログインし、検索欄に「IAM」と入力して IAM を開きます。左のメニューから「ユーザー」を選ぶとユーザー一覧が表示されるので、「ユーザーを追加」をクリックます。

  • ユーザー名:適当なユーザー名を入力
  • 認証情報タイプ:両方にチェックを入れます
  • コンソールのパスワード:自動生成で良いでしょう
  • パスワードのリセットが必要:なしにしました

アクセス許可の設定については、上のように「既存のポリシーを直接アタッチ」を選択し、以下を検索して付与します。

  • AmazonRoute53FullAccess
  • AmazonRoute53RecoveryReadinessFullAccess
  • AmazonRoute53RecoveryControlConfigFullAccess

最後に入力内容を確認し、ユーザーの作成をクリックします。

追加に成功すると「アクセスキー」と「シークレットアクセスキー」が表示されます。AWS CLIへのログインに必要なので、忘れずにメモしましょう

さて、ドメインの取得・管理にあたっては多少の請求が発生するので、IAMユーザーに対して請求情報へのアクセスを許可する必要があります。

AWSマネジメントコンソールに戻り、右上のアカウント名をクリックし、「アカウント」をクリックします。スクロールして、「IAM ユーザー/ロールによる請求情報へのアクセス」の横にある「編集」をクリックします。

「IAMアクセスのアクティブ化」項目が出るので、チェックを入れて更新をクリックします。

ドメインの購入

前章で取得したIAMユーザーでAWSマネジメントコンソールにログインします。検索欄に「Route53」と入力してRoute53ダッシュボードを開き、「ドメインの登録」をクリックします。

ドメイン名に好きな文字列を入れて、使えるかどうか確認します。ドメインによって値段が異なるので、ゆっくり悩みましょう。表示されている値段は、購入したタイミング及び以降1年おきに支払う必要があります。

購入者の名前や住所などを要求されるので入力します。ここで入力したメールアドレス宛に本人確認メールが届きます。

値段を確認し支払いを終えると、上のような画面が現れます。購入の確認メールが届くとのことです。

少し待つと、上のようなメールが届きました。リンクをクリックし、メールアドレスを確認します。

約10分後、「Registration of shikiblog.link succeeded」という件名のメールが届きました! これでドメインの登録が完了です。

IPアドレスとドメインの紐づけ

ドメイン名を使ってラズパイにアクセスできるよう、IPアドレスを紐づけます。

Route53ダッシュボードに移動し、「ホストゾーン」をクリックします。ホストゾーンページに遷移したら、先ほど取得したドメイン名をクリックします。

ドメインについての詳細画面が出てきました。「レコードを作成」をクリックし、ラズパイのIPv4アドレスとIPv6アドレスの2つを登録していきます。

  • レコード名:空欄のまま
  • レコードタイプ:IPv4: A、IPv6: AAAA を選択
  • 値:ラズパイのIPアドレスを入力
  • → 「レコードを作成」をクリック

以上で登録は完了です。DNSサーバーにレコードが反映されるまで少々時間がかかるようです。私の場合、2分ほど待つと「ping shikiblog.link」が通るようになりました。

参考

疑似DDNS構築

固定IPのない環境ではラズパイのIPアドレスが時々変動します。そこで、自分のIPアドレスを定期的に取得し、AWS CLIでRoute53のレコードを更新するようにします。

AWS CLIのインストール

最新版はver.2らしいですが、ラズパイに対応するバイナリが配布されておらず自分でビルドする必要があって面倒なので、ver.1をpip経由でインストールします(無理にver.2を入れようとしてめちゃくちゃ沼りました)。

sudo pip3 install awscli

バージョンを確認し、

aws --version

初期設定を実行します。

aws configure
  • AWS Access Key ID:前章で取得したもの
  • AWS Secret Access Key:同上
  • Default region name:東京なら ap-northeast-1
  • Default output format:json

レコードを自動更新するシェルスクリプトの作成

IPv6アドレスはMACから生成されるので常に一定ですが、IPv4アドレスはPPPoEセッションを開始したタイミングで変わります。以前の記事でラズパイ起動時にPPPoEセッションが開始するよう設定したので、このタイミングでAWS Route53に登録されたAレコードを自動更新します。

ホームに ddns フォルダを作成し、その中に以下の4ファイルを作成します。

  • update.sh
  • .ddns-route53.conf
  • update.log
  • ipaddress.txt

update.sh に以下のとおり記述します:

#!/bin/bash -l

CONFFILE=${1:-~/ddns/.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

#Echo date
date '+%Y/%m/%d %T'

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

source $CONFFILE

#IP Address checking
NEW_RR_VALUE=$(ip addr show ppp0 | grep -o 'inet [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o [0-9].*)

# Check required commands.
AWSCLI=${AWSCLI:-$(/usr/bin/which aws)}
if [ ! -x "$AWSCLI" ]; then
    echo "aws command not exist." 1>&2
    echo "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

$AWSCLI --profile ${PROFILE} route53 change-resource-record-sets --hosted-zone-id ${ZONEID} -$if [ $? -eq 0 ]; then
    echo "UPSERT: ${NAME}, ${NEW_RR_VALUE}"
fi

echo ${NEW_RR_VALUE} > $IPADFILE
rm $JSONFILE

.ddns-route53.confに下のように情報を記述します。PROFILEは、上で作ったIAMユーザー以外にAWSCLIにユーザーを登録していなければ「default」です。cat ~/.aws/config で表示できます。ZONEID は、AWS Route53で「ホストゾーン」を開き、ドメイン名をクリックすると図のように表示されているIDです。

# Please set the following variables to ~/ddns/.ddns-route53.conf
PROFILE=default        # your profile of IAM account in ~/.aws/config
TTL=300                # TTL of this record
NAME=shikiblog.link    # Target A record
ZONEID=Z050XXXXXXXXXX  # your Hosted Zone ID
Hosted Zone ID は赤丸の部分に記載されている

update.shに実行権限を付与して完了です。

chmod 755 ~/ddns/update.sh

PPPoEセッション開始時にレコードを自動更新

/etc/ppp/ip-up.d/10dsl-providerを開き、先ほど作ったupdate.shをPPPoEセッション開始時に実行するよう追記します。

#!/bin/sh
/usr/sbin/ip route change default via "$PPP_REMOTE" dev ppp0 proto static
~/ddns/update.sh  # この行を追記

参考

更新履歴

  • 2022/9/10 update.sh の IP アドレス取得部が ppp0 ではなく eth0 になっていたのを修正、ホストゾーンIDが間違っていたので修正

コメントを残す

メールアドレスが公開されることはありません。