[JAWS-UG CLI] Route53:#2 独自ドメインを取得する (route53domains)


http://jawsug-cli.doorkeeper.jp/events/13530 でのハンズオン資料です。

Route53で独自ドメインを取得します。(2014-07-31にリリースされた新機能です。)


注) この手順は、検証の度にドメイン費用がかかるため、精度があまり高くないかもしれません...。



# 前提

* Route53へのフルアクセス権限が必要です。

* route53domainsは、us-east-1で提供されているようです。us-east-1以外をデフォルトリージョンにしている場合は、 ```--region us-east-1``` をコマンドに追加してください。



# 0. 事前作業

0.1. ドメイン候補
-----------------

最初に取得するドメインの候補を決めます。


0.2. 登録情報の作成
-------------------

レジストリへの登録情報をJSONファイルに記述します。

```json:contact.json(sample):
   {
     "FirstName": "Taro",
     "LastName": "Domai",
     "ContactType": "COMPANY",
     "OrganizationName": "Example, LLC.",
     "AddressLine1": "XX-XX 1Chome XXXX Minato-ku",
     "AddressLine2": "",
     "City": "Tokyo",
     "State": "",
     "CountryCode": "JP",
     "ZipCode": "XXX00XX",
     "PhoneNumber": "+81.XXXXXXXXX",
     "Email": "info@example.net",
     "Fax": "",
     "ExtraParams": [
     ]
   }
```

* ContactTypeは、"PERSON"|"COMPANY"|"ASSOCIATION"|"PUBLIC_BODY"|"RESELLER" のいずれかを記載する。

* PhoneNumberは、"+(国番号: 日本は81).(最初の0を除く市外局番を含む番号。ハイフンは付けない)"の形式で記述する。(形式チェック厳しい)


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

```bash:コマンド:
jsonlint -q contact.json
```

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


1. ドメインの利用可能確認
=========================

取得可能(Available)なドメインがみつかるまで、以下のコマンドを繰り返します。

```bash:変数の設定:
R53DOMAIN_NAME='example.jp'
```

```bash:コマンド:
aws route53domains check-domain-availability \
  --region us-east-1 \
  --domain-name ${R53DOMAIN_NAME}
```


```json:結果(取得可能な場合):
{
    "Availability": "AVAILABLE"
}
```

```json:結果(取得不可能な場合):
{
    "Availability": "UNAVAILABLE"
}
```

2. ドメインの取得
=================

取得するドメインが確定したら、実際にドメインの取得を行います。

```bash:変数の設定:
R53DOMAIN_YEAR='1'
R53DOMAIN_FILE_ADMIN='contact.json'
R53DOMAIN_FILE_REG='contact.json'
R53DOMAIN_FILE_TECH='contact.json'
```

```bash:コマンド:
aws route53domains register-domain \
  --region us-east-1 \
  --domain-name ${R53DOMAIN_NAME} \
  --duration-in-years ${R53DOMAIN_YEAR} \
  --admin-contact file://${R53DOMAIN_FILE_ADMIN} \
  --registrant-contact file://${R53DOMAIN_FILE_REG} \
  --tech-contact file://${R53DOMAIN_FILE_TECH} \
  --auto-renew \
  --privacy-protect-admin-contact \
  --privacy-protect-registrant-contact \
  --privacy-protect-tech-contact
```

```bash:結果(例):
{
    "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```


3. ドメイン取得確認
=========================


3.1. 処理状況の確認
-------------------

ドメイン登録の処理状況を確認します。

```bash:コマンド:
aws route53domains list-operations \
  --region us-east-1
```

```json:結果(例:登録作業中):
   {
       "Operations": [
           {
               "Status": "IN_PROGRESS", 
               "Type": "REGISTER_DOMAIN", 
               "SubmittedDate": 1407500711.711, 
               "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
           }
       ]
   }
```

```json:結果(例:登録完了):
   {
       "Operations": [
           {
               "Status": "SUCCESSFUL", 
               "Type": "REGISTER_DOMAIN", 
               "SubmittedDate": 1407500711.711, 
               "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
           }
       ]
   }
```

* 登録が完了すると、Billingメールがすぐ届きます;-)



3.2. コンタクト先存在確認メールの受信
-------------------------------------

ドメイン登録が完了すると、コンタクト先として登録したメールアドレスに存在確認メールが届くので、本文のURLにアクセスしてください。

```text:mail(verify):
   From: Amazon Route 53 <noreply@domainnameverification.net>
   Date: 2014年8月8日 21:54:39 JST
   Subject: Verification of your contact data
   To: info@example.net


   Hello,

   This is an important email, and your prompt action is required. If you do not act on the instructions we are providing below, your domain name(s) will be suspended on 2014-08-23 14:27.

   Why is this required?
   Beginning January 1st, 2014, ICANN requires that registrars verify that domain contacts can be reached. 

   What do you need to do?
   Please confirm that your email address info@example.net can be reached, by clicking on the link below:

   http://domainnameverification.net/?hash=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   If you use this link, we will not need to ask you for any password during this process.

   Amazon Route 53

   To setup your domain, log in to the AWS Console at https://console.aws.amazon.com/route53/home
```

3.3. コンタクト先存在確認webページへのアクセス
-------------------------------------------

URLにアクセスして、'Your contact is now validated.' と表示されればコンタクト先存在確認手続きは完了です。



3.4. コンタクト先存在確認完了メールの受信
-----------------------------------------

Webでの確認が完了すると、コンタクト先として登録したメールアドレスに存在確認完了メールが届きます。

```text:mail(success):
   From: Amazon Route 53 <route53-dev-admin@amazon.com>
   Subject: example.jp was successfully registered with Route 53
   Date: 2014年8月8日 21:30:41 JST
   To: Admin <info@example.net>

   Hi,
   We have successfully registered example.jp. We also created a hosted zone for your domain. This hosted zone is where you store information about how to route traffic for your domain, for example, to an Amazon EC2 instance or a CloudFront distribution. To learn how to add resource record sets to your hosted zone, see Working with Resource Record Sets.
   If you did not request this change, please contact Amazon Web Services Customer Support immediately.
   Amazon Route 53
```


4. NameServersの確認
============================

一応、whoisデータベースにNameServerが登録されていることを確認しておきます。


```bash:変数の設定:
R53_ZONE_NAME=${R53DOMAIN_NAME}
```

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

```text:結果(例)::
  Name Server: NS-X.AWSDNS-XX.COM
  Name Server: NS-XXXX.AWSDNS-XX.CO.UK
  Name Server: NS-XXX.AWSDNS-XX.NET
  Name Server: NS-XXXX.AWSDNS-XX.ORG
```



5. ドメイン移転の防護設定
=========================

不正にドメイン移転されないように、防護設定をしておきましょう。


5.1. 設定
---------

```bash:コマンド:
aws route53domains enable-domain-transfer-lock \
  --region us-east-1 \
  --domain-name ${R53DOMAIN_NAME}
```

```json:結果(例):
{
    "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```


5.2. 設定変更の処理状況確認
---------------------------

```bash:コマンド:
aws route53domains list-operations \
  --region us-east-1
```

```json:結果(例:transfer-lock):
{
       "Operations": [
           {
               "Status": "SUCCESSFUL", 
               "Type": "DOMAIN_LOCK", 
               "SubmittedDate": 1407559215.777, 
               "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
           }
       ]
}
```


5.3. 設定完了通知メールの受信
-----------------------------

設定が完了すると、コンタクト先として登録したメールアドレスに設定完了通知が届きます。

```text:mail(success):
   From: Amazon Route 53 <route53-dev-admin@amazon.com>
   Subject: Domain details update for example.jp succeeded
   Date: 2014年8月9日 13:40:23 JST
   To: Admin <info@example.net>

   Hi,
   We recently received an online request from your AWS account to make the following change:
   Lock the domain
   If you requested this change, you don't need to take any further action.
   If you did not request this change, please contact Amazon Web Services Customer Support immediately.
   Amazon Route 53
```


(任意) Privacy Protection
=========================

ドメイン取得時にPrivacy Protectionの設定をしていない場合、住所や電話番号、メールアドレスなどがwhoisデータベースで表示されます。

Privacy Protectionは後からでも設定できるので、個人での取得の場合は設定しておくとよいでしょう。


設定
----

```bash:コマンド:
aws route53domains update-domain-contact-privacy \
  --region us-east-1 \
  --domain-name ${R53DOMAIN_NAME} \
  --admin-privacy \
  --registrant-privacy \
  --tech-privacy
```

```json:結果(例):
{
    "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```


設定変更の処理状況確認
----------------------

処理状況はlist-operationsコマンドで確認できます。

```bash:コマンド:
aws route53domains list-operations \
  --region us-east-1
```

```json:結果(例:change-privacy-protection:抜粋):
{
       "Operations": [
           {
               "Status": "SUCCESSFUL", 
               "Type": "CHANGE_PRIVACY_PROTECTION", 
               "SubmittedDate": 1407541562.054, 
               "OperationId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
           }
       ]
}
```


設定完了通知メールの受信
------------------------

設定が完了すると、コンタクト先として登録したメールアドレスに設定完了通知が届きます。

```text:mail(success):
   From: Amazon Route 53 <route53-dev-admin@amazon.com>
   Subject: Domain details update for example.jp succeeded
   Date: 2014年8月9日 8:46:14 JST
   To: Admin <info@example.net>

   Hi,
   We recently received an online request from your AWS account to make the following change:
   Enable ADMIN contact privacy for the domain example.jp.
   Enable OWNER contact privacy for the domain example.jp.
   Enable TECH contact privacy for the domain example.jp.
   Enable BILL contact privacy for the domain example.jp.
   If you requested this change, you don't need to take any further action.
   If you did not request this change, please contact Amazon Web Services Customer Support immediately.
   Amazon Route 53
```


whoisデータベースの確認
-----------------------

whoisデータベースでのコンタクト先が、レジストラのものになっていることを確認します。

```bash:コマンド:
whois ${R53DOMAIN_NAME}
```

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

   Registrant Name: Taro Domai
   Registrant Organization: Example, LLC.
   Registrant Street: Gandi, 63-65 boulevard Massena
   Registrant City: (Gandi) Paris
   Registrant State/Province:
   Registrant Postal Code: (Gandi) 75013
   Registrant Country: (Gandi) FR
   Registrant Phone: (Gandi) +33.170377666
   Registrant Phone Ext:
   Registrant Fax: (Gandi) +33.143730576
   Registrant Fax Ext:
   Registrant Email: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXX@contact.gandi.net
   Registry Admin ID:
   Admin Name: Taro Domai
   Admin Organization: Example, LLC.
   Admin Street: Gandi, 63-65 boulevard Massena
   Admin City: (Gandi) Paris
   Admin State/Province:
   Admin Postal Code: (Gandi) 75013
   Admin Country: (Gandi) FR
   Admin Phone: (Gandi) +33.170377666
   Admin Phone Ext:
   Admin Fax: (Gandi) +33.143730576
   Admin Fax Ext:
   Admin Email: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXX@contact.gandi.net
   Registry Tech ID:
   Tech Name: Taro Domai
   Tech Organization: Example, LLC.
   Tech Street: Gandi, 63-65 boulevard Massena
   Tech City: (Gandi) Paris
   Tech State/Province:
   Tech Postal Code: (Gandi) 75013
   Tech Country: (Gandi) FR
   Tech Phone: (Gandi) +33.170377666
   Tech Phone Ext:
   Tech Fax: (Gandi) +33.143730576
   Tech Fax Ext:
   Tech Email: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXX@contact.gandi.net
```

6. hosted zoneの確認
====================

取得したドメインのRoute53での設定を確認します。


6.1. 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:結果(例):
   ZXXXXXXXXXXXXX
```


6.2. ゾーン情報の取得
-------------------

hosted zone IDをキーにゾーン情報を確認します。

```bash:コマンド:
aws route53 list-resource-record-sets \
  --hosted-zone-id /hostedzone/${R53_ZONE_ID}
```

```json:結果(例):
   {
       "ResourceRecordSets": [
           {
               "ResourceRecords": [
                   {
                       "Value": "ns-XXXX.awsdns-XX.co.uk."
                   }, 
                   {
                       "Value": "ns-XXX.awsdns-XX.com."
                   }, 
                   {
                       "Value": "ns-XXX.awsdns-XX.net."
                   }, 
                   {
                       "Value": "ns-XXXX.awsdns-XX.org."
                   }
               ], 
               "Type": "NS", 
               "Name": "example.jp.", 
               "TTL": 172800
           }, 
           {
               "ResourceRecords": [
                   {
                       "Value": "ns-XXXX.awsdns-XX.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                   }
               ], 
               "Type": "SOA", 
               "Name": "example.jp.", 
               "TTL": 900
           }
       ]
}
```

この時点では、SOAレコードとNSレコードだけが登録されています。



7. nsレコードの確認
====================

インターネット上で実際にnsレコードが引けることを確認します。

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

```text:結果(例):
   ; <<>> DiG 9.8.3-P1 <<>> ns example.jp
   ;; global options: +cmd
   ;; Got answer:
   ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17924
   ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

   ;; QUESTION SECTION:
   ;example.jp.			IN	NS

   ;; ANSWER SECTION:
   example.jp.		172800	IN	NS	ns-XXXX.awsdns-XX.org.
   example.jp.		172800	IN	NS	ns-XXXX.awsdns-XX.co.uk.
   example.jp.		172800	IN	NS	ns-XXX.awsdns-XX.net.
   example.jp.		172800	IN	NS	ns-X.awsdns-XX.com.

   ;; Query time: 378 msec
   ;; SERVER: 192.168.0.1#53(192.168.0.1)
   ;; WHEN: Sat Aug  9 22:15:39 2014
```

# 次は

この手順では以下が完了し、ドメイン運用の基盤的な準備が完了しました。

* ドメインの取得
* whiosデータベースの登録
* ゾーン情報の作成 (SOA/NS)

この後は、個別のリソースレコードを登録して、ドメインの実運用をしていくことになります。