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


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

# 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)

http://aws.typepad.com/aws_japan/2014/02/new-features-for-route-53-improved-health-checks-https-record-modification.html

たとえばメンテナンスの準備のためにTTLを172800(２日)から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レコードを一括変更したい場合（実務で使ったことはありません、あくまでもこうやったら動くかも、という方法です）



サーバーのメンテナンス時に、１台のサーバーに複数のバーチャルホストが定義されていたりすると、こういうことをする必要がでてくるかもしれません。

まず、元のデータを保存しておきます

```
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
```