AWS CLIを使って別のAWSアカウントへホストゾーンの移行をする

## はじめに
Qiita 初投稿です。
先人の皆様の知恵はお借りしていましたが、自身で書くのは初めてです。
会社のエンジニアのメンバーが増えてきたことと、社内wikiに書くんだったらいっその事オープンにしちゃおうってことでこれからは少しずつ投稿しようと思っています。

## 移行するきっかけ
ドメインのレジストラはお名前.com、DNSはAWSを使用していますが、肝心のアプリケーション部分はまた異なるAWSアカウントで運用されていました。
出来れば管理するアカウントも減らしていきたいと当初はドメインの管理もAWSにしようとしましたが断念しました。（.jpのドメイン高すぎたw）

そこで、アプリケーション部分で使用しているAWSアカウントへホストゾーンの移行を行いました。
ここでは簡単にその手順の流れを備忘録として記載します。

## 手順
1. AWS CLIのインストールまたはアップグレード
2. 新しいホストゾーンの作成
3. 移行するレコードファイルの作成
4. 移行するレコードファイルの編集
5. 新しいホストゾーンのレコードを作成
6. ドメインのネームサーバーの変更
7. 古いホストゾーンを削除（必要な方は）

## AWS CLIのインストールまたはアップグレード
AWS CLI は、AWS のサービスとやり取りするためのコマンドを提供するオープンソースツールです。

以下の手順では`Python 2.6.5`以降が必要です。

```
$ python -V
Python 3.5.1 :: Anaconda 4.0.0 (x86_64)
```

1. easy_install で pip を入れる

```
$ sudo easy_install pip
Password:
Searching for pip
Reading https://pypi.python.org/simple/pip/
// 略
Processing dependencies for pip
Finished processing dependencies for pip
```

2. pipを使用してAWS CLIをインストール

```
$ sudo pip install awscli
```

## 新しいホストゾーンの作成
移行先となるアカウントでホストゾーンの作成をします。
※ 作成後、`NSレコード`は後で使うので、控えておきましょう。

<img width="743" alt="route53.png" src="https://qiita-image-store.s3.amazonaws.com/0/166141/0c56184a-b23e-d7ac-f6d0-034c19aa85ce.png">

## 移行するレコードファイルの作成
移行するレコードをコピペしてもいいですが、レコードが多いと面倒なので、レコードファイルを作成します。

移行元のアカウントにログインして、移行するホストゾーンの`ホストゾーンID`を取得します。

下記のコマンドを実行する

```
$ aws route53 list-resource-record-sets --hosted-zone-id hosted-zone-id > path-to-output-file
```

- hosted-zone-id に、取得したホストゾーンの ID を指定します。
- path-to-output-file に、出力を保存するディレクトリのパスとファイル名を指定します。

取得したファイルは後ほど使用するので、コピーしておきましょう。

## 新しいホストゾーンの編集
移行するレコードのうち、いくつか編集が必要です。
適切なテキストエディタで開いて、変更をします。

1. 出力の最初の2行を削除する。

```
{
    "ResourceRecordSets": [
```

2. NSレコードとSOAレコードに関連する行を削除する。
※ 新しいホストゾーンには既にこの2つのレコードがあるので。

3. 各レコードに、ActionおよびResourceRecordSet要素を追加する。

大まかな参考例

```
{
    "Comment": "CREATE a record ",
        "Changes": [{
        "Action": "CREATE",
        "ResourceRecordSet": {
            "Name": "a.example.com",
            "Type": "A",
            "TTL": 300,
            "ResourceRecords": [{ "Value": "4.4.4.4"}]
        }
    }]
}
```

## 新しいホストゾーンのレコードを作成
レコードファイルが出来たら、新しいホストゾーンで作成します。

```
$ aws route53 change-resource-record-sets --hosted-zone-id id-of-new-hosted-zone --change-batch file://path-to-file-that-contains-records

{
    "ChangeInfo": {
        "Comment": "CREATE a record",
        "Status": "PENDING",
        "Id": "/change/AAAAAAAAAAAAA",
        "SubmittedAt": "2018-12-18T05:16:49.264Z"
    }
}
```

- id-of-new-hosted-zone に、新しく作成したホストゾーンの ID を指定します。
- path-to-file-that-contains-records に、作成するディレクトリのパスとファイル名を指定します。

※ ここで、`file://`は必須になるので、ご注意を。私はここで少し躓きました。

```
$ aws route53 get-change --id /change/AAAAAAAAAAAAA
{
    "ChangeInfo": {
        "SubmittedAt": "2018-12-18T05:16:49.264Z",
        "Status": "INSYNC",
        "Comment": "CREATE a record",
        "Id": "/change/BBBBBBBBB"
    }
}
```

ここまで出来ると、新しいホストゾーンにレコードが全て作成されます。

## ドメインのネームサーバーの変更
レジストラとしてお名前.comを使用しているので、新しくホストゾーンを作成した時に控えていたNSレコードを貼り付けましょう。
※ （反映までに時間が掛かります。）

## 古いホストゾーンを削除（必要な方は）
最後に、移管元アカウントのホストゾーンを削除しましょう。
ホストゾーンは存在すると料金が発生するので、使わないホストゾーンは削除するのが懸命です。

> 移行するレコードファイルの作成

こちらを作成した際のファイルを編集します。

すべてのレコードについて `"Action": "CREATE" を "Action": "DELETE"` に変更します。

```
$ aws route53 change-resource-record-sets --hosted-zone-id id-of-old-hosted-zone --change-batch file://path-to-file-that-contains-records
```

- id-of-old-hosted-zone は、古いホストゾーンのIDを指定します。

以上です。

## 最後に
ネームサーバーの切り替え自体はそこまで難しくないですが、事故が発生しやすい場所でもあるので、慎重に手順を控えてやりましょう！