Route 53を使ってみる その2 (レコードの登録)

前回のエントリの続き。

レコードの登録

BIND to Amazon Route 53 Conversion Tool” を使ってBINDのゾーンファイルからXMLを作成してAPIを呼び出す方向で考える。

ところがちょっと問題が…。

実行してみると次の依存関係の問題が出てくる。

$ ./bindtoroute53.pl --help
Can't locate Net/DNS/ZoneFile.pm in @INC (@INC contains: /usr/local/lib/perl5 ...) at ./bindtoroute53.pl line 79.
BEGIN failed--compilation aborted at ./bindtoroute53.pl line 79.

perl-Net-DNS-ZoneFile-FastというRPMパッケージはあるのだが、perl-Net-DNS-ZoneFileは存在しない模様。 普段はあまりやらないのだが、CPAN経由でのインストールを試みるも、テストで失敗してしまう。

こうした事情もあって、Python版の同様のツールが存在するのであろう。 ところが、こちらも軽く試したところではうまく動いてくれない。Pythonは不得手なので、Perlを使う方向に戻る。

依存関係の問題で出てくるモジュールはなるべくRPMでインストールしておき、テスト無しでNet::DNS::ZoenFileをインストールしてみる。

cpan> notest install Net::DNS::ZoneFile

動くようになったところで、レコードの登録をしてみる。 次のようなテスト用のゾーンファイルを作成してみた。example.com.zoneとしておく。

$TTL    3600
@       IN      SOA     example.com. root.example.com.  (
                                2012010301      ; Serial
                                3600            ; Refresh
                                900             ; Retry
                                3600000         ; Expire
                                3600 )          ; Minimum
        IN      NS      ns1.example.com
        IN      NS      ns2.example.com
        IN      MX      10 mx.example.com
        IN      A       192.168.0.1

host1   IN      CNAME   @ 
host2   IN      A       192.168.0.2
;host3   IN      A       192.168.0.3

alias1  IN      CNAME   host2
alias2  IN      CNAME   www.sample.com. 

group1  IN      A       192.168.0.11
group1  IN      A       192.168.0.12

次の項目がどのように処理されるのかを確認したい。 * host1はドメインのAレコードを参照するようにCNAMEを設定 * host3はコメントアウト * alias1はゾーン内で参照を作成 * alias2はゾーン外に参照を作成 * group1は複数のレコードを指定

このゾーンファイルからXMLを作成する。 まず、利用方法を確認しておく。

$ ./bindtoroute53.pl --help
Usage:
    This script converts a BIND zone file to Amazon Route 53
    ChangeResourceRecordSetsRequest XML to migrate a zone to Route 53.

    Known limitations: Only parses A, AAAA, CNAME, MX, NS, SOA, TXT, PTR.
    Does not handle special characters (octets). Net::DNS::ZoneFile 1.04
    does not support specifying time values in short BIND format (eg. 3h),
    all times must be in seconds.

    Dependencies: Net::DNS::ZoneFile and its dependencies

    For help, try:

    bindtoroute53.pl --help

    Usage examples:

    From zone file: bindtoroute53.pl --ignore-origin-ns --ignore-soa
    --origin example.com < example.com.zone > create-request.xml

    From dig: dig @a.iana-servers.net. www.example.com. | bindtoroute53.pl
    --dig --origin example.com > create-request.xml

Options:
    --help  Print a help message and exits.

    --origin [origin]
            Specify the zone origin. (Required)

    --action [action]
            Specify the actions (CREATE or DELETE), defaults to CREATE.

    --ignore-origin-ns
            Ignore NS records for the origin in the input.

    --ignore-soa
            Ignore SOA records in the input.

    --comment [comment]
            Specify custom comment.

    --dig   Process dig output better. Also enables --ignore-soa and
            --ignore-origin-ns.

XMLを作成してみる。 SOAとNSレコードは既に登録されているので、これら を除外しておく。

$ ./bindtoroute53.pl --origin example.com --ignore-origin-ns --ignore-soa < example.com.zone > example.com.zone.xml
Ignoring '.     3600    IN      SOA     example.com. root.example.com. (
                                        2012010301      ; Serial
                                        3600    ; Refresh
                                        900     ; Retry
                                        3600000 ; Expire
                                        3600 )  ; Minimum TTL', --ignore-soa enabled.
Ignoring '.     3600    IN      NS      ns1.example.com.', --ignore-origin-ns enabled.
Ignoring '.     3600    IN      NS      ns2.example.com.', --ignore-origin-ns enabled.

出力されたXMLの抜粋は次の通り。

<?xml version="1.0" encoding="UTF-8"?>
<ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2010-10-01/">
 <ChangeBatch>
  <Comment>This change imports a zone file</Comment>
  <Changes>
   <Change>
    <Action>CREATE</Action>
     <ResourceRecordSet>
      <Name>host2.example.com.</Name>
      <Type>A</Type>
      <TTL>3600</TTL>
      <ResourceRecords>
       <ResourceRecord>
        <Value>192.168.0.2</Value>
       </ResourceRecord>
     </ResourceRecords>
    </ResourceRecordSet>
   </Change>
...
   <Change>
    <Action>CREATE</Action>
     <ResourceRecordSet>
      <Name>host1.example.com.</Name>
      <Type>CNAME</Type>
      <TTL>3600</TTL>
      <ResourceRecords>
       <ResourceRecord>
        <Value>.</Value>
       </ResourceRecord>
     </ResourceRecords>
    </ResourceRecordSet>
   </Change>
...
   <Change>
    <Action>CREATE</Action>
     <ResourceRecordSet>
      <Name>alias1.example.com.</Name>
      <Type>CNAME</Type>
      <TTL>3600</TTL>
      <ResourceRecords>
       <ResourceRecord>
        <Value>host2.</Value>
       </ResourceRecord>
     </ResourceRecords>
    </ResourceRecordSet>
   </Change>
...
   <Change>
    <Action>CREATE</Action>
     <ResourceRecordSet>
      <Name>alias2.example.com.</Name>
      <Type>CNAME</Type>
      <TTL>3600</TTL>
      <ResourceRecords>
       <ResourceRecord>
        <Value>www.sample.com.</Value>
       </ResourceRecord>
     </ResourceRecords>
    </ResourceRecordSet>
   </Change>
...
   <Change>
    <Action>CREATE</Action>
     <ResourceRecordSet>
      <Name>group1.example.com.</Name>
      <Type>A</Type>
      <TTL>3600</TTL>
      <ResourceRecords>
       <ResourceRecord>
        <Value>192.168.0.11</Value>
       </ResourceRecord>
       <ResourceRecord>
        <Value>192.168.0.12</Value>
       </ResourceRecord>
     </ResourceRecords>
    </ResourceRecordSet>
   </Change>
...

レコードの名前にoriginで指定したドメイン名が付与されるのは、Route 53の仕様なのだろう。GUIから操作しても同じように付与されるので。

ゾーン内のエイリアスがうまくいっていない。’@'はもちろん、ドットなしで指定した名前もうまく解決できていない。

その他は概ねよさそうに見える。 コメントアウトした部分はきちんと除外されていて、複数のレコードを持っているケースも適切に処理されているように見える。

このあたりを直そうと思うと、PerlのNet::DNS::RRモジュールのあたりをよく見なければいけなくなりそうなので、今回はゾーンファイルの方を修正して進めてしまうことにする。

差分は次の通り。

$ diff -u example.com.zone.org example.com.zone
--- example.com.zone.org        2012-01-03 13:31:01.457264066 +0900
+++ example.com.zone    2012-01-03 16:29:45.294357055 +0900
@@ -10,11 +10,11 @@
         IN      MX      10 mx.example.com
         IN      A       192.168.0.1

-host1   IN      CNAME   @
+host1   IN      CNAME   example.com.
 host2   IN      A       192.168.0.2
 ;host3   IN      A       192.168.0.3

-alias1  IN      CNAME   host2
+alias1  IN      CNAME   host2.example.com.
 alias2  IN      CNAME   www.sample.com.

 group1  IN      A       192.168.0.11

XMLを再作成してレコードの登録をしてみる。

$ ./bindtoroute53.pl --origin example.com --ignore-soa --ignore-origin-ns < example.com.zone > example.com.zone.xml
$ ./dnscurl.pl --keyname (keyname) -- -X POST -H "Content-Type: text/xml; charset=UTF-8" --upload-file example.com.zone.xml https://route53.amazonaws.com/2010-10-01/hostedzone/Z2M12YG35OHUP1/rrset

レコードの確認

次に登録したレコードの確認をしてみる。 まずは、割り当てられたDNSサーバの1つを指定して、登録したレコードを参照してみる。

$ dig @ns-113.awsdns-14.com host1.example.com

; <<>> DiG 9.7.3-P3-RedHat-9.7.3-2.el6_1.P3.3 <<>> @ns-113.awsdns-14.com host1.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30320
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;host1.example.com.             IN      A

;; ANSWER SECTION:
host1.example.com.      3600    IN      CNAME   example.com.
example.com.            3600    IN      A       192.168.0.1

;; AUTHORITY SECTION:
example.com.            172800  IN      NS      ns-113.awsdns-14.com.
example.com.            172800  IN      NS      ns-802.awsdns-36.net.
example.com.            172800  IN      NS      ns-1514.awsdns-61.org.
example.com.            172800  IN      NS      ns-1705.awsdns-21.co.uk.

;; Query time: 3 msec
;; SERVER: 205.251.192.113#53(205.251.192.113)
;; WHEN: Tue Jan  3 17:17:38 2012
;; MSG SIZE  rcvd: 202

問題はなさそう。

個別のレコードの確認はこれでよいので、全体の確認をしてみる。APIを叩いてXMLでレコードセットを取得する。

$ ./dnscurl.pl --keyname (keyname) -- https://route53.amazonaws.com/2010-10-01/hostedzone/Z2M12YG35OHUP1/rrset > result.xml

取得したXMLデータを整形して参照するために、”Amazon Route 53 to BIND Conversion Tool” を利用してみる。

例のごとく依存関係を解決したら、利用方法を確認しておく。

$ ./route53tobind.pl  --help
Usage:
    This script converts Amazon Route 53 ListResourceRecordSetsResponse XML
    to a BIND zone file.

    Dependencies: XML::Simple, Net::DNS and their dependencies

    For help, try:

    route53tobind.pl --help

    Usage example:

    route53tobind.pl < list-response.xml > example.com.zone

Options:
    --help  Print a help message and exits.

    --origin [origin]
            Specify an origin and reduce the names where possible.
            (Optional)

出力を見てみる。

$ ./route53tobind.pl < result.xml
example.com.    3600    IN      A       192.168.0.1
example.com.    3600    IN      MX      10 mx.example.com.
example.com.    172800  IN      NS      ns-113.awsdns-14.com.
example.com.    172800  IN      NS      ns-1705.awsdns-21.co.uk.
example.com.    172800  IN      NS      ns-1514.awsdns-61.org.
example.com.    172800  IN      NS      ns-802.awsdns-36.net.
example.com.    900     IN      SOA     ns-113.awsdns-14.com. awsdns-hostmaster.amazon.com. (
                                        1       ; Serial
                                        7200    ; Refresh
                                        900     ; Retry
                                        1209600 ; Expire
                                        86400 ) ; Minimum TTL
alias1.example.com.     3600    IN      CNAME   host2.example.com.
alias2.example.com.     3600    IN      CNAME   www.sample.com.
group1.example.com.     3600    IN      A       192.168.0.11
group1.example.com.     3600    IN      A       192.168.0.12
host1.example.com.      3600    IN      CNAME   example.com.
host2.example.com.      3600    IN      A       192.168.0.2

入力として与えたレコードがそのまま登録されていることを確認できる。

example.comがレコードに入ってくるのが鬱陶しければ、originを指定することができる。 このあたりは運用に合わせて選べばよさそう。

$./route53tobind.pl --origin example.com < result.xml
$ORIGIN example.com.
@       3600    IN      A       192.168.0.1
@       3600    IN      MX      10 mx.example.com.
@       172800  IN      NS      ns-113.awsdns-14.com.
@       172800  IN      NS      ns-1705.awsdns-21.co.uk.
@       172800  IN      NS      ns-1514.awsdns-61.org.
@       172800  IN      NS      ns-802.awsdns-36.net.
@       900     IN      SOA     ns-113.awsdns-14.com. awsdns-hostmaster.amazon.com. (
                                        1       ; Serial
                                        7200    ; Refresh
                                        900     ; Retry
                                        1209600 ; Expire
                                        86400 ) ; Minimum TTL
alias1  3600    IN      CNAME   host2.example.com.
alias2  3600    IN      CNAME   www.sample.com.
group1  3600    IN      A       192.168.0.11
group1  3600    IN      A       192.168.0.12
host1   3600    IN      CNAME   example.com.
host2   3600    IN      A       192.168.0.2

続きはまた別のエントリで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>