cloud-initを使ってRoute53をPrivate Dynamic DNSにする

はじめに

Route53のPrivateDNS対応はとても大きなニュースでした。待ちわびていた方も多いのでは無いでしょうか。

さて、このPrivateDNSですが、台数が多くなればなるほど手動で管理するのは面倒です。勝手に登録されて、IPアドレスが変わったのなら勝手に更新してほしい。つまりDynamicDNSとして動いて欲しいですよね。

ということで、それをcloud-initでやりました。

やってみた

"Private Hosted Zone for Amazon VPC"でゾーンを作成しておきます。

Route_53_Management_Console

Amazon Linux AMIでEC2をLaunchします。その際にRoute53の更新権限をIAM Roleで設定しておきます。今回はEC2 Power User Accessに設定しました。

User-Dataを以下のように設定します。13行目の"ResourceRecordSet"-"Name"に対象サーバに設定したいFQDNを、31行目のaws route53 change-resource-record-sets--hosted-zone-idオプションに対象ホストゾーンのIDを書いておきます。

#cloud-config
repo_update: true
repo_upgrade: all

write_files:
 - content: |
      {
        "Comment": "create A record",
        "Changes": [
          {
            "Action": "UPSERT",
            "ResourceRecordSet": {
              "Name": "web1.smokeymonkey.local",
              "Type": "A",
              "TTL" : 3600 ,
              "ResourceRecords": [
               {
                 "Value": "IPADDRESS"
               }
              ]
            }
          }
        ]
      }      
   owner: root:root
   path: /root/update.json.org
   permissions: '0644'
 - content: |
      #!/bin/sh
      sed -e s/IPADDRESS/`hostname -i`/ /root/update.json.org > /root/update.json
      aws route53 change-resource-record-sets --hosted-zone-id Z315UP8BOUQTSK --change-batch file:////root/update.json
      sleep 3s
   owner: root:root
   path: /var/lib/cloud/scripts/per-boot/boot.sh
   permissions: '0755'

EC2がLaunchすると、雛形となる/root/update.json.orgと、EC2が起動したタイミングで毎回実行されるスクリプトになる/var/lib/cloud/scripts/per-boot/boot.shが作成されています。

$ sudo ls -alF /root/update.json.org
-rw-r--r-- 1 root root 316 11月  7 09:54 /root/update.json.org

$ sudo ls -alF /var/lib/cloud/scripts/per-boot/boot.sh
-rwxr-xr-x 1 root root  208 11月  7 09:54 boot.sh*

そして以下のようにちゃんとレコードができています!

Route_53_Management_Console 2

あとは起動されるたびにboot.shが実行され、レコードが更新されます。

さいごに

PrivateDNS機能がサポートされたことによって、今まで出来なかったサーバ間通信の管理がとても楽になりますね。上手に利用して更に効率的に運用していきたいものです。