

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# デバイス通信プロトコル
<a name="protocols"></a><a name="iot-message-broker"></a>

AWS IoT Core は、MQTT および MQTT over WebSocket Secure (WSS) プロトコルを使用してメッセージを発行およびサブスクライブするデバイスとクライアント、および HTTPS プロトコルを使用してメッセージを発行するデバイスとクライアントをサポートします。すべてのプロトコルでは、IPv4 および IPv6 がサポートされています。このセクションでは、デバイスおよびクライアントのさまざまな接続オプションについて説明します。

## TLS プロトコルバージョン
<a name="connection-protocol-tls"></a>

AWS IoT Core は、[TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security) [バージョン 1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2) と [TLS バージョン 1.3](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3) を使用してすべての通信を暗号化します。[ドメイン設定で TLS 設定を設定することで](https://docs.aws.amazon.com//iot/latest/developerguide/iot-endpoints-tls-config.html)、エンドポイントに追加の TLS ポリシーバージョンを設定できます。デバイスを AWS IoT Coreに接続すると、クライアントは[サーバー名表示 (SNI) 拡張機能](https://tools.ietf.org/html/rfc3546#section-3.1)を送信できます。これは、[マルチアカウント登録](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html#multiple-account-cert)、[設定可能なエンドポイント](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)、[カスタムドメイン](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable-custom.html)、[VPC エンドポイント](https://docs.aws.amazon.com//iot/latest/developerguide/IoTCore-VPC.html)などの機能に必要です。詳細については、「[AWS IoTのトランスポートセキュリティ](transport-security.html)」を参照してください。

[AWS IoT デバイス SDKs](iot-connect-devices.md#iot-connect-device-sdks) は、MQTT および MQTT over WSS をサポートし、クライアント接続のセキュリティ要件をサポートします。[AWS IoT デバイス SDKs](iot-connect-devices.md#iot-connect-device-sdks) を使用してクライアントを AWS IoTに接続することをお勧めします。

## プロトコル、ポートマッピング、認証
<a name="protocol-mapping"></a><a name="protocol-port-mapping"></a>

デバイスまたはクライアントがメッセージブローカーに接続する方法は、[[認証タイプ]](#connection-protocol-auth-mode) を使用して設定できます。デフォルトでは、または SNI 拡張機能が送信されない場合、認証方法は、デバイスが使用するアプリケーションプロトコル、ポート、および Application Layer Protocol Negotiation (ALPN) TLS 拡張機能に基づいています。次の表に、ポート、ポート、ALPN に基づいて予想される認証を示します。


**プロトコル、認証、ポートマッピング**  

| プロトコル | サポートされているオペレーション | 認証 | ポート | ALPN プロトコル名 | 
| --- | --- | --- | --- | --- | 
| MQTT over WebSocket | 発行、サブスクライブ | 署名バージョン 4 | 443 | 該当なし | 
| MQTT over WebSocket | 発行、サブスクライブ | カスタム認証 | 443 | 該当なし | 
| MQTT | 発行、サブスクライブ | X.509 クライアント証明書 | 443† | `x-amzn-mqtt-ca` | 
| MQTT | 発行、サブスクライブ | X.509 クライアント証明書 | 8883 | 該当なし | 
| MQTT | 発行、サブスクライブ | カスタム認証 | 443† | `mqtt` | 
| HTTPS | 発行のみ | 署名バージョン 4 | 443 | 該当なし | 
| HTTPS | 発行のみ | X.509 クライアント証明書 | 443† | `x-amzn-http-ca` | 
| HTTPS | 発行のみ | X.509 クライアント証明書 | 8443 | 該当なし | 
| HTTPS | 発行のみ | カスタム認証 | 443 | 該当なし | 

**Application Layer Protocol Negotiation (ALPN)**  
† デフォルトのエンドポイント設定を使用するとき、ポート 443 で X.509 クライアント証明書認証を使用して接続するクライアントは、[Application Layer Protocol Negotiation (ALPN)](https://tools.ietf.org/html/rfc7301) TLS 拡張を実装し、`ClientHello` メッセージの一部としてクライアントから送信された ALPN ProtocolNameList にリストされている [ALPN プロトコル名](https://tools.ietf.org/html/rfc7301#section-3.1)を使用する必要があります。  
ポート 443 では、[IoT:Data-ATS](iot-connect-devices.md#iot-connect-device-endpoint-table) エンドポイントは ALPN x-amzn-http-ca HTTP をサポートしますが、[IoT:Jobs](iot-connect-devices.md#iot-connect-device-endpoint-table) エンドポイントはサポートしません。  
ALPN x-amzn-mqtt-ca を使用するポート 8443 HTTPS およびポート 443 MQTT では、[カスタム認証](custom-authentication.md)を使用できません。

クライアントは AWS アカウント、デバイスのエンドポイントに接続します。アカウントのデバイスエンドポイントを見つける方法については、[AWS IoT デバイスデータとサービスエンドポイント](iot-connect-devices.md#iot-connect-device-endpoints) を参照してください。

**注記**  
AWS SDKs は URL 全体を必要としません。[`pubsub.py` GitHub の AWS IoT Device SDK for Python のサンプル](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py#L100)などのエンドポイントホスト名のみが必要です。次の表にあるような完全な URL を渡すと、無効なホスト名などのエラーが発生する可能性があります。


**への接続 AWS IoT Core**  

|  プロトコル  |  エンドポイントまたは URL  | 
| --- | --- | 
| MQTT | `{{iot-endpoint}}` | 
| MQTT over WSS | `wss://{{iot-endpoint}}/mqtt` | 
| HTTPS | `https://{{iot-endpoint}}/topics` | 

## デバイス通信用のアプリケーションプロトコルの選択
<a name="protocol-selection"></a>

デバイスエンドポイントを介したほとんどの IoT デバイス通信では、Secure MQTT または MQTT over WebSocket Secure (WSS) プロトコルを使用することができます。ただし、デバイスエンドポイントは HTTPS もサポートします。

次の表は、 がデバイス通信に 2 つの高レベルプロトコル (MQTT と HTTPS) AWS IoT Core を使用する方法を比較したものです。


**AWS IoT デバイスプロトコル (MQTT と HTTPS) side-by-side**  

|  機能  |  [MQTT](mqtt.md)  |  [HTTPS](http.md)  | 
| --- | --- | --- | 
| 発行/サブスクライブのサポート | 発行とサブスクライブ | 発行のみ | 
| SDK サポート | [AWS Device SDKs](iot-connect-devices.md#iot-connect-device-sdks) MQTT プロトコルと WSS プロトコルをサポート | SDK のサポートはありませんが、言語固有のメソッドを使用して HTTPS リクエストを行うことができます | 
| サービス品質のサポート | [MQTT QoS レベル 0 および 1](mqtt.md#mqtt-qos) | QoS は、クエリ文字列パラメータを渡すことによってサポートされ、?qos=qosここで、値は0または1にすることができます。このクエリ文字列を追加して、必要な QoS 値を持つメッセージが発行できます。 | 
| デバイスがオフラインのときに受信しなかったメッセージを受信できる | はい | いいえ | 
| `clientId` フィールドのサポート | はい | いいえ | 
| デバイスの切断検出 | はい | いいえ | 
| 安全な通信 | はい。「[プロトコル、ポートマッピング、認証](#protocol-mapping)」を参照してください。 | はい。「[プロトコル、ポートマッピング、認証](#protocol-mapping)」を参照してください。 | 
| トピックの定義 | 定義されているアプリケーション | 定義されているアプリケーション | 
| メッセージデータ形式 | 定義されているアプリケーション | 定義されているアプリケーション | 
| プロトコルのオーバーヘッド | Lower | より高い | 
| 消費電力 | Lower | より高い | 

## デバイス通信の認証タイプの選択
<a name="connection-protocol-auth-mode"></a>

設定可能なエンドポイントを使用して、IoT エンドポイントの認証タイプを設定できます。または、デフォルト設定を使用して、デバイスがアプリケーションプロトコル、ポート、ALPN TLS 拡張機能の組み合わせで認証する方法を決定します。選択した認証タイプによって、接続時のデバイスの認証方法が決まります AWS IoT Core。5 つの認証タイプがあります。

**X.509 証明書**

デバイスを認証するために AWS IoT Core 検証する [X.509 クライアント証明書](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)を使用してデバイスを認証します。この認証タイプは、Secure MQTT (MQTT over TLS) および HTTPS プロトコルで機能します。

**カスタムオーソライザーを使用した X.509 証明書**

[X.509 クライアント証明書](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)を使用してデバイスを認証し、X.509 クライアント証明書情報を受信する[カスタムオーソライザー](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)を使用して追加の認証アクションを実行します。この認証タイプは、Secure MQTT (MQTT over TLS) および HTTPS プロトコルで機能します。この認証タイプは、X.509 カスタム認証で設定可能なエンドポイントでのみ使用できます。ALPN オプションはありません。

**AWS 署名バージョン 4 (SigV4)**

Cognito またはバックエンドサービスを使用してデバイスを認証し、ソーシャルフェデレーションとエンタープライズフェデレーションをサポートします。この認証タイプは、MQTT over WebSocket Secure (WSS) および HTTPS プロトコルで機能します。

**カスタムオーソライザー**

Lambda 関数を設定してデバイスを認証し、 AWS IoT Coreに送信されるカスタム認証情報を処理します。この認証タイプは、Secure MQTT (MQTT over TLS)、HTTPS、および MQTT over WebSocket Secure (WSS) プロトコルで機能します。

**デフォルト**

デバイスが使用するポートおよび/または Application Layer Protocol Negotiation (ALPN) 拡張機能に基づいてデバイスを認証します。一部の追加の認証オプションはサポートされていません。詳細については、「[プロトコル、ポートマッピング、認証](#protocol-mapping)」を参照してください。

以下の表は、サポートされている認証タイプとアプリケーションプロトコルのすべての組み合わせを示しています。


**サポートされている認証タイプとアプリケーションプロトコルの組み合わせ**  

| 認証タイプ | Secure MQTT (MQTT over TLS) | MQTT over WebSocket Secure (WSS) | HTTPS | デフォルト | 
| --- | --- | --- | --- | --- | 
| X.509 証明書 | ✓ |  | ✓ |  | 
| カスタムオーソライザーを使用した X.509 証明書 | ✓ |  | ✓ |  | 
| AWS 署名バージョン 4 (SigV4) |  | ✓ | ✓ |  | 
| カスタムオーソライザー | ✓ | ✓ | ✓ |  | 
| デフォルト |  |  |  | ✓ | 

## 接続時間の制限
<a name="connection-duration"></a>

HTTPS 接続では、リクエストの受信と応答にかかるよりも長い持続時間が保証されていません。

MQTT 接続時間は、使用する認証機能によって異なります。次の表では、各機能の最適な条件下での最大接続時間が一覧表示されています。


**認証機能による MQTT 接続時間**  

|  機能  |  最大時間 \*  | 
| --- | --- | 
| X.509 クライアント証明書 | 1～2 週間 | 
| カスタム認証 | 1～2 週間 | 
| 署名バージョン 4 | 最長 24 時間 | 

\* 保証なし

X.509 証明書やカスタム認証では、接続時間に厳しい制限はありません。数分程度に短縮することも可能です。接続の中断は、さまざまな理由で発生します。次のリストには、最も一般的な理由の一部が含まれています。
+ Wi-Fi 可用性の中断
+ インターネットサービスプロバイダー (ISP) 接続の中断
+ サービスのパッチ
+ サービスのデプロイ
+ サービスのオートスケーリング
+ 使用できないサービスホスト
+ ロードバランサーの問題および更新
+ クライアント側エラー

デバイスで、切断を検出して再接続するための戦略を実装する必要があります。接続解除イベントとその処理方法に関するガイダンスについては、[ライフサイクルイベント](life-cycle-events.md)の[接続/切断イベント](life-cycle-events.md#connect-disconnect)を参照してください。