Route 53を使ってDynamic DNS設定(ipv4, ipv6対応)

AWS

概要

  • 自宅サーバをIPv6対応するためにはDynamic DNSを設定しないといけないです。
  • zoneサーバはAWS Route 53で運用されているのでCLIで書き換えるスクリプトを書くのが面倒だったので長らく放置していました。
  • ちょっと探してみると、AWS APIをラップしているスクリプトがあったので設定してみました。
Route53の設定

理想の手順

こちらのドキュメントを参考にIAMユーザと、Policyを作成します。

設定ファイルをddns-route53.ymlという名前で作成します。

credentials:
  access_key_id: "YOUR ACCESS KEY"
  secret_access_key: "YOUR SECRET ACCESS KEY"

route53:
  hosted_zone_id: "YOUR ZONE ID XXXXXXXX"
  records_set:
    - name: "teraren.com."
      type: "A"
      ttl: 300
    - name: "teraren.com."
      type: "AAAA"
      ttl: 300

docker-composeのサンプルスクリプトがあるので、docker-compose.ymlというファイル名で作成します。

version: "3.2"

services:
  ddns-route53:
    image: crazymax/ddns-route53:latest
    container_name: ddns-route53
    volumes:
      - "./ddns-route53.yml:/ddns-route53.yml:ro"
    environment:
      - "TZ=Asia/Tokyo"
      - "SCHEDULE=*/30 * * * *"
      - "MAX_RETRIES=3"
      - "LOG_LEVEL=info"
      - "LOG_JSON=false"
      - "LOG_CALLER=false"
    restart: always

そのうえで、docker-compose upを叩けば動きます。

しかしながら、ipv6のアドレスを取得する際にエラーができます。DockerがIPv6に対応していない感じのエラーです。軽くトラブルシュートしてみましたが、ちょっと面倒そうなので諦めました。

> docker-compose up
Starting ddns-route53 ... done
Attaching to ddns-route53
ddns-route53    | Wed, 20 May 2020 09:00:12 JST INF Starting ddns-route53 1.9.1
ddns-route53    | Wed, 20 May 2020 09:00:13 JST INF Current WAN IPv4: 222.230.108.57
ddns-route53    | Wed, 20 May 2020 09:00:13 JST ERR Cannot retrieve WAN IPv6 address error="request failed: Get https://v6.ident.me/: dial tcp [2a01:7e00::f03c:91ff:fe70:xxxx]:443: connect: cannot assign requested address"
ddns-route53    | Wed, 20 May 2020 09:00:13 JST ERR No WAN IPv6 address available to update teraren.com. record
ddns-route53    | Wed, 20 May 2020 09:00:13 JST ERR No WAN IPv6 address available to update *.teraren.com. record
ddns-route53    | Wed, 20 May 2020 09:00:14 JST ERR Cannot update records set error="InvalidInput: Invalid XML ; cvc-complex-type.2.4.b: The content of element 'Change' is not complete. One of '{\"https://route53.amazonaws.com/doc/2013-04-01/\":Action, \"https://route53.amazonaws.com/doc/2013-04-01/\":ResourceRecordSet}' is expected.\n\tstatus code: 400, request id: 6a21c50f-4f3e-4a0b-b588-62ddb890ed66"
ddns-route53    | Wed, 20 May 2020 09:00:14 JST INF 6 records set updated changes={"ChangeInfo":null}
ddns-route53    | Wed, 20 May 2020 09:00:14 JST INF Cron initialized with schedule */30 * * * *
ddns-route53    | Wed, 20 May 2020 09:00:14 JST INF Next run in 29 minutes (2020-05-20 09:30:00 +0900 JST)

しかたがないので、ddns-route53をbinaryでインストールして、daemonとして設定しました。

※オプション

daemonとして稼働させるよりcrontabのほうが楽かなと思いました。

*/30 * * * * /usr/local/bin/ddns-route53 --config /path/to/ddns-route53.yml

外部からテスト

> host matsu.teraren.com
matsu.teraren.com is an alias for vectant.teraren.com.
vectant.teraren.com has address 121.3.155.147
vectant.teraren.com has IPv6 address 240b:10:2120:f400:4167:4cee:9d38:6125

Work From Homeのこのご時世、IPv6対応してないと遅くて辛いですね。

IPアドレスが更新されて、非定期的に更新したいとき

デーモンで動いているので、デーモンを再起動すればOK

sudo systemctl restart  ddns-route53

コメント