話題の記事

【AWS】Route53をgitで管理する「Roadworker」を早速試してみました

2013.08.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。8月23日にcloudpackさん主催のcloudpack night #7に参加してきました。夜8時すぎから始まった懇親会では、AWSを利用している各社の気合の入ったライトニングトークを聞くことができました。その中で「Roadworker」というツールをクックパッド株式会社の菅原さんが紹介されていました。

cloudpack Night #7で発表しました / Roadworkerというツールを作りました

このツールは一言でいうとRoute53(DNS)のレコードをChefやPuppetのようにコードで管理できる(もちろん冪等性も!)というものです。素晴らしいですね。動作デモの様子が上記ページにあるYoutubeの動画で紹介されていますが、とても簡単にDNSレコードをコードで管理できる様子がわかります。

それでは早速試してみましょう!

準備するもの

  • AWSアカウント
  • Route53 Fullaccess権限をもったIAMインスタンスプロファイル(またはアクセスキー+シークレットアクセスキー)
  • Route53のゾーン(Hosted Zone)(今回は事前に作成しましたが、なくても良さそう)
  • Roadworkerを実行するためのLinux環境(今回はAmazon LinuxのEC2を使用)
  • Ruby >= 1.9
$ sudo yum -y install git rubygems19 make gcc ruby19-devel libxml2-devel libxslt-devel
$ gem1.9 search roadworker -r
roadworker (0.3.2)
$ sudo gem1.9 install roadworker --no-rdoc --no-ri
:
Successfully installed uuidtools-2.1.4
Successfully installed nokogiri-1.5.10
Successfully installed json-1.8.0
Successfully installed aws-sdk-1.15.0
Successfully installed tins-0.9.0
Successfully installed term-ansicolor-1.2.2
Successfully installed net-dns-0.8.0
Successfully installed systemu-2.5.2
Successfully installed macaddr-1.6.1
Successfully installed uuid-2.3.7
Successfully installed roadworker-0.3.2
:
11 gems installed

インストールができました。コマンドを実行してみましょう。

$ roadwork --version
roadwork 0.3.2

レコードの作成/更新

最初に作業ディレクトリを作成しgit initしておきます。

$ mkdir route53
$ cd route53
$ git config --global user.name "Kazuki Ueki"
$ git config --global user.email ueki.kazuki@example.com
$ git init .

まずはRoutefileファイルを作成します。これはChefでいうレシピファイルにあたるものです。-e(--export)オプションをつけることで現在のレコード情報をエクスポートし、-o(--output)で指定したファイルに出力することができます。

$ roadwork -e -o Routefile
Export Route53 to `Routefile`
$ cat Routefile
hosted_zone "example.com." do
end
$ git add .
$ git commit -m "first commit"

複数ドメインを管理している場合はRoutefileにhosted_zoneが複数出力され、1ファイルで複数ドメインが管理できるようです。

それでは実際にレコードを追加してみましょう。頻繁に使うレコードタイプはAMX、それとAWS固有のALIASあたりでしょうか。いずれもRoadworkerのドキュメントにサンプルが載っていますので、それを参考に使ってみましょう。

Routefile

hosted_zone "example.com." do
  rrset "www.example.com.", "A" do
    ttl 300
    resource_records(
      "10.0.10.11",
      "10.0.10.12"
    )
  end

  rrset "example.com.", "MX" do
    ttl 600
    resource_records(
      "10 mx.example.com",
      "10 mx2.example.com"
    )
  end

  rrset "example.com.", "A" do
    dns_name "elb-0000000000.ap-northeast-1.elb.amazonaws.com"
  end

end

ここで一つ注意することがあります。ALIAS(dns_name)で指定するELBのホスト名は実際にDNSで名前解決できるものでなければいけません。存在しないホスト名を指定した場合はレコード適用時に「Tried to create an alias that targets example.com., type A in zone Z2YNXXXXXXXXXX, but that target was not found」となりレコードの更新に失敗します。

2013.08.25 20:00 追記
菅原さんからのコメントにあるように、設定ファイルはデフォルトでRoutefileになりますが、-f(--file)オプションで異なるファイル名を指定することができるそうです。

ファイルができたら-a(--apply)でレコードを適用しますが、その前にdry-runさせて記述に誤りがないか確認しましょう。

$ roadwork --dry-run -a -f Routefile
Apply `Routefile` to Route53 (dry-run)
Create ResourceRecordSet: www.example.com A (dry-run)
Create ResourceRecordSet: example.com MX (dry-run)
Create ResourceRecordSet: example.com A (dry-run)
No change
$ git add .
$ git commit -m "Add a,mx,alias records"

問題ないようなので実際に適用しましょう。冪等性確認のため2度実行してみます。

(1度目)
$ roadwork -a -f Routefile
Apply `Routefile` to Route53
Create ResourceRecordSet: www.example.com A
Create ResourceRecordSet: example.com MX
Create ResourceRecordSet: example.com A

(2度目)
$ roadwork -a -f Routefile
Apply `Routefile` to Route53
No change

2度目のapplyの時には冪等性が働いて「No change」となっていますね。
問題なく適用できたようなのでマネージメントコンソールのRoute53の画面で確認してみましょう。

20130825_route53-roadworker

マネージメントコンソールでwww.example.comのAレコードを書き換えて、再度roadworkerを実行してみましょう。差異を検出してRoutefileの内容に書き換えてくれます。

$ roadwork -a -f Routefile
Apply `Routefile` to Route53
Update ResourceRecordSet: www.example.com. A
  set resource_records=[{:value=>"10.0.10.11"}, {:value=>"10.0.10.12"}]: www.example.com. A

テスト

Roadworkには-t(--test)オプションがあり、実際にDNSでレコードを引いた結果とRoutefileとの結果を比較し、違いがあればテストが失敗します。なお今回はexample.comで試しているので、テストはすべて失敗してしまいます。このテストをレコード更新時に走らせることでオペミス(!)を即時発見できるようになっています。

DNSのオペミスの怖さを経験した方なら・・・このありがたさが、きっとわかると思います

まとめ

Roadworkerを使うことでDNSも「コード」として管理できるようになりました。使い方も簡単で、とても素敵です。特にdry-runとtestの機能がついていることで、レコードの更新前後にテストができる点がうれしいです。

さてこれで、CloudFormationでインスタンス構築をコード化し、Chefでミドルウェアの構成をコード化し、RoadworkerでDNSレコードをコード化することができました。まさにInfrastructure as Codeですね。ぜひ皆さんもRoadworkerを試してみて、マネージメントコンソールを使わずコードでAWSを管理できる便利さを実感してみてください。