ECSブルーグリーンデプロイメントをゼロから構築する。（その２：ドメイン、証明書設定）

# はじめに
`ECS`を使ったブルーグリーンデプロイメントを行うため、前回はブルーグリーンデプロイメント自体の説明とネットワークの設定を行いました。

今回は、ブルーグリーンデプロイメントの設定とは少し離れますが、付随するドメインや証明書の設定を行っていきます。

- 【前】[ECSブルーグリーンデプロイメントをゼロから構築する。（その１：ネットワークの設定）](https://qiita.com/sakai00kou/items/234318b980ded1aa7577)
- 【次】[ECSブルーグリーンデプロイメントをゼロから構築する。（その３：事前準備、コンテナイメージ作成）](https://qiita.com/sakai00kou/items/fc51cead539f2917bfb6)

# ドメインの登録
`AWS`で外部に公開する`ELB`のようなサービスの場合、特に独自ドメインを取得しなくても、リソース作成時に`AWS`側で自動でDNS名が付与されますが、通常そのまま使用することはせず、独自ドメイン名でアクセスできるようにするのが一般的です。

`AWS`から直接ドメイン名を購入して設定することもできますが、私は「[お名前.com](https://www.onamae.com/)」で購入したドメインを持っているため、サブドメインを`AWS`の`Route53`で管理できるようにお名前.comから委任して使用できるようにしたいと思います。

以下参考例。

![dns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/91730a61-2f4e-4169-97e1-282a4e0585e8.png)

## ホストゾーンの作成
取得済みドメインを使用するため、`Route53`でパブリックホストゾーンを作成します。

「**Route 53**」のダッシュボードから「**ホストゾーン**」→「**ホストゾーンの作成**」で新たにホストゾーンを作成します。

![Monosnap_20231103_161935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/68981a70-0e2c-1de1-1978-2d9cdc64d486.png)

今回は、委任されたサブドメインを管理するため、以下表のように設定しました。

![Monosnap_20231103_162545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/e12b49e9-cc1e-7427-75c8-0a574d9415ce.png)

|項目|設定|備考|
|:--|:--|:--|
|ドメイン名|aws.example.com|今回は「**aws**」というサブドメインとした。<br>example.comの部分は自環境に合わせて設定。|
|説明|空欄|今回は未設定|
|タイプ|パブリックホストゾーン||
|タグ|空欄|今回は未設定|

ホストゾーン作成後、自動で登録されているNSレコードの値を控えておきます。

![Monosnap_20231103_183949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/f7fd215a-f643-94a9-569b-2845857492ba.png)

## お名前.com側DNSサーバへのレコード登録
委任元となるお名前.comのDNSサーバに、委任先となる`AWS`の情報を登録するため、お名前.comの管理画面となる、「**お名前.com Navi**」にログインし、「**ネームサーバーの設定**」→「**ドメインのDNS設定**」を選択します。

![Monosnap_20231103_180932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/002932dc-fcb8-62fd-6f0c-de95ce5ff292.png)

下画像はマスクしているため、何も書かれていないように見えますが、登録されているドメイン名が表示されるため、レコード登録を行うドメイン名を選択し、「**次へ**」進みます。

![Monosnap_20231103_181022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b45118b2-e623-5267-c0c5-210e8daba61d.png)

「**DNSレコード設定を利用する**」の「**設定する**」を選択します。

![Monosnap_20231103_181105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/2f7a6370-59d7-3ed7-5593-1960d2564e80.png)

以下もドメイン部分をマスクしているため見にくいですが、マスクしている箇所に`example.com`のようにドメイン名が記載されているため、先程控えた`AWS`側のNSレコードを1行ずつ赤枠部分に入力して「**追加**」ボタンで追加します。

また、`TTL`については以下`AWS`のドキュメントに従い、900に指定しています。

- [サブドメインのネームサーバーレコードで DNS サービスを更新する](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/MigratingSubdomain.html#UpdateOldDNS)

なお、`Route53`のNSレコードは、レコードの最後に「**.（ドット）**」が含まれていますが、ドットを指定するとエラーとなるため、最後のドットのみ削除して登録してください。

指定するホスト名についてはサブドメイン部分のみ記載すれば良いので、今回の場合、`aws`と指定します。

`AWS`側NSレコードは4つありますが、4レコードともに同じホスト名指定でOKです。

![Monosnap_20231103_180616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/12053241-6e78-04b0-776d-f1cc0298e4f5.png)

しばらく経った後、`dig`や`nslookup`等でサブドメインを確認すると以下のように`AWS`側のDNSの値が返されることが確認できるかと思います。

```javascript:サブドメインのdig表示例
dig NS aws.example.com

; <<>> DiG 9.10.6 <<>> NS aws.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57775
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aws.aws.example.com.	IN	NS

;; ANSWER SECTION:
aws.example.com.	900	IN	NS	ns-1959.awsdns-52.co.uk.
aws.example.com.	900	IN	NS	ns-581.awsdns-08.net.
aws.example.com.	900	IN	NS	ns-504.awsdns-63.com.
aws.example.com.	900	IN	NS	ns-1427.awsdns-50.org.

;; ADDITIONAL SECTION:
ns-504.awsdns-63.com.	78005	IN	A	205.251.193.248
ns-581.awsdns-08.net.	85911	IN	A	205.251.194.69
ns-1427.awsdns-50.org.	853		IN	A	205.251.197.147
ns-1959.awsdns-52.co.uk. 67702	IN	A	205.251.199.167
ns-504.awsdns-63.com.	84620	IN	AAAA	2600:9000:5301:f800::1
ns-581.awsdns-08.net.	85984	IN	AAAA	2600:9000:5302:4500::1
ns-1427.awsdns-50.org.	86224	IN	AAAA	2600:9000:5305:9300::1
ns-1959.awsdns-52.co.uk. 67702	IN	AAAA	2600:9000:5307:a700::1

;; Query time: 54 msec
;; SERVER: 192.168.151.1#53(192.168.151.1)
;; WHEN: Fri Nov 03 18:56:14 JST 2023
;; MSG SIZE  rcvd: 356
```

# ACM証明書の発行
ドメインの登録ができたので、次はHTTPS通信用のSSL証明書を発行しておきます。

「**AWS Certificate Manager (ACM)**」の「**証明書をリクエスト**」より「**パブリック証明書をリクエスト**」を選択し、「**次へ**」進みます。

![Monosnap_20231103_192806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/c7521975-69ab-51bd-7493-42877d8bb4aa.png)

以下よりリクエストするパブリック証明書の情報を記入していきますが、今回は委任されたサブドメイン全体を保護するワイルドカード証明書で登録を行います。

ワイルドカード証明書で発行することで、`www.aws.example.com`や`api.aws.example.com`のような`aws.example.com`配下のドメイン全体を１つの証明書でカバーできます。

但し、ワイルドカード証明書で発行した場合、以下`AWS`のドキュメントより、`aws.example.com`自体は保護されないそうで、`aws.example.com`自体も保護したい場合は追加で`aws.example.com`も登録する必要があります。

- [ACM 証明書の特徴](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/acm-certificate.html)

画面上では以下のように設定することで`*.aws.example.com`と`aws.example.com`を登録することができます。

![Monosnap_20231103_193652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/d295c45a-c56f-f903-3dd4-9e84ccfb4126.png)

上記ドメイン名の設定含め、今回は以下表のように設定を行いリクエストを行いました。

|項目|設定|備考|
|:--|:--|:--|
|完全修飾ドメイン名1|*.aws.example.com|自分のドメイン名に合わせて設定|
|完全修飾ドメイン名2|aws.example.com|自分のドメイン名に合わせて設定|
|検証方法|DNS検証|環境に合わせて任意に設定|
|キーアルゴリズム|RSA 2048|今回はテストなのでデフォルトのまま指定|
|タグ|空欄|今回は未設定|

## CNAMEの登録
ACM証明書作成後、ステータスを見ると以下のように「**保留中の検証**」と表示されているかと思いますので、「**証明書ID**」を選択して詳細画面に移ります。

![Monosnap_20231103_200934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3960e7e0-cf55-711d-2e9f-48992fc78808.png)

詳細画面の「**ドメイン**」→「**Route 53でレコードを作成**」で、先程登録したドメインの`CNAME`を登録します。

![Monosnap_20231103_201139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/450308a9-6e4d-e8c5-623a-3bf6b2c6a91a.png)

少し待つとステータスが変わるので、「**発行済み**」になれば完了です。

![Monosnap_20231103_202027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/abf70703-1bc6-2bb1-7830-78aaaf3802a9.png)

# おわりに
今回はブルーグリーンデプロイメントとは少し外れましたが、外部からアクセスするためのドメイン、証明書の準備を行いました。

次回もブルーグリーンデプロイメントの設定を行う前に設定しておく必要があるリソースの作成や、`Fargate`で使用するコンテナイメージを作成していきたいと思います。