📛
Lightsail を DDNS サーバにする
はじめに
Lightsail で使用しているドメインを自宅などのダイナミック IP アドレスに割り当てる方法を記載します。
DNS を Route 53 ではなく Lightsail で管理している前提になります。
クライアント側は Raspberry Pi でも動作確認済みです。
サーバ側スクリプト
クライアントの IP アドレスを返せば何でもよいです。
myip.php
<?php print($_SERVER['REMOTE_ADDR']);?>
サーバの DNS レコードを以下のように設定しておくと、ウェブブラウザからでも IPv4 or IPv6 を選択してアクセスできるので便利です。
レコード名 | A レコード | AAAA レコード |
---|---|---|
ipv4.domain.tld | あり | なし |
ipv6.domain.tld | なし | あり |
クライアント側スクリプト
AWS CLI で取得した現在の DNS レコードと、サーバ側スクリプトで取得した最新の IP アドレスを比較して、差異があれば AWS CLI で DNS レコードを書き換えます。
ddns_client.sh
#!/usr/bin/bash
# グローバル IP アドレスを返すページ(上述のサーバ側スクリプト)
MYIPSERVER=https://domain.tld/myip.php
# Lightsail の DNS zone 名
MYZONE=domain.tld
# クライアントのホスト名
MYHOST=host.domain.tld
all=`aws lightsail get-domain --domain-name "${MYZONE}" --region us-east-1`
now=`echo $all | jq '.domain.domainEntries[] | select(.name == "'${MYHOST}'" and .type=="AAAA")'`
now_ip=`echo $now | jq -r '.target'`
new_ip=`curl -s --interface eth0 -6 ${MYIPSERVER}`
if [ $now_ip != $new_ip ]; then
new=`echo $now | jq '.target|="'$new_ip'"'`
aws lightsail update-domain-entry --domain-name "${MYZONE}" --region us-east-1 --domain-entry "$new"
echo "$now_ip -> $new_ip"
else
echo "$now_ip"
fi
-
--region
は Lightsail インスタンスのリージョンによらずus-east-1
になります。 -
type
は IPv4 ならtype=="A"
、IPv6 ならtype=="AAAA"
にします。 -
curl
のオプションは IPv4 なら-4
、IPv6 なら-6
にします(サーバー側が IPv4/6 シングルスタック、もしくは上述の IPv4/6 別のホスト名なら不要です)。
適用
cron などで定期的に実行します。
crontab
*/5 * * * * /usr/local/bin/ddns_client.sh
Discussion