読者です 読者をやめる 読者になる 読者になる

uzullaがブログ

uzullaがブログです。

既存のBIND(zoneファイル)からRoute 53に流しこむ件

もうBINDなんて自前で運用したくないですよね、レンタルしたい。
某ベンチャーさん(?)が安くて良い感じのサービスやっているのですけれど*1、お客さんからNGくらいましたので、しかたない、Amazon Web services の Route 53でやります。

Disclaimer

このエントリは私のメモなので、主にハマりどころのメモです。
「全体として」わかるためには、いっぺん他のサイトなどをみてからここに戻ってきたほうが良いです。

手順

1,各ツールをDLする
2,各ツールのPerlの依存モジュール入れる
3,既存zoneファイルを用意する
4,bindtoroute53.pl を改造する(OP)
5,zoneファイルからXML作成しまくる
6,dnscurl.pl が動くように設定する
7,ゾーンを生成しまくる
8,xmlを送信しまくる
9、レジストラでネームサーバー情報を修正する

前述の通り、ググったらまともな情報が山ほどでてくるので、細かい情報はそっちを見てください!

ツールのへんな思想

Route 53は、各ツールで生成したXMLファイルを、dnscurl.plでPOSTすることで操作出来ます。
なので、
XMLを生成するツール
・そのXMLを登録するツール
と認識しながら進めるとわかりやすいです。
なんでそんな糞面倒臭い事になってるのか、私もよくわかりません。

1、DLするツールについて説明

route53zone.pl

http://aws.amazon.com/code/3728292204499537
Route 53にゾーンを新規作成するためのXMLを作成するツール

bindtoroute53.pl

http://aws.amazon.com/developertools/4495891528591897
Bind用のZoneファイルを、Route 53に登録するためのXMLに変換するツール

dnscurl.pl

http://aws.amazon.com/developertools/9706686376855511
生成した各種XMLをRoute 53に送信する為のツール


これら全部Perlで動きます。
依存モジュール結構あるので、がんばっていれてください

2、Perl依存モジュールについて

historyみてみたら

cpanm Net::DNS::RR Net::DNS::ZoneFile NetAddr::IP Net::DNS Net::IP Digest::HMAC Digest::SHA1 Digest::MD5 MIME::Base64 Digest::HMAC_SHA1 FindBin MIME::Base64 Getopt::Long File::Temp File::Basename Fcntl IO::Handle Data::GUID

これくらいはいってればイケるはずです。
多分、この一行が本エントリの一番のお役立ち情報です!!!

4、bindtoroute53.plを改造する

このツール、
@ IN A 123.123.123.123
という表記に対応してない、すごくふべん。
177行目あたりから

        if($name =~ /^.$/){
            $name = $origin;
        }else{
            if($name !~ /$origin\.?$/) {
                if($name =~ /\.$/ || $dig) {
                    print STDERR "Ignoring '" . $zonerr->string . "', name must be part of zone.\n";
                    next;
                }
                $name .= ".$origin.";
            }
        }

こんな風になおすととても楽です。

8,xmlを送信しまくる

8で、実際にレコードを登録していくとき、

perl ./dnscurl.pl --keyname my_ultra_great_key -- -H "Content-Type: text/xml; charset=UTF-8" -X POST --upload-file hoge.jp.xml https://route53.amazonaws.com/2010-10-01/hostedzone/ABCDEFGHIJK/rrset 

こんな風なURLにですけど、↑のURLだと「ABCDEFGHIJK」をちゃんと書き換えましょう。
なんか、ゾーン作成の時のURLににてるんで、XMLだけ変えれば動くかなっておもいがちですけど、POST先になるURLがちがうとエラー言われます。


私が作業しててハマッた5割はこのようなURL指定のミスですので、注意してください。


ドメインと、そのIDをどうやってリストで取得するかって?
AWSのウェブ画面で、コピペして整形するのが早いんじゃないですかね?

9、レジストラにネームサーバー変更を登録する

これ、Route 53ってすっごいめんどいことにネームサーバーがバラバラなんですよね。
私の場合、レジストラをいじるのはお客さんだったので、「awsの管理画面みてコピペしてよwwww」とかいうとヤバイが危険です。ちゃんとエクセルにしてわたさないと安心して駅のホームに立てません。


ということで、

example.jp,nameserver0.aws.com,nameserver1.aws.com,nameserver2aws.com,nameserver3.aws.com
example.jp,nameserver0.aws.com,nameserver1.aws.com,nameserver2aws.com,nameserver3.aws.com

みたいなCSVつくりたいじゃないですか。


で、ネームサーバーの一覧はウェブ管理画面でもみれますけど、仮に100個*5箇所とかエクセルにコピペするのは私の神経だとカジュアルに飛び降りたくなる。


まあ、自動化のAmazonですから、もちろんツールで情報をとってこれます!当然です!こんな感じにすると、Route 53の情報が引けます!やった!明日はホームラン!

perl ./dnscurl.pl --keyname my_ultra_great_key -- -H "Content-Type: text/xml; charset=UTF-8" "https://route53.amazonaws.com/2010-10-01/hostedzone/ABCDEFGHIJK/rrset?
type=NS&name=hoge.jp&maxitems=10" >> nsout.txt

しかしながら人生そこまで甘くはなく、とってきたXMLをみるとわかりますが、すげー糞使いづらいXMLになってて死にたくなる。もはや飛び降り待ったなし。


なので、そのXMLを一括でくわしてCSVを出力する整形ツールを書きなぐった、ひどすぎてGistに貼るのもためらわれるので、ここに貼っておきますね。

perl dnscurl.pl --keyname my_ultra_great_key -- -H "Content-Type: text/xml; charset=UTF-8" "https://route53.amazonaws.com/2010-10-01/hostedzone/ABABABABAbABAAB/rrset?type=NS&name=hoge.jp&maxitems=10" | perl -e '$s;while(){$s.=$_};$s=~s/\n//;print "$s\n"' >> nsout.txt

まずは、前述のような感じで、こういう風にして1行1ドメインなXMLデータをつくっておいて


以下に食わせる

use File::Slurp;
use XML::Simple;
use Data::Dumper;
my $raw = read_file 'nsout.txt';
my @line = split(/\n/, $raw);
for my $l (@line){
	#warn Dumper(XMLin($l));
	my $data = XMLin($l); 
	for my $i ( @{$data->{ResourceRecordSets}->{ResourceRecordSet}} ) {
		#warn Dumper($i);
		if($i->{Type} eq 'NS'){
			print $i->{Name}. ",";
			#warn Dumper($i->{ResourceRecords});
			for my $x ( @{$i->{ResourceRecords}->{ResourceRecord}} ) {
				print $x->{Value}. ",";
			}
		}else{
			next;
		}
		print "\n";
	}
	#exit;
}

CSVがSTDOUTにでてくるので、あとは担当者にメールしてしまいましょう。

まとめ

なんでaws-cliがRoute53対応してないのか理解に苦しむ。


そこらのやってみたブログが全部この方法でかいてるので、他の方法は(多分)ないんだと思うけど、これらのツールがロクでもない(連携しない)ので、ヒッジョーに手間がかかる。
正直これらのツールそのまま使わないで、ツールを自分で書けばよかったっていうか、次やるハメになったら絶対に書く。


おわり。

*1:http://www.gehirn.jp/dns.html