IBM Cloud Internet Service(CIS)でCNAME setupを試してみた

(2023/10/26追記)
CNAME setupについては、docsにも記載が追加されています。



# 1. はじめに

Cloudflareにはドメインを移行する方法(Full Setup)と、CNAMEで移行する方法(CNAME Setup mode)がある。CISでも実はCNAME Setupによるドメイン作成はCLIで可能であることが分かったため、実機にて試してみた。
https://support.cloudflare.com/hc/en-us/articles/360020348832-Understanding-a-CNAME-Setup


このやり方が素晴らしいのは、

1. NSレコードによる移行ではなく、CNAMEによる移行が可能。
2. 移行実施前に、ドメインをActiveにすることができる。
3. 最終的にAレコード -> CNAMEレコードに移行する前に動作確認が可能

が可能であることである。ここでは、以下の環境であることを前提とする。


- `cnamexxxx.tk`: 既存DNSで管理しているドメイン
- `www.cnamexxxx.tk`: 既存DNSでAレコードで管理していたが、CISにCNAMEで移行したいFQDN
- `162.133.xx.xx`: `www.cnamexxxx.tk`のAレコードで元々登録していたIP。
- `104.18.xx.xxx`: Edge IP

# 2. 既存DNSの確認

`www.cnamexxxx.tk`は、AレコードでIPアドレスを登録している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/7d5a3776-15b7-989d-f580-dc213a90fe1c.png)


```
$ dig +noall +ans www.cnamexxxx.tk
www.cnamexxxx.tk.	900	IN	A	162.133.xx.xx
```

# 3. CNAME Setup用のドメイン(Partial Domain)を作成

- `ibmcloud cis domain-add <ドメイン名> --type partial`でドメインを作成する。
- `Verification Key`が発行されるのでメモしておく。

```
$ ibmcloud cis instances
Retrieving service instances for service 'internet-svcs' ...
OK
Name                    ID                                                                                                                     Location   State    Service Name
CIS-Enterprise-Usage1   crn:v1:bluemix:public:internet-svcs:global:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:cf4d8b04-b49e-4bf0-a99d-9303bba2cd90::   global     active   internet-svcs

$ ibmcloud cis instance-set CIS-Enterprise-Usage1
Setting context service instance to 'CIS-Enterprise-Usage1' ...
OK
Context service instance set succeeded.

$ ibmcloud cis domain-add www.cnamexxxx.tk --type partial
Adding domain 'www.cnamexxxx.tk' for service instance 'CIS-Enterprise-Usage1' ...
OK

ID                     a679988b4c9a86688e0c8fc00b6f3e59
Created On             2022-02-21 00:59:51.187543 +0000 UTC
Modified On            2022-02-21 00:59:51.187543 +0000 UTC
Name                   www.cnamexxxx.tk
Original Registrar
Origin DNS Host
Status                 pending
Paused                 false
Original Name Server   ns04.freenom.com, ns03.freenom.com, ns02.freenom.com, ns01.freenom.com
Name Servers
Type                   partial
Verification Key       3xxxxxxx8-5xxxxxxx4
Cname Suffix           cdn.cloudflare.net

Update NS record for domain 'www.cnamexxxx.tk' to '' to make the domain active.

```

# 4. VerificationCodeの追加とドメインのActivate化

上記で作成されたVerificationCodeを`cloudflare-verify.<ドメイン名>`という名前でTXTレコードとして登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/cf15b232-8f48-7d71-7cae-1a1a66362c79.png)



```txt:VerificationCodeの追加の確認
$ dig +noall +ans TXT cloudflare-verify.www.cnamexxxx.tk
cloudflare-verify.www.cnamexxxx.tk. 900	IN TXT	"314446538-523399114"
```

これで、30分〜1時間程度待っているとCIS/CloudflareによるVerificationが行われて、ドメインのステータスがPendingからActiveになる。

```txt:Pending状態
$ ibmcloud cis domain a679988b4c9a86688e0c8fc00b6f3e59
Getting domain 'a679988b4c9a86688e0c8fc00b6f3e59' for service instance 'CIS-Enterprise-Usage1' ...
OK

ID                     a679988b4c9a86688e0c8fc00b6f3e59
Created On             2022-02-21 00:59:51.187543 +0000 UTC
Modified On            2022-02-21 00:59:58.233934 +0000 UTC
Name                   www.cnamexxxx.tk
Original Registrar
Origin DNS Host
Status                 pending
Paused                 false
Original Name Server   ns04.freenom.com, ns03.freenom.com, ns02.freenom.com, ns01.freenom.com
Name Servers
Type                   partial
Verification Key       3xxxxxxx8-5xxxxxxx4
Cname Suffix           cdn.cloudflare.net
```

```txt:しばらく待つとActiveになる
$ ibmcloud cis domain a679988b4c9a86688e0c8fc00b6f3e59
Getting domain 'a679988b4c9a86688e0c8fc00b6f3e59' for service instance 'CIS-Enterprise-Usage1' ...
OK

ID                     a679988b4c9a86688e0c8fc00b6f3e59
Created On             2022-02-21 00:59:51.187543 +0000 UTC
Modified On            2022-02-22 04:57:11.164254 +0000 UTC
Active On              2022-02-22 04:57:11.164254 +0000 UTC
Name                   www.cnamexxxx.tk
Original Registrar
Origin DNS Host
Status                 active
Paused                 false
Original Name Server   ns04.freenom.com, ns03.freenom.com, ns02.freenom.com, ns01.freenom.com
Name Servers
Type                   partial
Verification Key       314446538-523399114
Cname Suffix           cdn.cloudflare.net
```

# 5. CISにDNSレコードを追加

- CISに登録できるレコードは自分自身(`@`。ここでは`www.cnamexxxx.tk`に相当)に対するDNSレコード(Aレコードなど）のみである。ただし、Aレコードの代わりに`www.cnamexxxx.tk`というFQDNのGLBを作成しても問題なかった（それでも動作確認できた）。
- ドメインがActiveなので`Proxy=Enabled`で作成可能。

```
$ ibmcloud cis dns-record-create a679988b4c9a86688e0c8fc00b6f3e59  --name "@" --type A --content 162.133.xx.xx --ttl 900 --proxied true
Creating DNS Records in domain 'a679988b4c9a86688e0c8fc00b6f3e59' for service instance 'CIS-Enterprise-Usage1' ...
OK

ID            4edfebe751aa163aab9373665c8f9cda
Created On    2022-02-21 01:31:12.513887 +0000 UTC
Modified On   2022-02-21 01:31:12.513887 +0000 UTC
Name          www.cnamexxxx.tk
Type          A
Content       162.133.xx.xx
Domain ID     a679988b4c9a86688e0c8fc00b6f3e59
Domain Name   www.cnamexxxx.tk
Proxied       true
TTL           1

```


# 6. Edge証明書の作成

ドメインがActiveなのでEdge証明書が作成可能。

```
$ ibmcloud cis certificates a679988b4c9a86688e0c8fc00b6f3e59
Retrieving certificates for DNS domain 'a679988b4c9a86688e0c8fc00b6f3e59' ...
No certificates exist for DNS domain 'a679988b4c9a86688e0c8fc00b6f3e59'.
OK


$ ibmcloud cis certificate-order a679988b4c9a86688e0c8fc00b6f3e59 --hostnames www.cnamexxxx.tk
Ordering certificate pack for DNS domain 'a679988b4c9a86688e0c8fc00b6f3e59' ...
OK
Certificate pack is ordered successfully.

ID                    8efd5376-00ee-4781-a9a2-bea5c9e19131
Type                  advanced
Certificates

Hosts                 www.cnamexxxx.tk
Primary certificate

```

# 7. End-to-end CAからEnd-to-end flexibleに変更

Origin証明書を作成して、Webサーバーに登録するのが一番良いのだが、今回は面倒だったので手取り早く確認するためにEdge-Origin間は自己証明書のままである。

```
$ ibmcloud cis tls-settings a679988b4c9a86688e0c8fc00b6f3e59
Retrieving tls settings for DNS domain 'a679988b4c9a86688e0c8fc00b6f3e59' ...

universal         true
tls_1_2_only      Off
min_tls_version   1.2
ssl               End-to-end CA signed
tls_1_3           On


$ ibmcloud cis tls-settings-update a679988b4c9a86688e0c8fc00b6f3e59 --mode end-to-end-flexible

ssl   End-to-end flexible
```


# 8. 移行前の事前テスト

ここまで、まだ`www.cnamexxxx.tk`は既存DNSのAレコードを使って名前解決が行われている。

```txt:既存DNSを使ってアクセス
$ dig +noall +ans www.cnamexxxx.tk
www.cnamexxxx.tk.	900	IN	A	162.133.xx.xx

$ curl -I http://www.cnamexxxx.tk
HTTP/1.1 200 OK
Date: Tue, 22 Feb 2022 05:56:45 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
Last-Modified: Tue, 01 Feb 2022 03:17:09 GMT
ETag: "153-5d6ec562aae98"
Accept-Ranges: bytes
Content-Length: 339
Content-Type: text/html; charset=UTF-8

$ curl -k -I https://www.cnamexxxx.tk
HTTP/1.1 200 OK
Date: Tue, 22 Feb 2022 05:57:16 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
Last-Modified: Tue, 01 Feb 2022 03:17:09 GMT
ETag: "153-5d6ec562aae98"
Accept-Ranges: bytes
Content-Length: 339
Content-Type: text/html; charset=UTF-8
```

`www.cnamexxxx.tk`を名前解決した時に`104.18.xx.xxx`が使われるようにローカル端末の/etc/hostsを編集しても良いのだが、curlには`--resolve`という便利なオプションがあるので今回はこちらを利用する。これによって、Edge IP経由での動作確認が可能である。

```txt:resolve指定をしてCISのEdge経由でアクセステスト。Edgeを経由していることがヘッダからわかる。
$ dig +noall +ans www.cnamexxxx.tk
www.cnamexxxx.tk.	900	IN	A	162.133.xx.xx

$ curl -I http://www.cnamexxxx.tk --resolve www.cnamexxxx.tk:80:104.18.xx.xxx
HTTP/1.1 200 OK
Date: Tue, 22 Feb 2022 05:58:07 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Last-Modified: Tue, 01 Feb 2022 03:17:09 GMT
Accept-Ranges: bytes
CF-Cache-Status: DYNAMIC
Server: cloudflare
CF-RAY: 6e15fb1a4a62342c-NRT

$ curl -I https://www.cnamexxxx.tk --resolve www.cnamexxxx.tk:443:104.18.xx.xxx
HTTP/2 200
date: Tue, 22 Feb 2022 05:58:20 GMT
content-type: text/html; charset=UTF-8
last-modified: Tue, 01 Feb 2022 03:17:09 GMT
accept-ranges: bytes
cf-cache-status: DYNAMIC
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 6e15fb6a3b5b8a86-NRT
```



# 9.上位DNSでのAレコードからCNAMEレコードへの切り替え

- 十分動作確認ができたら、遂に既存DNSサーバーで、DNSレコードを移行する。
- `ibmcloud cis domain xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`の結果からわかるように、`Cname Suffix`が`cdn.cloudflare.net`なので、今回のCNAME TARGETは`www.cnamexxxx.tk.cdn.cloudflare.net`となる。
- よって`www`というDNSレコードに対する最終形は以下のようになる。
    - Before: Aレコード: `162.133.xx.xx`
    - After: CNAMEレコード: `www.cnamexxxx.tk.cdn.cloudflare.net`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/14d0b241-fe04-3181-8892-d345525525c6.png)


# 10.切り替え後の最終確認

```
$ dig +noall +ans www.cnamexxxx.tk
www.cnamexxxx.tk.	900	IN	CNAME	www.cnamexxxx.tk.cdn.cloudflare.net.
www.cnamexxxx.tk.cdn.cloudflare.net. 300 IN A	104.18.23.210
www.cnamexxxx.tk.cdn.cloudflare.net. 300 IN A	104.18.22.210

$ curl -I http://www.cnamexxxx.tk
HTTP/1.1 200 OK
Date: Tue, 22 Feb 2022 06:03:33 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Last-Modified: Tue, 01 Feb 2022 03:17:09 GMT
Accept-Ranges: bytes
CF-Cache-Status: DYNAMIC
Server: cloudflare
CF-RAY: 6e16030c6c413475-NRT


$ curl -I https://www.cnamexxxx.tk
HTTP/2 200
date: Tue, 22 Feb 2022 06:06:55 GMT
content-type: text/html; charset=UTF-8
last-modified: Tue, 01 Feb 2022 03:17:09 GMT
accept-ranges: bytes
cf-cache-status: DYNAMIC
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 6e1607fa8c408a9c-NRT
```