この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ども、大瀧です。
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で確認します。
登録できてますね。
くり返しの活用
続いて、くり返し処理。eachでループを作ることで連番レコードもお手のものです。
(1..9).each do |num|
rrset "www#{num}.#{zone_apex}", "A" do
ttl 300
resource_records "192.168.1.#{num}"
end
end
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
OKですね。
注意 : -eオプションとの兼ね合い
実際に使うときには、roadworkコマンドの-e(Export)オプションとの兼ね合いを意識する必要があります。-eオプションは、Route 53の現在のゾーンデータをRoutefileにエクスポートしてくれる非常に便利なオプションですが、既存のRoutefileを純粋なDSLの記述で上書きしてしまうため、Ruby記法で書いた内容は失われてしまいます。
そのため、初回時のみ-eオプションを活用し、RoutefileにRuby記法を盛り込んだあとは-eオプションを使わない方がよいでしょう。
まとめ
記事の見た目はRubyの文法入門という感じになってしまいましたが、DNSのレコード定義に応用できると思うと、インフラエンジニアとしては結構胸アツでした。 皆さんもTry & ErrorでRoadworkerを使いこなしましょう!!