明日以降の自分のヒントになれば、、ということで、検索可能な場所に公開しています。あしからず。
Disclaimer
なにはともあれ、公式のドキュメントをご覧になってください。
- AWSコマンド : http://docs.aws.amazon.com/cli/latest/reference/route53/index.html#cli-aws-route53
- JQコマンド : http://stedolan.github.io/jq/manual/
この文書はメモなので、typoもありますし、パラメータはそのまま打ち込んでも動かない内容です。
テスト用のドメイン(ゾーン)を作成して、一度テストしてみることを強くお勧めします。
AWSのRoute53関連のコマンドは--dry-runのオプションが2015年5月現在で実装されていないため、パラメータが正しいかどうかを確認するには実行してみるしかありません。
以下、AWSのコマンドを実施するためのクレデンシャルなどは設定ずみと仮定しています。
Cookbook
やっと本題です。
管理しているドメイン(ゾーン)のリスト
ゾーンIDと関連する情報が表示されます。
aws route53 list-hosted-zones
特定のドメイン(ゾーン)の情報だけ表示したい場合
aws route53 list-hosted-zones-by-name --dns-name ドメイン名 --max-items 1
jqでゾーンIDだけ取り出したい場合
aws route53 list-hosted-zones-by-name --dns-name ドメイン名 --max-items 1 | jq -r '.HostedZones[] | .Id'
TTLの一覧表示
aws route53 list-resource-record-sets --hosted-zone-id ゾーンID | jq '.ResourceRecordSets[] | {"Type": .Type, "Name": .Name, "TTL": .TTL}'
結果
{
"TTL": 172800,
"Name": "www.example.com.",
"Type": "A"
}
csvにしたい場合
aws route53 list-resource-record-sets --hosted-zone-id ゾーンID | jq -r '.ResourceRecordSets[] | [.Type, .Name, .TTL] |@csv'
実行結果
"A","www.example.com.",300
長いコマンドラインはたるいのでシェルスクリプトにした場合
#!/bin/bash
DOMAINNAME=$1
ZONEID=`aws route53 list-hosted-zones-by-name --dns-name ${DOMAINNAME} --max-items 1 | jq -r '.HostedZones[] | .Id'`
aws route53 list-resource-record-sets --hosted-zone-id ${ZONEID} | jq -r '.ResourceRecordSets[] | [.Type, .Name, .TTL] |@csv'
レコードセットの値の修正(UPSERT)
たとえばメンテナンスの準備のためにTTLを172800(2日)から300(5分)に変えたいとき、これまでは一旦レコードをDELETEしてからCREATEしてましたが、UPSERTのActionをつかうと、新しい値を指定するだけでDELETEしてCREATEをやってくれます。
http://docs.aws.amazon.com/ja_jp/Route53/latest/APIReference/API_ChangeResourceRecordSets.html
aws route53 change-resource-record-sets --hosted-zone-id ゾーンID --dry-run --change-batch file://./バッチファイル名
バッチファイルの中身(JSON)
{
"Comment": "upload.www.streosound.co.jp A record TTL change batch request",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "ホスト名",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "111.222.33.44"
}
]
}
}
]
}
大量のAレコードを一括変更したい場合(実務で使ったことはありません、あくまでもこうやったら動くかも、という方法です)
サーバーのメンテナンス時に、1台のサーバーに複数のバーチャルホストが定義されていたりすると、こういうことをする必要がでてくるかもしれません。
まず、元のデータを保存しておきます
aws route53 list-resource-record-sets --hosted-zone-id ゾーンID | jq '.ResourceRecordSets[] |select(.Type == "A")' > type-A-origin.json
切り戻し用のバッチ作成
Valueは元のままで良いので、まず、切り戻し用のバッチを作っておきます。
perl -p -e 's/^{/{"Action": "UPSERT", "ResourceRecordSet": {/;' -e 's/^}/} }/' type-A-origin.json > original-A-records.json
バッチのコメントなどをつけて完成
echo '{ "Comment": "revert A record", "Changes" [' > tmpfile
cat original-A-records.json >> tmpfile
echo '] }' >> tmpfile
perl -p -0 -e 's/} }\n\{/} },\n{/gm' tmpfile > revert-type-A.json
変更の必要のない部分を削ったりした場合は、あらためてJSONとして正しいかjqで確認してみてもいいかもしれません。
jq '.' < revert-type-A.json
変更するバッチの作成
先に作成した切り戻し用バッチで、コメントとAレコードの値を変更すれば完成です。
perl -p -e 's/"Value": "[^"]+"$/"Value": "1.2.3.4"/ ;' -e 's/revert A record/change A record/ ;' revert-type-A.json > change-type-A.json
jqでJSONのデータ確認
jq '.' < change-type-A.json
変更の実施
aws route53 change-resource-record-sets --hosted-zone-id ゾーンID --change-batch file://./change-type-A.json
切り戻しの実施
aws route53 change-resource-record-sets --hosted-zone-id ゾーンID --change-batch file://./revert-type-A.json