[JAWS-UG CLI] Route53:#4 hosted zoneの削除

ハンズオンの後始末として、使わないドメインのhosted zoneを削除します。


前提条件
========


Route53への権限
---------------

Route53に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.38

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.10.38 Python/2.7.11 Darwin/15.5.0 botocore/1.4.28
```


0. 準備
=======


0.1. リージョンの決定
---------------------

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:コマンド(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```





0.3. 削除対象サブドメインの指定
-------------------------------

Route53から削除するサブドメインを決めます。

バケットの作成 (独自ドメイン)
( http://qiita.com/tcsh/items/1f707443e667b6b3c8cf )で独自ドメイン用のバケットが対象であれば、下記のように変数にドメイン名を格納します。

```bash:変数の設定:
R53_ZONE_NAME="${DOMAIN_NAME}" \
        && echo ${R53_ZONE_NAME}
```




0.4. hosted zone idの取得
-------------------------

削除するドメインのhosted zone idを取得します。

```bash:コマンド:
R53_ZONE_ID=$( \
        aws route53 list-hosted-zones \
          --query "HostedZones[?Name == \`${R53_ZONE_NAME}.\`].Id" \
          --output text \
        | sed 's/\/hostedzone\///' \
) && echo ${R53_ZONE_ID}
```

```text:結果(例):
      Zxxxxxxxxxxxx
```


1. 事前作業
===========

(なし)

2. 全レコードの削除
===================

hosted zoneを削除するには、登録されている全レコードをあらかじめ削除しておく必要があります。


2.1. 登録レコードの確認
-----------------------

登録レコードを確認します。

```bash:コマンド:
aws route53 list-resource-record-sets \
        --hosted-zone-id /hostedzone/${R53_ZONE_ID} \
        --query 'ResourceRecordSets[?Type != `SOA`]'
```

```json:結果(例)
      [
        {
          "ResourceRecords": [
              {
                  "Value": "ns-xxx.awsdns-xx.co.uk."
              },
              {
                  "Value": "ns-xxx.awsdns-xx.net."
              },
              {
                  "Value": "ns-xxx.awsdns-xx.com."
              },
              {
                  "Value": "ns-xxx.awsdns-xx.org."
              }
          ],
          "Type": "NS",
          "Name": "example.jp.",
          "TTL": 172800
        },
        {
          "AliasTarget": {
              "HostedZoneId": "Z3BJ6K6RIION7M",
              "EvaluateTargetHealth": false,
              "DNSName": "s3-website-ap-northeast-1.amazonaws.com."
          },
          "Type": "A",
          "Name": "www.example.jp."
        }
      ]
```

ここに表示されたリソースレコードのうち、登録したゾーンのNS以外のレコードを削除する必要があります。


2.2. 削除レコードセットの作成
-----------------------------

削除するリソースレコードセットの定義をJSON形式で記述します。

```bash:変数の設定:
R53_RRSET_NAME="www.${R53_ZONE_NAME}"
R53_RRSET_TYPE='A'
R53_ACTION='DELETE'
DNS_NAME='s3-website-ap-northeast-1.amazonaws.com.'
FILE_INPUT='delete.json'
```

```bash:変数の設定:
cat << ETX

        R53_RRSET_NAME: ${R53_RRSET_NAME}
        R53_RRSET_TYPE: ${R53_RRSET_TYPE}
        R53_ACTION:     ${R53_ACTION}
        DNS_NAME:       ${DNS_NAME}
        FILE_INPUT:     ${FILE_INPUT}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
{
        "Changes": [
          {
            "Action": "${R53_ACTION}",
            "ResourceRecordSet": {
              "Name": "${R53_RRSET_NAME}.",
              "Type": "${R53_RRSET_TYPE}",
              "AliasTarget": {
                "HostedZoneId": "${S3_HOSTED_ZONE_ID}",
                "DNSName": "${DNS_NAME}",
                "EvaluateTargetHealth": false
              }
            }
          }
        ]
}
EOF

cat ${FILE_INPUT}
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド:
jsonlint -q ${FILE_INPUT}
```

エラーが出力されなければOKです。


2.3. レコードの削除
-------------------

実際にレコードを削除します。

```bash:変数の確認:
cat << ETX

        R53_ZONE_ID: ${R53_ZONE_ID}
        FILE_INPUT:  ${FILE_INPUT}

ETX
```

```bash:コマンド:
aws route53 change-resource-record-sets \
        --hosted-zone-id ${R53_ZONE_ID} \
        --change-batch file://${FILE_INPUT}
```

```json:結果(例):
      {
          "ChangeInfo": {
              "Status": "PENDING", 
              "SubmittedAt": "2014-05-27T07:56:56.970Z", 
              "Id": "/change/CXXXXXXXXXXXXX"
          }
      }
```


2.4. 繰り返し
-------------

残登録レコードを確認します。

```bash:コマンド:
aws route53 list-resource-record-sets \
        --hosted-zone-id /hostedzone/${R53_ZONE_ID} \
        --query 'ResourceRecordSets[?Type != `SOA`]'
```

```json:結果(例)
      [
        {
          "ResourceRecords": [
              {
                  "Value": "ns-xxx.awsdns-xx.co.uk."
              },
              {
                  "Value": "ns-xxx.awsdns-xx.net."
              },
              {
                  "Value": "ns-xxx.awsdns-xx.com."
              },
              {
                  "Value": "ns-xxx.awsdns-xx.org."
              }
          ],
          "Type": "NS",
          "Name": "example.jp.",
          "TTL": 172800
        }
      ]
```

ゾーンのNSレコード以外のリソースレコードがなくなるまで、リソースレコードの削除を繰り返します。


3. hosted zoneの削除
====================

SOAレコード、NSレコード以外のリソースレコードを削除が完了したら、hosted zoneを削除します。

```bash:変数の確認:
cat << ETX

        R53_ZONE_ID: ${R53_ZONE_ID}

ETX
```

```bash:コマンド:
aws route53 delete-hosted-zone \
        --id ${R53_ZONE_ID}
```

```json:結果(例):
{
        "ChangeInfo": {
          "Status": "PENDING",
          "SubmittedAt": "6月 20, 2016T01:23:45.678Z",
          "Id": "/change/CXXXXXXXXXXXXX"
        }
}
```


4. 事後作業
===========


削除確認
--------

削除対象のドメインがhosted zoneの一覧に無ければ、削除は完了しています。

```bash:コマンド:
aws route53 list-hosted-zones 
```

```json:結果(例):
{
    "HostedZones": []
}
```

完了
====