

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

# クライアントデバイスによる AWS IoT Greengrass のセットアップとトラブルシューティング
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices"></a>

*Amazon Web Services、Marouane Sefiani、Akalanka De Silva*

## 概要
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-summary"></a>

AWS IoT Greengrass は、エッジデバイスで IoT ソフトウェアを構築、デプロイ、管理するためのモノのインターネット (IoT) エッジランタイムおよびクラウドサービスです。AWS IoT Greengrass のユースケースには以下が含まれます。
+ AWS IoT Greengrass ゲートウェイをホームオートメーションのハブとして使用するスマートホーム
+ AWS IoT Greengrass が製造現場からのデータの取り込みとローカル処理を容易にするスマートファクトリー

AWS IoT Greengrass は、通常は AWS IoT Core に直接接続する他のエッジデバイス (*クライアントデバイス*とも呼ばれる) の安全で認証された MQTT 接続エンドポイントとして機能します。この機能は、クライアントデバイスが AWS IoT Core エンドポイントに直接ネットワークアクセスできない場合に役立ちます。

AWS IoT Greengrass は、以下のユースケースでクライアントデバイスで使用するようにセットアップできます。
+ クライアントデバイスが AWS IoT Greengrass にデータを送信する場合
+ AWS IoT Greengrass が AWS IoT Core にデータを転送するには
+ AWS IoT Core ルールエンジンの高度な AWS IoT Core ルールエンジン特徴量を活用するには

これらの機能を使用するには、AWS IoT Greengrass デバイスに次のコンポーネントをインストールして設定する必要があります。
+ MQTT ブローカー
+ MQTT ブリッジ
+ クライアントデバイス認証
+ IP ディテクター

さらに、クライアントデバイスから公開されるメッセージは JSON 形式または 「[プロトコルバッファ (protobuf)](https://protobuf.dev/)」 形式である必要があります。

このパターンでは、これらの必要なコンポーネントをインストールして設定する方法を説明し、トラブルシューティングのヒントやベストプラクティスを提供します。

## 前提条件と制限
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ 「[AWS Command Line Interface (AWS CLI) バージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)」 
+ Python 3.7 以降を実行する 2 台のクライアントデバイス
+ Java ランタイム環境 (JRE) バージョン 8 以降と 「[Amazon Corretto 11](https://aws.amazon.com/corretto/)」 または 「[OpenJDK 11](https://openjdk.java.net/)」 を実行している 1 つのコアデバイス

**制限事項**
+ AWS IoT Core を利用できる AWS リージョンを選択する必要があります。AWS IoT Core のリージョンの最新リストについては、「[リージョン別の AWS サービス](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」 を参照してください。
+ コアデバイスには、少なくとも 172 MB の RAM と 512 MB のディスクスペースが必要です。

## アーキテクチャ
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-architecture"></a>

このパターンのソリューションアーキテクチャを次の図に示します。

![\[クライアントデバイスで AWS IoT Greengrass をセットアップするためのソリューションアーキテクチャ\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/0656c5ae-d979-4cf7-be92-a46fa81cab0d.png)


アーキテクチャには以下が含まれます。
+  2 つのクライアントデバイス 各デバイスには、プライベートキー、デバイス証明書、ルート認証局 (CA) 証明書が含まれます。MQTT クライアントを含む AWS IoT デバイス SDK も各クライアントデバイスにインストールされます。
+ AWS IoT Greengrass がデプロイされたコアデバイスには、以下のコンポーネントが含まれます。
  + MQTT ブローカー
  + MQTT ブリッジ
  + クライアントデバイス認証
  + IP ディテクター

このアーキテクチャは、以下のシナリオをサポートします。
+ クライアントデバイスは MQTT クライアントを使用して、コアデバイスの MQTT ブローカーを介して相互に通信できます。
+ クライアントデバイスは、コアデバイスの MQTT ブローカーと MQTT ブリッジを介してクラウド内の AWS IoT Core と通信することもできます。
+ クラウド内の AWS IoT Core は、MQTT テストクライアント、コアデバイスの MQTT ブリッジ、および MQTT ブローカーを介してクライアントデバイスにメッセージを送信できます。

クライアントデバイスとコアデバイス間の通信の詳細については、「[追加情報](#set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional)」 セクションを参照してください。

## ツール
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-tools"></a>

**AWS サービス**
+ 「[AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html)」 は、デバイス上で IoT アプリケーションを構築、デプロイ、管理するのに役立つオープンソースの IoT エッジランタイムおよびクラウドサービスです。
+ 「[AWS IoT Core](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html)」 は、インターネットに接続されたデバイスが AWS クラウドに接続するための安全な双方向通信を提供します。
+ 「[AWS IoT Device SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)」 はソフトウェア開発キットで、その中に、オープンソースライブラリ、サンプル付きのデベロッパーガイド、および移植ガイドが含まれているので、選択したプラットフォーム上で革新的な IoT 製品またはソリューションを構築できます。
+ 「[AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。

## ベストプラクティス
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-best-practices"></a>
+ 変換や条件付きアクションなどの AWS IoT Core ルールエンジンの高度な特徴量を利用するには、クライアントデバイスからのメッセージのペイロードを JSON または Protobuf 形式にする必要があります。
+ MQTT ブリッジを双方向通信を許可するように設定します。
+ AWS IoT Greengrass で IP ディテクタコンポーネントを設定してデプロイし、コアデバイスの IP アドレスが MQTT ブローカー証明書のサブジェクト代替名 (SAN) フィールドに含まれるようにします。

## エピック
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-epics"></a>

### コアデバイスをセットアップ
<a name="set-up-the-core-device"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| コアデバイスに AWS IoT Greengrass セットアップします。 | 「[開発者ガイド](https://docs.aws.amazon.com/greengrass/v2/developerguide/install-greengrass-core-v2.html)」 の指示に従って AWS IoT Greengrass Core ソフトウェアをインストールします。 | AWS IoT Greengrass | 
| インストールの状態を確認します。 | 次のコマンドを使用して、コアデバイスで AWS IoT Greengrass サービスの状態を確認します。<pre>sudo systemctl status greengrass.service</pre>コマンドの期待される出力は次のようになります。<pre>Launched Nucleus successfully</pre> | AWS 全般 | 
| IAM ポリシーを設定し、それを Greengrass サービスロールにアタッチします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS 全般 | 
| AWS IoT Greengrass コアデバイスに必要なコンポーネントを設定してデプロイします。 | 次のコンポネントを設定、デプロイします。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS IoT Greengrass | 
| MQTT ブリッジが双方向通信を許可していることを確認します。 | クライアントデバイスと AWS IoT Core の間で MQTT メッセージをリレーするには、MQTT ブリッジコンポーネントを設定とデプロイして、リレーするトピックを指定します。例を示します。<pre>{<br />  "mqttTopicMapping": {<br />    "ClientDevicesToCloud": {<br />      "topic": "dt/#",<br />      "source": "LocalMqtt",<br />      "target": "IotCore"<br />    },<br />    "CloudToClientDevices": {<br />      "topic": "cmd/#",<br />      "source": "IotCore",<br />      "target": "LocalMqtt"<br />    }<br />  }<br />}</pre> | AWS IoT Greengrass | 
| 認証コンポーネントがクライアントデバイスに接続してトピックをパブリッシュまたはサブスクライブできることを確認します。 | 次の `aws.greengrass.clientdevices.Auth` 設定では、すべてのクライアントデバイスに接続したり、メッセージを公開したり、すべてのトピックをサブスクライブすることを許可しています。<pre>{<br />  "deviceGroups": {<br />    "formatVersion": "2021-03-05",<br />    "definitions": {<br />      "MyPermissiveDeviceGroup": {<br />        "selectionRule": "thingName: *",<br />        "policyName": "MyPermissivePolicy"<br />      }<br />    },<br />    "policies": {<br />      "MyPermissivePolicy": {<br />        "AllowAll": {<br />          "statementDescription": "Allow client devices to perform all actions.",<br />          "operations": [<br />            "*"<br />          ],<br />          "resources": [<br />            "*"<br />          ]<br />        }<br />      }<br />    }<br />  }<br />}</pre> | AWS IoT Greengrass | 

### クライアントデバイスをセットアップする
<a name="set-up-client-devices"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS IoT Device SDK をインストールします。 | AWS IoT Device SDK をクライアントデバイスにインストールします。サポートされている言語と関連する SDK の全リストについては、「[AWS IoT Core のキュメンテーション](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)」 を参照してください。たとえば、AWS IoT Device SDK for Python SDK for Python SDK は 「[GitHub にあります](https://github.com/aws/aws-iot-device-sdk-python-v2)」。この SDK をインストールするには:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html)代わりに、SDK をソースリポジトリからインストールすることもできます。<pre># Create a workspace directory to hold all the SDK files<br />mkdir sdk-workspace<br />cd sdk-workspace<br /># Clone the repository<br />git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git<br /># Install using Pip (use 'python' instead of 'python3' on Windows)<br />python3 -m pip install ./aws-iot-device-sdk-python-v2</pre> | AWS 全般 IoT | 
| モノの作成 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS IoT Core | 
| CA 証明書を Greengrass コアデバイスからダウンロードします。 | Greengrass Core デバイスがオフライン環境で動作することが予想される場合は、Greengrass コア CA 証明書をクライアントデバイスで使用できるようにする必要があります。これにより、クライアントデバイスが MQTT ブローカーの証明書（Greengrass コア CA によって発行される）を検証できるようになります。そのため、この証明書のコピーを入手することが重要です。CA 証明書をダウンロードするには、次のいずれかの方法を使用します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS 全般 | 
| 認証情報をクライアントデバイスにコピーします。 | Greengrass コア CA 証明書、デバイス証明書、および秘密鍵をクライアントデバイスにコピーします。 | AWS 全般 | 
| クライアントデバイスをコアデバイスと関連付けます。 | クライアントデバイスをコアデバイスに関連付けて、コアデバイスを検出できるようにします。その後、「[Greengrass ディスカバリー API](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-discover-api.html)」 を使用して、関連するコアデバイスの接続、情報と証明書を取得することができます。詳細については、AWS IoT Greengrass ドキュメントの 「[クライアントデバイスを関連付ける](https://docs.aws.amazon.com/greengrass/v2/developerguide/associate-client-devices.html)」 を参照してください。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html)関連付けたクライアントデバイスで Greengrass ディスカバリ API を使用して、このコアデバイスを検出できるようになりました。 | AWS IoT Greengrass | 

### データを送受信します。
<a name="send-and-receive-data"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| あるクライアントデバイスから別のクライアントデバイスにデータを送信する。 | デバイスの MQTT クライアントを使用して、`dt/client1/sensor` トピックに関するメッセージを公開します。 | AWS 全般 | 
| クライアントデバイスから AWS IoT Core にデータを送信します。 | デバイスの MQTT クライアントを使用して、`dt/client1/sensor` トピックに関するメッセージを公開します。MQTT テストクライアントで、デバイスがメッセージを送信しているトピックを購読するか、すべてのトピックを **\$1** に登録します (「[詳細](https://docs.aws.amazon.com/iot/latest/developerguide/view-mqtt-messages.html)」 を参照)。 | AWS 全般 | 
| AWS IoT Core からクライアントデバイスにメッセージを送信します。 | MQTT テストクライアントページの **[トピックへの発行]** タブの **[トピック名]** フィールドに、メッセージのトピック名を入力します。この例では、`cmd/client1` トピックにを使用します。 | AWS 全般 | 

## トラブルシューティング
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| サーバー証明書エラーを確認できません。 | このエラーは、TLS ハンドシェイク中に MQTT ブローカーが提示した証明書を MQTT クライアントが検証できない場合に発生します。最も一般的な理由は、MQTT クライアントが CA 証明書を持っていないことです。以下の手順に従って、CA 証明書が MQTT クライアントに提供されていることを確認します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 
| サーバー名を確認できませんというエラーです。 | このエラーは、MQTT クライアントが正しいサーバーに接続していることを検証できない場合に発生します。最も一般的な理由は、Greengrass デバイスの IP アドレスが証明書の SAN フィールドに記載されていないことです。前のソリューションの指示に従って MQTT ブローカー証明書を取得し、「[追加情報](#set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional)」 セクションで説明したように、SAN フィールドに AWS IoT Greengrass デバイスの IP アドレスが含まれていることを確認します。そうでない場合は、IP ディテクターコンポーネントが正しくインストールされていることを確認し、コアデバイスを再起動します。 | 
| 組み込みクライアントデバイスから接続する場合のみサーバー名を確認できない | 組み込みデバイスで使用される一般的な TLS ライブラリである Mbed TLS は、現在、Mbed TLS ライブラリコードに示されているように、証明書の SAN フィールドでの DNS 名検証のみをサポートしています。コアデバイスには独自のドメイン名がなく、IP アドレスに依存しているため、Mbed TLS を使用する TLS クライアントは TLS ハンドシェイク中にサーバー名の検証に失敗し、接続障害の原因となります。「[x509\$1crt\$1check\$1san 関数](https://github.com/Mbed-TLS/mbedtls/blob/6a327a5fdc2786cb50b4dbe5e3a75884a1f8435a/library/x509_crt.c#L2548)」 を使用して Mbed TLS ライブラリに SAN IP アドレス検証を追加することをお勧めします。 | 

## 関連リソース
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-resources"></a>
+ 「[AWS IoT Greengrass ドキュメント](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html)」
+ 「[AWS IoT Core キュメント](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html)」
+ 「[MQTT ブローカーコンポーネント](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-moquette-component.html)」
+ 「[MQTT ブリッジコンポーネント](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-bridge-component.html)」
+ 「[クライアントデバイス認証コンポーネント](https://docs.aws.amazon.com/greengrass/v2/developerguide/client-device-auth-component.html)」
+ 「[IP ディテクターコンポーネント](https://docs.aws.amazon.com/greengrass/v2/developerguide/ip-detector-component.html)」
+ 「[AWS IoT デバイス SDK](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)」 
+ 「[AWS IoT Greengrass によるローカルクライアントデバイスの実装](https://aws.amazon.com/blogs/iot/implementing-local-client-devices-with-aws-iot-greengrass/)」 (AWS ブログ記事)
+ 「[RFC 5280 — インターネット X.509 パブリックキーインフラストラクチャ証明書と証明書失効リスト (CRL) プロファイル](https://www.rfc-editor.org/rfc/rfc5280)」

## 追加情報
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional"></a>

このセクションでは、クライアントデバイスとコアデバイスの間の通信に関する追加情報を提供します。

MQTT ブローカーはコアデバイスのポート 8883 で TLS クライアント接続を試行します。次の図は、MQTT ブローカーのサーバー証明書の例を示しています。

![\[MQTT ブローカーのサーバー証明書の例\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/b2c324a1-60cd-4194-80e7-e5184662146a.png)


サンプル証明書には以下の詳細が表示されます。
+ 証明書は AWS IoT Greengrass Core CA によって発行されます。この証明書はローカルでコアデバイスに固有です。つまり、ローカル CA として機能します。
+ この証明書は、次の図に示す、クライアントの認証コンポーネントによって毎週自動的にローテーションされます。この間隔は、クライアント認証コンポーネントの設定で設定できます。

![\[MQTT ブローカーのサーバー証明書のローテーション\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/65bcdc5c-a71c-4f52-adcd-21910fabfc2a.png)

+ サブジェクト代替名 (SAN) は TLS クライアント側でのサーバー名検証において重要な役割を果たします。これにより、TLS クライアントは正しいサーバーに接続でき、TLS セッション設定中の中間者攻撃を回避できます。サンプル証明書の SAN フィールドは、このサーバーがローカルホスト (ローカル UNIX ドメインソケット) をリッスンしていて、ネットワークインターフェースの IP アドレスが 192.168.1.12 であることを示しています。

TLS クライアントは、証明書の SAN フィールドを使用して、サーバー検証中に正規のサーバーに接続していることを確認します。これとは対照的に、HTTP サーバーとブラウザー間の通常の TLS ハンドシェイクでは、サーバー検証プロセス中に、共通名 (CN) フィールドまたは SAN フィールドのドメイン名を使用して、ブラウザーが実際に接続しているドメインをクロスチェックします。コアデバイスにドメイン名がない場合は、SAN フィールドに含まれる IP アドレスが同じ目的を果たします。詳細については、「*RFC 5280 – Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile*」の「[Subject Alternative Name](https://www.rfc-editor.org/rfc/rfc5280#section-4.2.1.6)」セクションを参照してください。

AWS IoT Greengrass の IP ディテクターコンポーネントは、証明書の SAN フィールドに正しい IP アドレスが含まれていることを保証します。

この例の証明書は、ローカル CA として動作する AWS IoT Greengrass デバイスによって署名されています。TLS クライアント (MQTT クライアント) はこの CA を認識しないため、次のような CA 証明書を提供する必要があります。

![\[CA 証明書の例\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/b08b3bcb-9e12-4f5a-9204-cf65ea32902f.png)
