Route53の棚卸しをしたい

id:kizashi1122 です。

Route53 ってレコードを備考欄がないので、コンソールから登録した場合に「これ何のためのレコードだっけ?」ということになりがちです。 IaC 化ってそういう意味でも大事ですよね。

なので、手でつくったレコードが山程あったりすると、まずは棚卸ししてそもそも目的を整理し不要なものは削除したいなとなります。。

よし、全DNSレコードをCSVでエクスポートするかって思ったところで、そんな機能はありません。

ネットで漁るとサーバーワークスさんの記事が見つかりました。

blog.serverworks.co.jp

おお神!

しかし、試したところ、TXT レコードが複数行あったときにCSVが壊れることがわかりました。残念。

となると作るしかないかってことでさくっと Ruby で作りました。

require 'aws-sdk-route53'
require 'csv'

client = Aws::Route53::Client.new

r = client.list_hosted_zones

# header
puts %w(zone domain type value).to_csv

r.hosted_zones.each do |z|
  r2 = client.list_resource_record_sets(hosted_zone_id: z.id)
  r2.resource_record_sets.each do |rs|
    next if %w(SOA NS).include?(rs.type) # CSV に NS/SOA は不要

    domain = rs.name.gsub('\052','*') # wildcard domain
    values = rs.resource_records.empty? ?
               [rs.alias_target&.dns_name] :
               rs.resource_records.map(&:value)

    puts [ z.name, domain, rs.type, values.join("\n") ].to_csv
  end
end

ポイントはこんな感じです。

  • 出力先は標準出力なので適宜ファイルにリダイレクトしてね
  • NSレコード、SOA レコードは出力対象外としたけど適宜カスタマイズしてね
  • ワイルドカードドメインはアスタリスクが \052 に変換されて出力されてしまうので強制的に戻しています
  • レコード設定時に入力・選択した内容は DNSName か ResourceRecords に入ってるので値の入っているほうを採用しています

そして、今、棚卸し中です。

このレコード何のために作ったんだっけ・・・。