Route53 で RDS endpoint の短縮名を登録する

[Aurora MySQLのtextをEC2 MariaDBレプリカでMroonga全文検索](https://qiita.com/masudakz/items/1afafcca1c01d8b9c276) で言及した件の続編。

> レプリカ設定 MASTER_HOSTは60文字以下にする必要がある。Amazon RDSのendpointは長くなりがちで、東京リージョンではcluster名に使えるのはわずか5文字。Route53を使って短い別名を登録しておくのが本来だろう。

上記記事では5文字のクラスタ名にしたが、実際にRoute53を使う手順を示す。

## AWSコンソール手順

1. Route53
1. ホストゾーン
1. ホストゾーンの作成
    - **ドメイン名:** `vpc.example.com`
    - **コメント:** `for devlop1` など対象VPCを示すコメント文字列を入れる(強く推奨）
    - **タイプ:**   Amazon VPCのプライベートホストゾーン
        - **VPC ID:** 対象VPCを選択
    - 作成ボタン
1.  レコードセットの作成
    - **名前:** `rdsmain` など短縮ホスト名
    - **タイプ:** `CNAME`
    - エイリアス: いいえ
    - TTL(秒): 60秒とか300秒とか
    - **値:** RDS endpoint たとえば `rdsmain-develop1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com`
    - ルーティングポリシー: シンプル
    - レコードセットの保存ボタン

太字が要設定項目、それ以外はデフォールトのままなので、想像するより簡単。
「レコードセット」は必要なだけ（RDS instanceの数だけ）繰り返して作る。

## ドメイン名の決定

参考ドキュメント

- [重複する名前空間を持つパブリックホストゾーンとプライベートホストゾーン](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html#hosted-zone-private-considerations-public-private-overlapping)

> example.com や accounting.example.com など、重複する名前空間を持つプライベートホストゾーンとパブリックホストゾーンがある場合、リゾルバー は最も具体的な一致に基づいてトラフィックをルーティングします。
一致するプライベートホストゾーンはあるが、リクエスト内のドメイン名やタイプと一致するレコードがない場合、リゾルバー はリクエストをパブリック DNS リゾルバーに転送しません。

つまり `example.com` をプライベートホストゾーンのドメインとして使ってしまうと、`www-dev.example.com` などパブリックに登録してあっても、そのVPC内部からは引けなくなってしまう。

この不都合を避けるために、プライベートホストゾーンと、インターネットパブリックのドメイン空間を分離して使うことが必要である。具体的には上記のように、自己保有ドメインのサブドメインを1つ割り当てる。

例

- パブリック:example.com
- プライベート:vpc.example.com

Route53 private hosted zone の影響範囲は特定のVPCだけなので、同じドメイン名を指定した private hosted zone をVPCの数だけつくれば、全部のVPCのそれぞれのRDS instance、endpointは異なるRDS instanceに共通短縮名、たとえば `rdsmain.vpc.example.com` とつけることもできる。並行開発する複数環境、ステージング環境の DB Host名が統一できたりする。

### アンチパターン

`.test` や `.local` など存在しないであろうTopLevelDomainを使って、プライベートホストゾーンを作成する

「存在しないであろう」というところに十分な根拠が無い。
2012年以降ICANNでは募集要項の要件を満たした申請であれば、基本的には誰でもgTLDの登録ができる方針となった。
`.dev`  `.foo` `.app` などをGoogleが所有していて、Chrome の HSTSプレロードリストに追加したことで、private に設置していた `.dev` ホストへの接続に https が強制された。
https://www.d-wood.com/blog/2018/10/26_10573.html

予約済み TLD の test, example, invalid, localhost にはどれも想定用途があり、本記事の目的で使うと名前が役割と一致しない。

プライベートホストゾーンのドメインはドメイン形式であれば、任意のものが使える。参照するのも特定VPCの内部からだけなので、ランダム生成文字列を含めて、衝突リスクを十分に下げることはできるだろう。
しかし、自己保有ドメインのサブドメインが確実で、人間にも認識しやすい、短い名前にできる。

[参考記事](https://pdwslmr.netlify.app/posts/on-premise/local-tld/)

## コメントが大事

```
[ec2-user@ip-10-0-1-10 ~]$ aws route53 list-hosted-zones
{
    "HostedZones": [
        {
            "ResourceRecordSetCount": 5,
            "CallerReference": "xxxxxxxx-24F7-3C10-xxxxxxxx-xxxxxxxx",
            "Config": {
                "Comment": "for develop-1",
                "PrivateZone": true
            },
            "Id": "/hostedzone/Z03030941IDQ3T8GQLY1",
            "Name": "vpc.example.com."
        },
        {
            "ResourceRecordSetCount": 5,
            "CallerReference": "xxxxxxxx-3CC0-CB66-xxxxxxxx-xxxxxxxx",
            "Config": {
                "Comment": "for staging",
                "PrivateZone": true
            },
            "Id": "/hostedzone/Z0365884OJ124AKJYPA",
            "Name": "vpc.example.com."
        }
    ]
}
```

おわかりいただけるだろうか。APIの初手、`list-hosted-zones` では、privateの場合の関連vpcの情報が出てこないのである。
AWSコンソールのホストゾーン一覧画面は寂しいが、APIの時点で情報が出てきていない。今後もここが改善される見込みは薄い。
対象VPCを示すコメント文字列を入れることを強く推奨するのは、この一覧画面の情報不足をコメントで補うためである。