2014/01/14

AWSのRoute53でDDNS (Dynamic DNS)

AWSにはRoute53というDNSサービスがあって、外からIPをAPIで登録できるのでDynamicDNSの代わりに使えるようです。

これまではmydnsというサービスを利用させてもらっていて、そちらはそちらですごく安定していて良いサービスなのですが、新年を機会にAWSに移行してみることにしました。

DynamicDNSで、IPは動的IPなので、当然一定期間なりで内容を更新していかないといけません。
今回、更新用のクライアントはQNAP NAS上に配置してみました(Raspberry Piでも良いのですが、最近SDカード上のファイルシステムがぶっ壊れて止まっていることがあったので)。

ただ今にして思うとRaspberry Piの方が簡単だったような気もします。QNAPのipkgとperlに手こずりました。

以下、覚え書き。

まずはじめにAWS側の設定ですが、これはRoute53のウェブ画面で登録するだけで簡単です。
Hosted Zonesページで、「Create Hosted Zones」ボタンを押してゾーンを登録します。


これでゾーンができるので、Hosted Zone IDというのを控えておきます(控えなくてもいつでも見られますが)。
作成したゾーンを選択して、上の方に「Go to Record Sets」というボタンがあるので押します。


すると、以下のようにレコード画面になります。
最初は、SOAレコードとNSレコードしかないので、Create Record Setを押して、適当にAレコードを追加します。

ここまででAWS側の設定は終わりです。簡単です。

次に、QNAP側の設定。
  • パッケージの更新。
    perl、gcc、makeはipkgで更新をかけておく。最近 ipkg update するとエラーが出るようになってしまったのですが、めげずに手打ちでアップデートを掛けます。
    ちなみに、ipkgがwgetで失敗しているときは、/opt/etc/ipkg/tsx19-kmod.confの中の

    src tsx19 http://ipkg.nslu2-linux.org/feeds/optware/tsx19/cross/unstable

    の行をコメントアウトするとエラーが出なくなるかもしれません。
  • ツールを配置するディレクトリを適当に決めます。ディスク上(再起動で消えてしまわないところ)ならどこでも構いませんが、たとえば /share/MD0_DATA/route53 といったディレクトリを作って、そこに配置すれば良いと思います。
  • AWS secret。
    AWSからシークレットキーを取ってきて、/root配下、もしくは更新処理を行うツールのディレクトリに.aws-secretsという名前で配置します。

    シークレットキーは、「アカウント」の「セキュリティ証明書」からダウンロードできます。


    .aws-secretファイルの中身は以下のようにします。パーミッションを0600にすることを忘れずに。

    %awsSecretAccessKeys = (
       "my-aws-account" => {
          id => "アクセスキー",
          key => "シークレットキー",
       },
    );
  • dnscurl.pl(アップデートツール)のダウンロード。
    AWSからdnscurl.plというスクリプトをダウンロードしてきて、上のディレクトリに配置します。その際、#!/usr/bin/perlを#!/opt/bin/perlに書き換えておきます。
  • dnscurl.plを起動すると、いろんなperlモジュールが足りないと言われるので、CPANなりapt-getで更新を掛けます。Digest::HMAC_SHA1モジュールは必須です。その他、足りないものはどしどし追加していきます。
  • perlがOKになると、今度はcurlに「cacert.pemが古い」と言われて起動できません。http://curl.haxx.se/ca/cacert.pemあたりからcacert.pemをダウンロードして、これも同じディレクトリに配置しておきます。cacert.pemはコマンドラインとかでも指定できるはずなのですが、スクリプトを書き換えないとできなかったので、とりあえず環境変数にしておきます。

    % export CURL_CA_BUNDLE=cacert.pem
  • dnscurl.plの使い方は、http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DnscurlExample.htmlなどを参考にしてください。

    今回使ったのは、"Creating Resource Record Sets in Your Route 53 Hosted Zone"に出てくる方法で、レコードをxmlファイル(以下の例ではMyCreateRecordsRequest.xml)に書いておいてdnscurl.plの引数に引き渡す、というものです。

    % dnscurl.pl --keyname my-aws-account -- -H "Content-Type: text/xml; charset=UTF-8" -X POST --upload-file ./MyCreateRecordsRequest.xml https://route53.amazonaws.com/2012-12-12/hostedzone/HostedZoneID/rrset
  • dnscurl.plは指定した情報(Aレコードとか)をRoute53にアップロードしたりするような機能しかないので、Dynamic DNSとして使う際には自分のルーターについたIPアドレスを取得して、それをdnscurl.plに食わせる、というスクリプトが必要です。
    普通は、route53DynDNS.bashというのを使うようなのですが、これは内部でxpathを使っています。困ったことに、QNAPでは(見た範囲では)xpathがないようなので仕方なくpythonで自製しました。エラー処理もなんもなしの適当スクリプトですが。

    route53update.py
  • cronで、適当な間隔でアップデートを走らせます。
  • ドメインのネームサーバをアマゾンのものに変更します。ウェブの管理ページでNSレコード欄を見ると4つほどネームサーバが出てくるので、プライマリ、セカンダリ以下として設定します。これで完了です。

0 件のコメント: