Amazon Route 53(DNSサービス)にBINDゾーンファイルをインポートする

2013.08.19

AWSのスケーラビリティを最も享受できるサービスは、Route 53(DNS)とCloudFront(CDN)だと個人的には考えています。Route 53は、世界中に散在するAWSのデータセンター(エッジロケーションと言います)で稼働するDNSサーバーを利用する、SLA100%の超スケーラブル&高信頼なDNSサービスです。1ゾーン(ドメイン)を月額0.5ドル+α(リクエスト従量)で利用できます。

Route 53は、AWS環境専用のDNSサービスだと誤解されがちですが、オンプレミスのホスト情報など非AWS用のDNSサーバーとしても利用することが可能です。「ハイリスクで面倒なDNSサーバーの管理から解放されたい!」というインフラ管理者にも、Route 53は有効な選択肢として検討していただきたいサービスです。

ただ、Route 53も他のAWSのサービスと同様に、設定の投入はブラウザベースの管理画面(Management Console)もしくはWeb API経由で行わなくてはなりません。既存のBIND DNSサーバーがあり、大量のリソースレコードを持つときにはRoute 53のインポート機能を使うと便利です。以下に手順と注意点を紹介します。

1. ゾーンの作成

Route 53でインポートしたいゾーンは、AWS Management ConsoleのRoute 53の管理画面で事前に作成しておきます。正引きゾーン、逆引きゾーン *1ともに作成可能です。

route53_import01

2. ゾーンデータのインポート

ゾーン管理画面の上部にある[Import Zone File]ボタンをクリックすると、ゾーンデータをペーストするテキストエリアが表示されます。インポートしたいゾーンデータをテキストエリアにコピー&ペーストし、[Import]ボタンをクリックしインポート完了です。

route53_import02

インポートの制限事項

  • インポートして登録するレコードの上限は、1000です。
  • ゾーンのSOAレコード、NSレコードはゾーン作成時にRoute 53用の値がセットされるため、インポートするゾーンデータに含まれるSOAレコード、NSレコードは無視されます(エラーにはなりません)。

【注意】$GENERATEがエラーになるので"ひと手間"かける

$GENERATEは、大量の連番レコードを生成するBINDゾーンファイルの記法です。現状では、Route 53のインポートではサポートされません。ゾーンデータに$GENERATEを含んでいると、インポート時に以下のようにエラーになります。

route53_import03

これを回避するためには、事前に$GENERATEを展開したゾーンデータを準備します。BINDのユーティリティに含まれるnamed-compilezoneコマンドを使用するのが手っ取り早いです。named-compilezoneコマンドは、BIND(Amazon Linuxでは、bindパッケージ)と一緒にインストールされます。手元のOSXには既にインストール済みでした。

named-compilezone -o <出力するゾーンファイル名> <ゾーン名> <元のゾーンファイル名>
$ named-compilezone -o example_com_compiled.zone example.com example_com.zone
zone example.com/IN: loaded serial 0
dump zone to example_com_compiled.zone...done
OK
$

example_com.zone(元のゾーンファイル)

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       192.168.1.250
$GENERATE 1-30 www$ A 192.168.1.$

example_com_compiled.zone(展開後のゾーンファイル)

example.com.				      86400 IN SOA	example.com. rname.invalid. 0 86400 3600 604800 10800
example.com.				      86400 IN NS	example.com.
example.com.				      86400 IN A	192.168.1.250
www1.example.com.			      86400 IN A	192.168.1.1
www10.example.com.			      86400 IN A	192.168.1.10
www11.example.com.			      86400 IN A	192.168.1.11
www12.example.com.			      86400 IN A	192.168.1.12
www13.example.com.			      86400 IN A	192.168.1.13
www14.example.com.			      86400 IN A	192.168.1.14
 : 

展開後のゾーンデータをコピー&ペーストし、[Import]ボタンをクリックすると、インポートできました。レコード一覧は以下のような感じです。

route53_import04

登録できていますね。

3. 動作確認

Route 53のDNSサーバーに直接問い合わせて、登録を確認してみます。digコマンドやhostコマンドで、ゾーンのNSレコードに登録されているRoute 53のDNSサーバー *2に問い合わせてみます。

$ host www1.example.com ns-AAA.awsdns-EE.com.
Using domain server:
Name: ns-AAA.awsdns-EE.com.
Address: XXX.XXX.XXX.XXX#53
Aliases:

www1.example.com has address 192.168.1.1
$

$ dig @ns-AAA.awsdns-EE.com. www1.example.com

; <<>> DiG 9.8.3-P1 <<>> @ns-AAA.awsdns-EE.com. www1.example.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12031 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;www1.example.com. IN A ;; ANSWER SECTION: www1.example.com. 86400 IN A 192.168.1.1 ;; AUTHORITY SECTION: example.com. 172800 IN NS ns-AAA.awsdns-EE.org. example.com. 172800 IN NS ns-BBB.awsdns-FF.co.uk. example.com. 172800 IN NS ns-CCC.awsdns-GG.com. example.com. 172800 IN NS ns-DDD.awsdns-FF.net. ;; Query time: 82 msec ;; SERVER: XXX.XXX.XXX.XXX#53(XXX.XXX.XXX.XXX) ;; WHEN: Sun Aug 18 23:24:04 2013 ;; MSG SIZE rcvd: 187 $ [/bash]

正常な応答がありますね!

まとめ

BINDのゾーンファイルをRoute 53にインポートする方法をご紹介しました。
既存のBIND環境で大量のレコードを持つ場合でも、Route 53に簡単に移行できることがお分かりいただけたと思います。Route 53をぜひご活用ください!

参考

脚注

  1. EC2やELBなどAWS内のホストに対する逆引きは、各ホストの持つIPアドレスが不定であること、上位の逆引きゾーンへのNSレコードの登録ができないことから不向きです。
  2. NSレコードのDNSサーバーは4つありますがが、どのDNSサーバーでも応答があります。