LoginSignup
2
1

More than 5 years have passed since last update.

aws cli route53のcookbookというか、jqの使い所、でも動作保証ありませんのでご注意

Posted at

明日以降の自分のヒントになれば、、ということで、検索可能な場所に公開しています。あしからず。

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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1