📛

Lightsail を DDNS サーバにする

2025/02/21に公開

はじめに

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