クライアントデバイスによる AWS IoT Greengrass のセットアップとトラブルシューティング - AWS 規範ガイダンス

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

クライアントデバイスによる AWS IoT Greengrass のセットアップとトラブルシューティング

マルアン・セフィアーニとアカランカ・デ・シルバ(AWS)によって作成されました

環境:PoC またはパイロット

テクノロジー: IoT

AWS サービス: AWS IoT Greengrass; AWS IoT Core

[概要]

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)」 形式である必要があります。

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

前提条件と制限

前提条件

制約事項

  • AWS IoT Core を利用できる AWS リージョンを選択する必要があります。AWS IoT Core のリージョンの最新リストについては、「リージョン別の AWS サービス」 を参照してください。

  • コアデバイスには、少なくとも 172 MB の RAM と 512 MB のディスクスペースが必要です。

アーキテクチャ

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

クライアントデバイスで AWS IoT Greengrass をセットアップするためのソリューションアーキテクチャ

アーキテクチャには以下が含まれます。

  • 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 ブローカーを介してクライアントデバイスにメッセージを送信できます。

クライアントデバイスとコアデバイス間の通信の詳細については、「追加情報」 セクションを参照してください。

ツール

AWS サービス

  • AWS IoT Greengrass」 は、デバイス上で IoT アプリケーションを構築、デプロイ、管理するのに役立つオープンソースの IoT エッジランタイムおよびクラウドサービスです。

  • AWS IoT Core」 は、インターネットに接続されたデバイスが AWS クラウドに接続するための安全な双方向通信を提供します。

  • AWS IoT Device SDK」 はソフトウェア開発キットで、その中に、オープンソースライブラリ、サンプル付きのデベロッパーガイド、および移植ガイドが含まれているので、選択したプラットフォーム上で革新的な IoT 製品またはソリューションを構築できます。

  • AWS Identity and Access Management (IAM)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。

ベストプラクティス

  • 変換や条件付きアクションなどの AWS IoT Core ルールエンジンの高度な特徴量を利用するには、クライアントデバイスからのメッセージのペイロードを JSON または Protobuf 形式にする必要があります。

  • MQTT ブリッジを双方向通信を許可するように設定します。

  • AWS IoT Greengrass で IP ディテクタコンポーネントを設定してデプロイし、コアデバイスの IP アドレスが MQTT ブローカー証明書のサブジェクト代替名 (SAN) フィールドに含まれるようにします。

エピック

タスク説明必要なスキル

コアデバイスに AWS IoT Greengrass セットアップします。

開発者ガイド」 の指示に従って AWS IoT Greengrass Core ソフトウェアをインストールします。

AWS IoT Greengrass

インストールの状態を確認します。

次のコマンドを使用して、コアデバイスで AWS IoT Greengrass サービスの状態を確認します。

sudo systemctl status greengrass.service

コマンドの期待される出力は次のようになります。

Launched Nucleus successfully
AWS 全般

IAM ポリシーを設定し、それを Greengrass サービスロールにアタッチします。

  1. MQTT ブリッジとの間の通信を許可する IAM ポリシーを作成します。ポリシーの例を次に示します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" }, { "Sid": "GreengrassActions", "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": "*" } ] }
  2. ポリシーを Greengrass サービスロールにアタッチします。サービスロールを取得するには、次のコマンドを使用します。

    aws greengrassv2 get-service-role-for-account --region <region>

    where <region> はお客様の AWS リージョンを指します。

AWS 全般

AWS IoT Greengrass コアデバイスに必要なコンポーネントを設定してデプロイします。

次のコンポネントを設定、デプロイします。

AWS IoT Greengrass

MQTT ブリッジが双方向通信を許可していることを確認します。

クライアントデバイスと AWS IoT Core の間で MQTT メッセージをリレーするには、MQTT ブリッジコンポーネントを設定とデプロイして、リレーするトピックを指定します。例を示します。

{ "mqttTopicMapping": { "ClientDevicesToCloud": { "topic": "dt/#", "source": "LocalMqtt", "target": "IotCore" }, "CloudToClientDevices": { "topic": "cmd/#", "source": "IotCore", "target": "LocalMqtt" } } }
AWS IoT Greengrass

認証コンポーネントがクライアントデバイスに接続してトピックをパブリッシュまたはサブスクライブできることを確認します。

次の aws.greengrass.clientdevices.Auth 設定では、すべてのクライアントデバイスに接続したり、メッセージを公開したり、すべてのトピックをサブスクライブすることを許可しています。

{ "deviceGroups": { "formatVersion": "2021-03-05", "definitions": { "MyPermissiveDeviceGroup": { "selectionRule": "thingName: *", "policyName": "MyPermissivePolicy" } }, "policies": { "MyPermissivePolicy": { "AllowAll": { "statementDescription": "Allow client devices to perform all actions.", "operations": [ "*" ], "resources": [ "*" ] } } } } }
AWS IoT Greengrass
タスク説明必要なスキル

AWS IoT Device SDK をインストールします。

AWS IoT Device SDK をクライアントデバイスにインストールします。サポートされている言語と関連する SDK の全リストについては、「AWS IoT Core のキュメンテーション」 を参照してください。

例えば、AWS IoT Device SDK for Python SDK は にあります GitHub。この SDK をインストールするには:

  1. GitHub リポジトリの「前提条件」ページの指示に従って、Python 3.7 以降がインストールされていることを確認します。

  2. pip コマンドを使用して、 SDK をインストールします。

    MacOS と Linux の場合:

    python3 -m pip install awsiotsdk

    Windows の場合:

    python -m pip install awsiotsdk

代わりに、SDK をソースリポジトリからインストールすることもできます。

# Create a workspace directory to hold all the SDK files mkdir sdk-workspace cd sdk-workspace # Clone the repository git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git # Install using Pip (use 'python' instead of 'python3' on Windows) python3 -m pip install ./aws-iot-device-sdk-python-v2
AWS 全般 IoT

モノの作成

  1. AWS IoT コンソールで、[Get started] (今すぐ始める) ボタンが表示された場合はそれをクリックします。それ以外の場合は、ナビゲーションペインで Security 、 Policies を選択します。

  2. ポリシーはまだ作成されていませんというダイアログボックスが表示された場合、ポリシーの作成を選択します。それ以外の場合は、[作成] を選択します。

  3. AWS IoT ポリシーの名前 (例: ClientDevicePolicy) を入力します。

  4. テートメントの追加セクションで、既存のポリシーを次の JSON コードに置き換えます。 <region><account> をお客様の AWS リージョンと AWS アカウント番号に置き換えます。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account:client/*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account:thing/*" } ] }
  5. [作成] を選択します。

  6. ナビゲーションペインの「AWS IoT コンソール」 では、管理、モノの順に選択します。

  7. まだモノがありませんというダイアログボックスが表示された場合、モノの登録を選択します。それ以外の場合は、[作成] を選択します。

  8. [AWS IoT モノを作成する] ページで、[単一のモノを作成する] を選択します。

  9. [Add your device to the device registry (デバイスレジストリへのデバイスの追加)] ページで、IoT モノの名前 (例: ClientDevice1) を入力し、[次へ] を選択します。

    注:作成後にモノの名前は変更できません。名前を変更するには、新しいモノを作成して、新しい名前を付け、古いモノを削除する必要があります。

  10. [モノに証明書を追加] ページで、[証明書の作成] を選択します。

  11. [ダウンロード] リンクを選択して、証明書、プライベートキー、ルート CA 証明書をダウンロードします。

    重要:これは、証明書とプライベートキーをダウンロードする唯一の機会です。

  12. 証明書を有効にするには、[Activate] (有効化) を選択します。デバイスが AWS IoT に接続するには、証明書がアクティブである必要があります。

  13. [ポリシーのアタッチ] を選択します。

  14. 「モノのポリシーを追加する」で、「モノClientDevicePolicyを登録する」を選択します。

AWS IoT Core

CA 証明書を Greengrass コアデバイスからダウンロードします。

Greengrass Core デバイスがオフライン環境で動作することが予想される場合は、Greengrass コア CA 証明書をクライアントデバイスで使用できるようにする必要があります。これにより、クライアントデバイスが MQTT ブローカーの証明書(Greengrass コア CA によって発行される)を検証できるようになります。そのため、この証明書のコピーを入手することが重要です。CA 証明書をダウンロードするには、次のいずれかの方法を使用します。

  • PC から AWS IoT Greengrass デバイスにネットワークアクセスできる場合は、https://<device IP>:8883 ウェブブラウザに入力して MQTT ブローカー証明書と CA 証明書を表示します。CA 証明書をクライアントデバイスに保存することもできます。

  • または、 OpenSSL のコマンドラインを使用できます。

    openssl s_client -showcerts -connect <device IP>:8883
AWS 全般

認証情報をクライアントデバイスにコピーします。

Greengrass コア CA 証明書、デバイス証明書、および秘密鍵をクライアントデバイスにコピーします。

AWS 全般

クライアントデバイスをコアデバイスと関連付けます。

クライアントデバイスをコアデバイスに関連付けて、コアデバイスを検出できるようにします。その後、「Greengrass ディスカバリー API」 を使用して、関連するコアデバイスの接続、情報と証明書を取得することができます。詳細については、AWS IoT Greengrass ドキュメントの 「クライアントデバイスを関連付ける」 を参照してください。

  1. AWS IoT Greengrass コンソール」 で、コアデバイスを選択します。

  2. 管理するコアデバイスを選択します。

  3. コアデバイスの詳細ページで、[Client devices] (クライアントデバイス) タブを選択します。

  4. [Associated client devices] (関連付けられているクライアントデバイス) セクションで、[Associate client devices] (クライアントデバイスを関連付ける) を選択します。

  5. [Associate client devices with core device] (クライアントデバイスをコアデバイスに関連付ける) モーダルで、関連付ける各クライアントデバイスに対して次の操作を行います。

    1. クライアントデバイスとして関連付ける AWS IoT の名前を入力します。

    2. 追加を選択します。

  6. [関連付ける] を選択します。

関連付けたクライアントデバイスで Greengrass ディスカバリ API を使用して、このコアデバイスを検出できるようになりました。

AWS IoT Greengrass
タスク説明必要なスキル

あるクライアントデバイスから別のクライアントデバイスにデータを送信する。

デバイスの MQTT クライアントを使用して、dt/client1/sensor トピックに関するメッセージを公開します。

AWS 全般

クライアントデバイスから AWS IoT Core にデータを送信します。

デバイスの MQTT クライアントを使用して、dt/client1/sensor トピックに関するメッセージを公開します。

MQTT テストクライアントで、デバイスがメッセージを送信しているトピックを購読するか、すべてのトピックを # に登録します (「詳細」 を参照)。

AWS 全般

AWS IoT Core からクライアントデバイスにメッセージを送信します。

MQTT テストクライアントページの トピックへの発行タブの トピック名フィールドに、メッセージのトピック名を入力します。この例では、cmd/client1 トピックにを使用します。

AWS 全般

トラブルシューティング

問題ソリューション

サーバー証明書エラーを確認できません。

このエラーは、TLS ハンドシェイク中に MQTT ブローカーが提示した証明書を MQTT クライアントが検証できない場合に発生します。最も一般的な理由は、MQTT クライアントが CA 証明書を持っていないことです。以下の手順に従って、CA 証明書が MQTT クライアントに提供されていることを確認します。

  1. PC から AWS IoT Greengrass デバイスにネットワークアクセスできる場合は、https://<device IP>:8883 ブラウザウィンドウに入力して MQTT ブローカー証明書と CA 証明書を表示します。CA 証明書をクライアントデバイスに保存することもできます。

    または、OpenSSL コマンドラインを使用します。

    openssl s_client -showcerts -connect <device IP>:8883
  2. Moquette CA 証明書と Greengrass Core CA 証明書の内容をファイルに保存し、コマンドを使用してデコードされた内容を表示します。

    openssl x509 -in <Name of CA>.pem -text

    Moquette CA 証明書には、次の例のように SAN フィールドが表示されるはずです。

    X509v3 Subject Alternative Name: IP Address:XXX.XXX.XXX.XXX, IP Address:127.0.0.1, DNS:localhost

サーバー名を確認できませんというエラーです。

このエラーは、MQTT クライアントが正しいサーバーに接続していることを検証できない場合に発生します。最も一般的な理由は、Greengrass デバイスの IP アドレスが証明書の SAN フィールドに記載されていないことです。

前のソリューションの指示に従って MQTT ブローカー証明書を取得し、「追加情報」 セクションで説明したように、SAN フィールドに AWS IoT Greengrass デバイスの IP アドレスが含まれていることを確認します。そうでない場合は、IP ディテクターコンポーネントが正しくインストールされていることを確認し、コアデバイスを再起動します。

組み込みクライアントデバイスから接続する場合のみサーバー名を確認できない

組み込みデバイスで使用される一般的な TLS ライブラリである Mbed TLS は、現在、Mbed TLS ライブラリコードに示されているように、証明書の SAN フィールドでの DNS 名検証のみをサポートしています。コアデバイスには独自のドメイン名がなく、IP アドレスに依存しているため、Mbed TLS を使用する TLS クライアントは TLS ハンドシェイク中にサーバー名の検証に失敗し、接続障害の原因となります。「x509_crt_check_san 関数」 を使用して Mbed TLS ライブラリに SAN IP アドレス検証を追加することをお勧めします。

関連リソース

追加情報

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

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

MQTT ブローカーのサーバー証明書の例

サンプル証明書には以下の詳細が表示されます。

  • 証明書は AWS IoT Greengrass Core CA によって発行されます。この証明書はローカルでコアデバイスに固有です。つまり、ローカル CA として機能します。

  • この証明書は、次の図に示す、クライアントの認証コンポーネントによって毎週自動的にローテーションされます。この間隔は、クライアント認証コンポーネントの設定で設定できます。

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

TLS クライアントは、証明書の SAN フィールドを使用して、サーバー検証中に正規のサーバーに接続していることを確認します。これとは対照的に、HTTP サーバーとブラウザー間の通常の TLS ハンドシェイクでは、サーバー検証プロセス中に、共通名 (CN) フィールドまたは SAN フィールドのドメイン名を使用して、ブラウザーが実際に接続しているドメインをクロスチェックします。コアデバイスにドメイン名がない場合は、SAN フィールドに含まれる IP アドレスが同じ目的を果たします。詳細については、RFC 5280 — Internet X.509 公開鍵インフラストラクチャ証明書および証明書失効リスト (CRL) プロファイルの 「サブジェクト代替名」セクションを参照してください

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

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

CA 証明書の例