Route53のレコードを全てCSVに出力する


環境


Route53に大量のホストゾーンとレコードが登録されているアカウントで、Route53に登録されている内容を一覧化する必要があったので対応しました。
ワンライナーで実現しようと思ったのですが、希望した形にできなかったのでシェルスクリプトにしました。

必要なソフトのインストール

AWS CLI

AWS CLIが無い場合はインストールしておきます。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

AWS CLIの初期設定はこちら
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

jq

jqはjsonを整形するツールです。
Linux Mintであれば以下コマンドでインストールできます。

apt install jq

Route53の内容を取得するスクリプト作成

AWS CLIでRoute53の内容をjson形式で取得し、それをjqで整形しながらCSVに出力するシェルスクリプトを作成します。
スクリプトの内容は以下の通りです。

#!/bin/bash

# CSVのヘッダ出力
echo '"HostedZone","DomainName","DomainType","TTL","Value"'

# ホストゾーン一覧を取得
HostedZones=`aws route53 list-hosted-zones --output json --query 'HostedZones'`
HostedZonesLen=`echo $HostedZones | jq length`

for i in $( seq 0 $(($HostedZonesLen - 1)) ); do
    Zone=`echo $HostedZones | jq .[$i]`
    ZoneId=`echo $Zone | jq -c -r '.Id'`
    ZoneName=`echo $Zone | jq -c -r '.Name'`

    # ホストゾーン内のレコード一覧を取得
    Records=`aws route53 list-resource-record-sets --hosted-zone-id $ZoneId --output json --query 'ResourceRecordSets'`
    RecordsLen=`echo $Records | jq length`

    for i in $( seq 0 $(($RecordsLen - 1)) ); do
        record=`echo $Records | jq .[$i]`
        name=`echo $record | jq -c -r '.Name'`
        type=`echo $record | jq -c -r '.Type'`
        ttl=`echo $record | jq -c -r '.TTL'`
        data=`echo $record | jq -c -r '.AliasTarget.DNSName // ""'`

        # AliasTargetのDNSNameが設定されていない場合はResourceRecordsのValuesを取得する
        if [ -z "$data" ]; then
            data=`echo $record | jq -c -r '.ResourceRecords[].Value'`
        fi

        # dataにはダブルクォートが含まれる可能性があるのでエスケープしておく
        data=${data//\"/\"\"}

        # CSVのボディ出力
        echo "\"${ZoneName}\",\"${name}\",\"${type}\",\"${ttl}\",\"${data}\""
    done
done

簡単な説明

AWS CLIでホストゾーンの情報をjson形式で取得します。

aws route53 list-hosted-zones --output json --query 'HostedZones[]'

取得したホストゾーン情報を1件ずつループを回します。
以下コマンドでホストゾーンのレコードをjson形式で取得します。

aws route53 list-resource-record-sets --hosted-zone-id $ZoneId --output json --query 'ResourceRecordSets'

そして要所要所でjqコマンドでjsonから必要な情報を抽出しています。

補足

AWS CLIのqueryオプションはjqコマンドで抽出するのと同じ効果があります。
つまり、以下のコマンドはどちらも同じ結果となります。

aws route53 list-resource-record-sets --hosted-zone-id $ZoneId --output json --query 'ResourceRecordSets'
aws route53 list-resource-record-sets --hosted-zone-id $ZoneId --output json | jq '.ResourceRecordSets'