目次
連載 しきぶろぐ開設の道筋
- v6プラス(DS-Lite)環境下でIPv4/IPv6両対応の自宅サーバーを公開する
- ラズパイにWordPressを導入する
- AWS Route53 でドメインを取得し、DDNS っぽく運用する
- ブログを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」が通るようになりました。
参考
- アカウントの請求情報の表示を IAM ユーザーに許可する
- Overview of managing access permissions – AWS Billing
- Amazon Route53 でドメインを取得する – Qiita
疑似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
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 # この行を追記
参考
- RaspberryPi で AWS CLI を使う方法 – Qiita
- AWS CLIでaws configureコマンドにprofileオプションを付けて使ってみた | DevelopersIO
- AWS Route53を使ったDDNS構築 – ggeennooxx blog(大変参考になりました)
- linuxで自分のIPアドレス文字列を抽出するための13のコマンド | mooapp
更新履歴
- 2022/9/10 update.sh の IP アドレス取得部が ppp0 ではなく eth0 になっていたのを修正、ホストゾーンIDが間違っていたので修正
ピンバック: お名前.comの非公式DDNSクライアントをラズパイサーバーに導入した – しきぶろぐ