クライアントデバイスを使用した AWS IoT Greengrass のセットアップとトラブルシューティング - AWS 規範ガイダンス

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

クライアントデバイスを使用した AWS IoT Greengrass のセットアップとトラブルシューティング

作成者: Marouane Sefiani と Akalanka De Silva (AWS)

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

テクノロジー: IoT

AWS サービス: AWS IoT Greengrass、AWSIoT Core

[概要]

AWS IoT Greengrass は、エッジデバイスでモノのインターネット (IoT ) ソフトウェアを構築、デプロイ、管理するためのオープンソースのエッジランタイムおよびクラウドサービスです。AWS IoT Greengrass のユースケースは次のとおりです。

  • AWS IoT Greengrass ゲートウェイがホームオートメーションのハブとして使用されるスマートホーム

  • AWS IoT Greengrass が作業現場からのデータの取り込みとローカル処理を容易にできるスマートファクトリー

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

次のユースケースでは、クライアントデバイスで使用する AWS IoT Greengrass を設定できます。

  • クライアントデバイスが AWS IoT Greengrass にデータを送信する場合

  • AWS IoT Greengrass が AWS IoT Core にデータを転送するには

  • 高度な AWS IoT Core ルールエンジン機能を活用するには

これらの機能を使用するには、AWSIoT Greengrass デバイスに以下のコンポーネントをインストールして設定する必要があります。

  • MQTT ブローカー

  • MQTT ブリッジ

  • クライアントデバイス認証

  • IP ディテクター

さらに、クライアントデバイスから発行されるメッセージは、 JSON 形式または Protocol Buffers (protobuf) 形式である必要があります。

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

前提条件と制限

前提条件

制約事項

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

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

アーキテクチャ

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

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

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

  • 2 つのクライアントデバイス 各デバイスには、プライベートキー、デバイス証明書、ルート認証局 (CA) 証明書が含まれます。MQTT クライアントSDKを含む AWS IoT Device は、各クライアントデバイスにもインストールされます。

  • IoT AWS IoT Greengrass が以下のコンポーネントでデプロイされているコアデバイス。

    • MQTT ブローカー

    • MQTT ブリッジ

    • クライアントデバイス認証

    • IP ディテクター

このアーキテクチャは、以下のシナリオをサポートします。

  • クライアントデバイスは、MQTTクライアントを使用して、コアデバイスのMQTTブローカーを介して相互に通信できます。

  • クライアントデバイスは、コアデバイスのMQTTブローカーとブリッジを介してクラウド内の AWS IoT Core MQTT と通信することもできます。

  • 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>

    は AWS リージョン<region>を参照します。

全般 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 デバイス をインストールしますSDK。

AWS IoT デバイスをSDKクライアントデバイスにインストールします。サポートされている言語と関連付けられた の完全なリストについてはSDKs、AWSIoT Core ドキュメント を参照してください。

例えば、AWSIoT 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 コンソール で、開始ボタンが表示された場合は、それを選択します。それ以外の場合は、ナビゲーションペインで Security 、 Policies を選択します。

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

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

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

    { "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. [Create] (作成) を選択します。

  6. AWS IoT コンソールのナビゲーションペインで、Manage , Things を選択します。

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

  8. AWS IoT モノの作成ページで、モノを 1 つ作成する を選択します。

  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 コアデバイスがオフライン環境で動作することが予想される場合は、MQTTブローカーの証明書 (Greengrass コア CA によって発行される) を検証できるように、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を使用して、関連するコアデバイスの接続情報と証明書を取得できます。詳細については、AWSIoT Greengrass ドキュメントの「クライアントデバイスを関連付ける」を参照してください。

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

  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

トラブルシューティング

問題ソリューション

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

このエラーは、MQTTクライアントがTLSハンドシェイク中に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ライブラリTLSである Mbed は現在、Mbed TLSライブラリコードに示すように、証明書の SAN フィールドでのみDNS名前の検証をサポートしています。コアデバイスには独自のドメイン名がなく、IP アドレスに依存するため、Mbed を使用するTLSクライアントTLSはTLSハンドシェイク中にサーバー名の検証に失敗し、接続に失敗します。x509_crt_check_san 関数 で Mbed TLSライブラリに SAN IP アドレス検証を追加することをお勧めします。

関連リソース

追加情報

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

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

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

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

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

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

MQTT ブローカーのサーバー証明書のローテーション
  • サブジェクトの代替名 (SAN) は、TLSクライアント側のサーバー名の検証で重要な役割を果たします。これにより、TLSクライアントが正しいサーバーに接続し、TLSセッション設定中の man-in-the- 中間攻撃を回避できます。証明書の例では、 SANフィールドは、このサーバーが localhost (ローカル 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」セクションを参照してください。

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

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

CA 証明書の例