Route53のレコードを全てCSVに出力する
投稿日:
環境
- Linux Mint 20 Ulyana
- aws-cli/2.0.41
- jq 1.6
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'