<!-- markdownlint-disable MD001 -->

# Serverless接続ガイド

このページでは、Serverlessデプロイメントの接続方法について説明し、接続問題のトラブルシューティングガイドラインを提供します。

## Serverless接続Q&A

### MQTT over TCPとWebSocketとは何ですか？

標準のMQTTは、TCP/IPプロトコルスタック上に構築された非同期通信メッセージプロトコルであり、不安定なネットワーク環境でもスケーラブルに動作します。そのため、デバイスのハードウェアストレージ容量やネットワーク帯域幅が限られているシナリオに適しています。

WebSocketはTCPをベースとした新しいネットワークプロトコルで、ブラウザとサーバーが1回のハンドシェイクで持続的な接続を確立できます。これにより双方向のデータ送受信が可能となり、クライアントとサーバー間のデータ交換が簡素化されます。ここでのWebSocketは、初期接続の確立にWebSocketを使用し、その後WebSocketチャネル上でMQTTプロトコル通信を行う「MQTT over WebSocket」を指し、主にブラウザベースの接続に利用されます。

標準のMQTT over TCPおよびWebSocketは暗号化されていないため、安全上のリスクがあります。

### MQTT over TLS/SSLおよびWebSocket over TLS/SSLとは何ですか？

MQTT over TLS/SSLおよびWebSocket over TLS/SSLは、MQTTまたはWebSocketプロトコル通信にTLS/SSL暗号化を追加したものです。これにより、通信は盗聴や改ざんから保護されます。

MQTT TLS/SSLはポート8883を使用し、mqttsプロトコルに対応します。一方、WebSocket TLS/SSLはポート8084を使用し、wssプロトコルに対応します。

### なぜServerlessはMQTT over TLS/SSLまたはWebSocket over TLS/SSLのみをサポートしているのですか？

ServerlessはEMQXのマルチテナンシーアーキテクチャに基づいており、複数のユーザーが単一のEMQXクラスターを共有します。TLS暗号化を用いたMQTTおよびWebSocketは、データ伝送のセキュリティと信頼性を確保します。

### TLS/SSL接続のためのクライアントコードはどのように書けばよいですか？

クライアント側のコード作成には、TLS関連のサンプルコードを参照してください。

[Python](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Python3)<br>
[Java](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Java)<br>
[GO](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Go)<br>
[Node.js](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Node.js)<br>
[ESP 32](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-ESP32)<br>
[ESP 8266](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-ESP8266)<br>
[Android](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Android)<br>
[swift](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-swift)<br>

**CAファイル**

Serverlessは片方向TLSを使用しています。EMQXはサーバー側のCAを提供および管理しています。クライアントによっては検証用にサーバー側CAが必要な場合がありますので、[こちらからダウンロードしてください](https://assets.emqx.com/data/emqxsl-ca.crt)。

## 接続トラブルシューティングガイド

Serverlessデプロイメントに接続できない場合は、以下の手順でトラブルシューティングを行ってください。

1. **接続アドレスの確認**  
   EMQX Serverlessが提供する**正しいドメイン**を使用して接続していることを確認してください。EMQXプラットフォームのドメインをCNAMEで独自ドメインにリダイレクトすることはサポートされていません。非暗号化のTCPポート接続が必要な場合は、Dedicatedプランの利用をご検討ください。

2. **接続ポートの確認**  
   EMQX ServerlessはMQTT over TLS（ポート8883）およびWebSocket over TLS（ポート8084）による接続のみをサポートしています。ポート1883および8083への接続はサポートされていません。非暗号化TCPポート接続が必要な場合はDedicatedプランをご検討ください。

3. **ネットワーク接続のテスト**  
   `telnet`コマンドを使用して、サーバーとEMQX Serverless間のネットワーク接続をテストしてください。例：`telnet broker.emqx.io 8883`（実際のデプロイメントアドレスに置き換えてください）。

4. **認証情報の確認**  
   EMQXプラットフォームは**匿名認証をサポートしていません**。MQTTクライアントのユーザー名とパスワードをEMQXプラットフォームコンソールで設定し、クライアント接続時に正しく設定されていることを確認してください。

5. **SNI（Server Name Indication）設定の確認**  
   クライアント接続時に正しいSNI情報を提供する必要があります。不正または欠落したSNI情報は、EMQXプラットフォームによりエラーコード-5で接続拒否されます。

6. **MQTTXクライアントでのテスト**  
   MQTTXは無料で使いやすいクロスプラットフォームのMQTT 5.0クライアントテストツールです。クライアントコードに問題があるかどうかを検証するために使用することを推奨します。詳細な使用方法は以下を参照してください。  
   [MQTTXユーザーガイド](../connect_to_deployments/mqttx.md)

### サポートチケットによる問い合わせ

上記のすべての手順を確認しても問題が解決しない場合は、サポートチケットシステムからお問い合わせください。問題解決を迅速に行うため、以下の詳細情報を提供してください。

- デプロイメント名およびID（コンソールの「デプロイメント管理」ページで確認可能）
- デプロイメントタイプ（例：Serverless、Dedicatedなど）
- クライアントの種類およびバージョン
- クライアント接続のサンプルコード（使用言語例：Python、JavaScriptなど。機密情報は伏せてください）
- クライアントのエラーログまたは具体的なエラーメッセージ（可能であれば詳細なエラー説明やスクリーンショットを添付してください）
