[JAWS-UG CLI] Route53:#1 独自ドメインをRoute53に委任する

自分のドメインの権威サーバをRoute53に引き受けてもらう設定をします。


## [重要] Route53には無料使用枠がないので課金が発生

* Route53には無料使用枠がないので、下記の料金がかかります。

  * http://aws.amazon.com/jp/route53/pricing/

* ホストゾーン
  * ホストゾーンごと (最初の25ホストゾーンまで): 0.50 USD
  * 作成から 12 時間以内に削除されたホストゾーンについては無料。
  * 1ヵ月に満たない分に対して日割り計算されず、月初に課金される。

* クエリ(標準的クエリを選択した場合)
  * 100万クエリごと (最初の10億クエリ/月まで): 0.500 USD

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


独自ドメイン
------------

独自ドメインを保有しており、レジストラに対してWhois情報変更の依頼権限を持っている。


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. whoisコマンドの確認
------------------------

```bash:コマンド:
which whois
```

Amazon Linuxの場合、標準でwhoisコマンドがはいっていないので、ここでは日本語対応(らしい)jwhoisをインストールします。

```bash:コマンド(AmazonLinux):
sudo yum install jwhois -y
```

注釈: OSXやFreeBSDでは、whoisコマンドは標準で利用可能です。



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


登録ドメインの決定
-----------------------

Route53に登録するドメインを決めます。

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

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


2. hosted zone作成
==================

Route53上で、登録するドメインのhosted zoneを作成します。

* Callerは、変更リクエストのユニーク性が保証されればどんな文字列でも良いようです。

* Commentは、任意の文字列でOKです。(オプション)

```bash:変数の設定:
R53_CALLER="${R53_ZONE_NAME}-$(date +%Y%m%d-%H%M%S)"
R53_COMMENT="example zone"
```

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

        R53_ZONE_NAME: ${R53_ZONE_NAME}
        R53_CALLER:    ${R53_CALLER}
        R53_COMMENT:  "${R53_COMMENT}"

ETX
```

```bash:コマンド:
aws route53 create-hosted-zone \
        --name ${R53_ZONE_NAME} \
        --caller-reference ${R53_CALLER} \
        --hosted-zone-config Comment="${R53_COMMENT}"
```

```json:結果(例):
      {
        "HostedZone": {
          "ResourceRecordSetCount": 2,
          "CallerReference": "example.jp-20160620-193012",
          "Config": {
              "Comment": "example zone",
              "PrivateZone": false
          },
          "Id": "/hostedzone/xxxxxxxxxxxxx",
          "Name": "example.jp."
        },
        "DelegationSet": {
          "NameServers": [
              "ns-xxx.awsdns-xx.co.uk",
              "ns-xxx.awsdns-xx.net",
              "ns-xxx.awsdns-xx.com",
              "ns-xxx.awsdns-xx.org"
          ]
        },
        "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/xxxxxxxxxxxxx",
        "ChangeInfo": {
          "Status": "PENDING",
          "SubmittedAt": "6月 19, 2016T01:23:45.678Z",
          "Id": "/change/xxxxxxxxxxxxx"
        }
      }
```


2. ns確認
=========

作成したhosted zoneに割り当てられたNSレコードを確認します。

まず、作成した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
```

そのHosted zone IDのNS(NameServers)のリストを取得します。 ここでは、レジストラの管理画面で作業しやすいようにテーブル形式で出力してみました。

```bash:コマンド:
aws route53 get-hosted-zone \
        --id /hostedzone/${R53_ZONE_ID} \
        --query DelegationSet.NameServers \
        --output table
```

```text:結果(例):
      -----------------------------
      |       GetHostedZone       |
      +---------------------------+
      |  ns-xxx.awsdns-xx.co.uk   |
      |  ns-xxx.awsdns-xx.net     |
      |  ns-xxx.awsdns-xx.com     |
      |  ns-xxx.awsdns-xx.org     |
      +---------------------------+
```

BINDに登録する場合は、以下のように出力します。

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

        R53_ZONE_NAME: ${R53_ZONE_NAME}
        R53_ZONE_ID:   ${R53_ZONE_ID}

ETX
```

```bash:コマンド:
for i in $( \
        aws route53 get-hosted-zone \
          --id /hostedzone/${R53_ZONE_ID} \
          --query DelegationSet.NameServers \
          --output text \
); do echo "${R53_ZONE_NAME}. IN NS ${i}."; done
```


3. whois変更
============


3.1. Route53へのドメインの登録
------------------------------

### whois変更 (ドメインをRoute53に登録する場合)

Route53に割り当てられたNSレコードのホスト名を、自分のドメインのWhois情報にName Serverとして登録します。

ドメインの管理を委託しているレジストラの管理画面などを利用します。 (各レジストラのサポートページなどを参考にがんばってください。)

###ネームサーバ変更 (サブドメインをRoute53に登録する場合)

Route53に割り当てられたNSレコードのホスト名を、ドメインを管理するネームサーバに登録します。 (BINDやNSDのマニュアルを参考にがんばってください。)


3.2. whois確認 (ドメイン全体をRoute53に登録する場合のみ)
--------------------------------------------------------

自分のドメインのWhois情報にName Server情報が反映されたか確認します。

```bash:コマンド:
whois ${R53_ZONE_NAME} | grep 'Name Server'
```

```text:結果(.orgの例):
      Name Server:NS-xxxx.AWSDNS-xx.ORG
      Name Server:NS-xx.AWSDNS-xx.COM
      Name Server:NS-xxx.AWSDNS-xx.NET
      Name Server:NS-xxxx.AWSDNS-xx.CO.UK
      Name Server:
      Name Server:
      Name Server:
      Name Server:
      Name Server:
      Name Server:
      Name Server:
      Name Server:
      Name Server:
```

```text:結果(.jpの例):
      [Name Server]                   NS-xxxx.AWSDNS-xx.ORG
      [Name Server]                   NS-xx.AWSDNS-xx.COM
      [Name Server]                   NS-xxx.AWSDNS-xx.NET
      [Name Server]                   NS-xxxx.AWSDNS-xx.CO.UK
```


3. 事後作業
===========

自分のドメインのNSレコードが、Route53の登録情報と同じであることを確認します。

```bash:コマンド
dig ns ${R53_ZONE_NAME} | grep ${R53_ZONE_NAME}
```

```text:結果:
      ;example.jp.                  IN      NS
      example.jp.           152631  IN      NS      ns-xxxx.awsdns-xx.org.
      example.jp.           152631  IN      NS      ns-xxxx.awsdns-xx.co.uk.
      example.jp.           152631  IN      NS      ns-xx.awsdns-xx.com.
      example.jp.           152631  IN      NS      ns-xxx.awsdns-xx.net.
```


完了
====

これ以降は、Route53上で自分のドメインを管理することができます。