Amazon Route53管理ツール Roadworkerの設定(Routefile)レシピ

2013.08.29

ども、大瀧です。
Route 53の管理ツールRoadworker、便利ですね〜。え、どんなツールなのか知らない?そんな方は植木の紹介記事をどうぞ!(宣伝)
早速、弊社案件でもちょこちょこ活用しています。

触っていて気になったのが、Roadworkerの設定ファイルRoutefileの書き方です。RoutefileはRoute 53のゾーン情報をRubyのDSLで記述するので、Rubyのいろいろな文法が使えるんじゃないかと思い立ち、試してみました。

Routefileの例

zone_apex = "example.com"
servers = [{
  name: "mail",
  record: "192.168.1.20"
},{
  name: "app",
  record: "192.168.1.30"
}]

hosted_zone zone_apex do
  rrset zone_apex, "A" do
    dns_name "elb-dns-name.ap-northeast-1.elb.amazonaws.com"
  end

  rrset "www.#{zone_apex}", "CNAME" do
    ttl 300
    resource_records(
      "www1.#{zone_apex}"
    )
  end

  (1..9).each do |num|
    rrset "www#{num}.#{zone_apex}", "A" do
      ttl 300
      resource_records "192.168.1.#{num}"
    end
  end

  servers.each do |server|
    rrset "#{server[:name]}.#{zone_apex}", "A" do
      ttl 300
      resource_records server[:record]
    end
  end
end

結果としては、Rubyの文法であれば一通り動きそうでした。DNSのゾーン管理で役に立ちそうなものをいくつかピックアップします。

変数の活用

まずは変数です。普通に使えますが、ゾーン名(Route 53のZone Apex)に使うととても便利です。

zone_apex = "example.com"
hosted_zone zone_apex do
  rrset zone_apex, "A" do
    dns_name "elb-dns-name.ap-northeast-1.elb.amazonaws.com"
  end

実行した結果をManagement Consoleで確認します。

roadworker02

登録できてますね。

くり返しの活用

続いて、くり返し処理。eachでループを作ることで連番レコードもお手のものです。

(1..9).each do |num|
    rrset "www#{num}.#{zone_apex}", "A" do
      ttl 300
      resource_records "192.168.1.#{num}"
    end
  end

roadworker03

OKですね。

配列/ハッシュの活用

この辺りは、やり過ぎるとDSLで記述する意義が薄れてしまうので注意が必要です。ただ、文法をよくわかっていない人に更新をお願いするときは、配列やハッシュに必要な設定がまとまることで、わかりやすくていいのではと思います。

servers = [{
  name: "mail",
  record: "192.168.1.20"
},{
  name: "app",
  record: "192.168.1.30"
}]
servers.each do |server|
    rrset "#{server[:name]}.#{zone_apex}", "A" do
      ttl 300
      resource_records server[:record]
    end
  end

roadworker04

OKですね。

注意 : -eオプションとの兼ね合い

実際に使うときには、roadworkコマンドの-e(Export)オプションとの兼ね合いを意識する必要があります。-eオプションは、Route 53の現在のゾーンデータをRoutefileにエクスポートしてくれる非常に便利なオプションですが、既存のRoutefileを純粋なDSLの記述で上書きしてしまうため、Ruby記法で書いた内容は失われてしまいます。

そのため、初回時のみ-eオプションを活用し、RoutefileにRuby記法を盛り込んだあとは-eオプションを使わない方がよいでしょう。

まとめ

記事の見た目はRubyの文法入門という感じになってしまいましたが、DNSのレコード定義に応用できると思うと、インフラエンジニアとしては結構胸アツでした。 皆さんもTry & ErrorでRoadworkerを使いこなしましょう!!