複数の Route 53 エイリアスレコードが意図通りに登録できているかを一括で確認する

複数の Route 53 エイリアスレコードが意図通りに登録できているかを一括で確認する

一気に複数のエイリアスレコードを登録する場面で、それぞれのターゲットが意図通りのものであるかをなるべく簡単に確認してみました

コンバンハ、千葉(幸)です。

今回やりたいことはこういったことです。

  • [背景] Route 53 パブリックホストゾーンに複数のエイリアスレコードを登録している
  • [やりたいこと] それぞれのエイリアスレコードのターゲット(今回はELB)が意図したものになっているかをなるべく簡単に確認したい

新規のレコードを登録した後の、設定値確認の場面を想定しています。

レコード数が2,3個であればマネジメントコンソールなどから目で確認するのも手間ではないですが、5個以上となってくるともうちょっと機械的にやりたくなってきます。

今回は dig を使った確認を、少し楽に行えるようにコマンドを組み立ててやってみました。

前提知識:Route 53 エイリアスレコードとは何か

エイリアスレコードは、Route 53 固有の拡張機能です。特殊な A レコード(AAAAレコード)として機能します。CNAME レコードのように「正式名」のデータレコードに対して「エイリアス」をドメイン名に設定します。

CNAME レコードのデータレコードに A レコードのドメイン名を登録している場合、名前解決は以下の2ステップで行われます。

  1. CNAME レコードから A レコードを名前解決
  2. A レコードから IP アドレスを名前解決

それに対してエイリアスレコードの場合、1ステップで IP アドレスを名前解決できます。ELB などの IP アドレスが可変なリソースの DNS 名をデータレコードに登録することで、クライアントの目線からは 1 ステップで IP アドレスが返却されます。

alias record canonical_2

(👇エイリアスレコードの詳細についてはこちら)

エイリアスレコードと非エイリアスレコードの選択 - Amazon Route 53

今回は Route 53 エイリアスレコードのターゲットとしてインターネット向けの NLB(IPv4)を想定しています。エイリアスレコードを名前解決しても NLB の DNS 名を名前解決しても、NLB が持つパブリック IP アドレス(配置したサブネット数に応じて1~3個)が返却されることになります。

Route 53 エイリアスレコードの登録を一括で確認するコマンド

実施するコマンドは以下です。

paste list_a.txt list_b.txt | while read -r a b; do
    if [[ $(dig +short "$a" | sort -V) = $(dig +short "$b" | sort -V) ]]; then
        echo "MATCH: $a = $b"
    else
        echo "MISMATCH: $a$b"
    fi
done

同様の処理をワンライナーで実施する場合はこちらを。

while read -r a b; do [[ $(dig +short "$a" | sort -V) = $(dig +short "$b" | sort -V) ]] && echo "MATCH: $a = $b" || echo "MISMATCH: $a$b"; done < <(paste list_a.txt list_b.txt)

前提

以下のテキストファイルをそれぞれ作成済みであることが前提です。

  • list_a.txt:エイリアスレコード名のリスト
    • レコードの例:hoge.example.com
  • list_b.txt:ターゲットとなるELBのDNS名のリスト
    • DNS名の例:sample-elb-xxx.elb.ap-northeast-1.amazonaws.com

ふたつのリストの中の行が、登録したい内容の組み合わせの順に並んでいる必要があります。

言い換えると、リストAの1行目のエイリアスレコードはリストBの1行目のDNS名のELBをターゲットにしており、2行目以降も同様の並びになっている、という状態です。

処理内容

コマンドの簡単な内訳は以下の通りです。

  • リストAとリストBを行単位で連結する(paste list_a.txt list_b.txt
  • 1行ずつ読み取り変数aと変数bに格納し後続の処理をループする(| while read -r a b;
  • 変数aと変数bを対象に dig +shortで名前解決を試み、その結果が一致しているかどうかを判定する
    • [[ $(dig +short "$a" | sort -V) = $(dig +short "$b" | sort -V) ]]
  • 判定した結果に応じてメッセージを出力する

dig の実行時に +short オプションを付与することで IP アドレスのみを返却させるようにしています。IP アドレスの並びが異なる可能性を考慮し、sort -V で並び替えを行なっています。

動作確認環境

以下の環境で動作確認を行なっています。

  • macOS:Sonoma 14.5
  • AWS CloudShell

AWS CloudShell で実行する場合、デフォルトでは dig がインストールされていないため、以下コマンドであらかじめインストールしておいてください。

sudo yum install bind-utils

実行イメージ

以下のようにカレントディレクトリにリストファイルが作成されているとします。4行目は意図的に組み合わせを間違えています。

$ cat list_a.txt
hoge.example.com
fuga.example.com
piyo.example.com
hoge.example.com
$ cat list_b.txt
hoge-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com
fuga-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com
piyo-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com
piyo-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com

この状態でコマンドを実行すると以下の通り。

$ paste list_a.txt list_b.txt | while read -r a b; do
    if [[ $(dig +short "$a" | sort -V) = $(dig +short "$b" | sort -V) ]]; then
        echo "MATCH: $a = $b"
    else
        echo "MISMATCH: $a$b"
    fi
done
MATCH: hoge.example.com = hoge-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com
MATCH: fuga.example.com = fuga-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com
MATCH: piyo.example.com = piyo-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com
MISMATCH: hoge.example.com ≠ piyo-nlb-xxxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com

組み合わせが合っているか否かの確認がお手軽に実現できました。

おまけ:AWS CLI でエイリアスレコードのみを出力する

今回は dig での確認を行いましたが、AWS CLI でホストゾーン内のレコードを抽出することもできます。

特定のホストゾーン内のエイリアスレコードのみ、レコード名とターゲットの DNS 名を表示するコマンド例は以下です。

$ HOSTED_ZONE_ID=Zxxxxxxxxxxxx

$ aws route53 list-resource-record-sets \
  --hosted-zone-id $HOSTED_ZONE_ID \
  --query "ResourceRecordSets[?AliasTarget].[Name,AliasTarget.DNSName]" \
  --output text  

ふたつのリストの値を行ごとに突合する

Route 53 エイリアスレコードの登録状況の確認を、dig を用いて一括で確認してみました。

今回は Route 53 のレコードの確認、という文脈でしたが、抽象化して考えると「ふたつのリストの値を行ごとに突合する」が今回行ったことでした。

そこまで複雑なコマンドを組み立てることなく実現できたので、何かの機会に思い出していただくと役立つかもしれません。

参考になれば幸いです。

以上、チバユキ (@batchicchi)がお送りしました。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.