# カスタムドメインの設定

EMQX Cloudでは、デプロイメントにカスタムドメインを設定でき、MQTTクライアントは所有するドメインを通じて接続できます。これは、安定したブランド化されたエンドポイントを提供し、EMQX CloudにそのドメインのTLS/SSL証明書の管理を任せたい場合に便利です。

::: tip 注意

この機能は**EMQX v5 Dedicated**および**v5 Dedicated Flex**のデプロイメントでのみ利用可能です。トライアルデプロイメント、サーバレス、v4デプロイメントではサポートされていません。

:::

## はじめに

以下の要件を満たしていることを確認してください。

- デプロイメントが**EMQX v5 Dedicated**または**v5 Dedicated Flex**であり、トライアルデプロイメントではないこと。
- ドメインを所有しており、そのDNSレコードを管理できること。
- ドメインはサブドメインである必要があります。例：`mqtt.example.com`

::: tip 注意

`*.example.com`のようなワイルドカードドメインはサポートされていません。

:::

::: tip

証明書の発行や更新に関して厳格なコンプライアンス要件がある場合は、管理された証明書の代わりに独自の証明書をアップロードすることを検討してください。

:::

## カスタムドメインの設定手順

1. [EMQX Cloudコンソール](https://cloud-intl.emqx.com/console/)にログインし、対象のデプロイメントの概要ページに移動します。

2. **MQTT接続情報**セクションで、**カスタムドメイン**をクリックします。

3. **ドメイン**ステップで、MQTTクライアントが接続に使用するカスタムドメインを入力します。

   例：

   ```text
   mqtt.example.com
   ```

   ![カスタムドメインステップ](./_assets/custom_domain_step_domain.png)

4. **次へ**をクリックして**DNS**ステップに進みます。コンソールに表示されるCNAMEレコードをDNSプロバイダーに追加し、カスタムドメインがデプロイメントのデフォルトエンドポイントを指すように設定します。

   例（コンソールに表示されるホスト名に置き換えてください）：

   ```text
   mqtt.example.com    CNAME    h72937f5.ala.dedicated.aws.example.com
   ```

   ![DNS設定ステップ](./_assets/custom_domain_step_dns.png)

5. DNSレコードを追加したら、**次へ**をクリックして**TLS/SSL**ステップに進み、**EMQX Cloud管理**を選択します。EMQX CloudがLet's Encryptの証明書を発行・更新します。

   デフォルトでは、管理された証明書は自動更新に設定されています。必要に応じて、後で**TLS/SSL設定**から**自動更新を無効化**をクリックして自動更新をオフにできます。

   ::: caution
   自動更新を無効化すると再度有効化できません。証明書の有効期限切れ前に手動で証明書を差し替える必要があります。
   :::

   ![管理TLS/SSLステップ](./_assets/custom_domain_step_tls_managed.png)

6. コンソールに表示されるACME検証用のCNAMEレコードをDNSプロバイダーに追加します。

   例：

   ```text
   _acme-challenge.mqtt.example.com    CNAME    _acme-challenge.h72937f5.ala.dedicated.aws.example.com
   ```

   ::: caution
   `_acme-challenge`のCNAMEレコードは常に残しておいてください。削除すると証明書の更新に失敗する可能性があります。

   ドメインでCAAレコードを使用している場合は、`letsencrypt.org`が認可された発行者として登録されていることを確認してください。
   :::

7. DNSおよびTLS/SSLの設定が完了したら、**検証して適用**をクリックします。

## 設定の検証

設定適用後、以下の方法で検証してください。

1. デプロイメントの概要ページに戻り、接続情報にカスタムドメインが表示されていることを確認します。

2. ローカル環境からDNSレコードを確認します。LinuxやmacOSでは`dig`を使用します。

   ```bash
   dig mqtt.example.com CNAME
   ```

   Windowsでは`nslookup`を使用します。

   ```bash
   nslookup mqtt.example.com
   ```

3. 発行されたTLS/SSL証明書がカスタムドメインに一致していることを確認します。

   ```bash
   openssl s_client -connect mqtt.example.com:8883 -servername mqtt.example.com
   ```

4. MQTTXなどのMQTTクライアントでカスタムドメインと対応するポートを使って接続をテストします。

   - TCPでのMQTT: `1883`
   - TLS/SSLでのMQTT: `8883`
   - WebSocket: `8083`
   - TLS/SSLでのWebSocket: `8084`

## トラブルシューティング

- **デプロイメントの種類やプランがサポートされていません。**

  この機能はトライアルでないv5 Dedicatedおよびv5 Dedicated Flexデプロイメントのみ利用可能です。コンソールでデプロイメントの種類を確認してください。

- **設定したドメインが所有しているサブドメインではありません。**

  ドメインを所有し、DNSレコードを追加できる必要があります。ワイルドカードドメインはサポートされていません。

- **DNSレコードのタイプが間違っています。**

  コンソールに表示される正確なCNAMEレコードを使用してください。Aレコードや他のタイプは動作しません。

- **DNSの伝播がまだ完了していません。**

  レコード追加後5〜10分待ってから再試行してください。`dig`やオンラインのDNSチェッカーで伝播状況を確認できます。

- **ACMEのCNAMEレコードが設定後に削除されています。**

  証明書の自動更新には`_acme-challenge`のCNAMEレコードが常に必要です。削除された場合は再度追加してください。

- **CAAレコードが証明書発行をブロックしています。**

  ドメインでCAAレコードを使用している場合は、`letsencrypt.org`を認可された発行者として追加してください。
