【Amazon Route53】AWS CLIで特定文字列レコードを抽出してみた

AWS

2023.12.5

Topics

こんにちは。kisaragi です。
この記事はNHN テコラスAdvent Calendar 2023の5日目の記事です。

この記事では、AWS CLI で Route53 の情報を取得する過程を解説します。

この記事で何が得られる?

192.168.0.* のように、特定のレコード情報がほしい・・・!
しかし、レコードがたくさんあっていちいち確認するのは大変だ・・・

そういった時、解決できる方法をわかりやすく解説していきます。

前提

  • Amazon Linux 2
  • AWS CLI 接続できること
  • READ 権限があること
  • jq が使える環境

jqとは?

  • json データの加工・フィルターが行えるコマンド

jqの準備

今回は Amazon linux 2 環境下にインストールします。
環境によっては yum ではなく、apt のようにインストールコマンドが異なりますので、ご注意ください。

$ sudo yum -y install epel-release
$ sudo yum -y install jq
$ jq --version
jq-1.5

AWS CLI で Route53 の情報を取得してみよう

AWS CLI で使える Route53 のコマンドは こちらをご覧ください。
この記事では、Route53 の情報を取得するために以下2つのコマンドを使用していきます。

list-hosted-zones

Route53のホストゾーンの一覧を取得

$ aws route53 list-hosted-zones | jq -C

jq -C オプションで色つき出力をしたらもっとわかりやすくなりました。
今回は画像のホストゾーンの Id を取得する必要がございます。

Route53のホストゾーンのIdを取得

$ aws route53 list-hosted-zones | jq -r ".HostedZones[] | .Id"


jq -r オプションで RAW 出力をしたら""に囲まれていない値として取得できます。

jq -rを使用しない場合:"/hostedzone/Z062*************9ZJ7"
jq -rを使用した場合:/hostedzone/Z062*************9ZJ7

取得したホストゾーン Id は後で使います。

list-resource-record-sets

ホストゾーンのレコード情報を取得

$ aws route53 list-resource-record-sets --hosted-zone-id Z062*************9ZJ7 | jq '.ResourceRecordSets[]'

# Z062*************9ZJ7には先ほど取得したホストゾーンのIdを入力してください。


ホストゾーンのレコード一覧が取得できました。
今回は画像のValueのみ取得する必要がございます。

ホストゾーンのレコードのValueのみ取得

$ aws route53 list-resource-record-sets --hosted-zone-id Z062*************9ZJ7 | jq -c '.ResourceRecordSets[] | .ResourceRecords'


jq -c オプションでコンパクト出力をしたら、改行やインデント無しのコンパクト形式で出力できます。
* エイリアスレコードの場合はnullが出力されます。エイリアスレコードに関しては後述します。

特定のIPアドレスを持つレコードを抽出してみよう

$ aws route53 list-resource-record-sets --hosted-zone-id Z062*************9ZJ7 | jq -c '.ResourceRecordSets[] | select(.ResourceRecords[]?.Value | test("192.168.0.*"))'

# 192.168.0.*には取得したい文字列を入れてください。

▼ レコードから192.168.0.* という条件に合うレコードのみ取得できました。

エイリアスレコードに関して

エイリアスレコードは画像のようにjsonの形が異なりますので、ご注意ください。
一般レコード:ResourceRecordsとValue
エイリアスレコード:AliasTargetとDNSName

$ aws route53 list-resource-record-sets --hosted-zone-id Z062*************9ZJ7 | jq '.ResourceRecordSets[] | .AliasTarget.DNSName // .ResourceRecords[].Value'

# .AliasTarget.DNSNameの値がnullの場合、.ResourceRecords[].Valueの値を代入する

▼ 上記のような書き方をすることで、エイリアスレコードも同時に処理可能になります。

複数の Route53 の情報を取得してみよう

今まで、1つのホストゾーンに対して情報を取得する方法を学びました。
しかし、ホストゾーンが300個だった場合、どうしたらいいでしょうか。

この記事では、ワンライナーで解決した方法を紹介します。
今回は3つのホストゾーンで説明します。

$ for Zoneid in $(aws route53 list-hosted-zones --query "HostedZones[].Id" --output text); do aws route53 list-resource-record-sets --hosted-zone-id $Zoneid | jq -c '.ResourceRecordSets[] | select(.AliasTarget.DNSName // .ResourceRecords[].Value | test("192.168.0.*"))'; done

# 192.168.0.*には取得したい文字列を入れてください。

example1.com
example2.com
example3.com
複数のホストゾーンから特定のレコードを取得できました。

他の文字列でも抽出可能です。

$ for Zoneid in $(aws route53 list-hosted-zones --query "HostedZones[].Id" --output text); do aws route53 list-resource-record-sets --hosted-zone-id $Zoneid | jq -c '.ResourceRecordSets[] | select(.AliasTarget.DNSName // .ResourceRecords[].Value | test("hello"))'; done

# Valueがhelloのレコードを抽出

$ for Zoneid in $(aws route53 list-hosted-zones --query "HostedZones[].Id" --output text); do aws route53 list-resource-record-sets --hosted-zone-id $Zoneid | jq '.ResourceRecordSets[] | select(.AliasTarget.DNSName // .ResourceRecords[].Value | test("elb"))'; done

# ELBのエイリアスレコードを抽出

最後に

ドメインを Route53 で運用していたら、ホストゾーンもレコードもたくさんできてしまいますね。
そうなると、レコードの管理も大変になってしまいます。

今回は AWS CLI を使うことで手間がかかる作業を簡単に解決してみました。
Route53 のレコード取得で悩んでいる方々に少しでも役に立てれば嬉しいです。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

kisaragi

2023年度新卒入社。クラウドエンジニア。出身は韓国です。 2月生まれの「如月」です。宜しくお願い致します。 尊敬するエンジニア:waka、Cold-Airflowさん

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら