AWS IoT Core Device Advisor で MQTT Connect のテストケースを実施する

2023.05.19

AWS の IoT 系サービスには、AWS IoT Core Device Advisor という「IoT デバイスの検証」を目的としたテストサービスがあります。

このサービスでは、デバイスと AWS IoT Core との接続性やデバイス証明書のポリシーの適正など、デバイスが AWS IoT を使う上での機能性やベストプラクティスの準拠などをテスト・検証することができます。

AWS 側で事前に用意されているテストは下記のとおりです。

  • TLS
  • MQTT
  • Shadow
  • Job Execution
  • Permission and policies
  • Long duration tests

今回はこれらのうち、デバイスシャドウのテストを試してみたいと思います。このテストでは、テスト対象のデバイスが AWS IoT Device Shadow サービスを正しく使用していることを確認します。

デバイスの用意

AWS IoT Core Device Advisor を使うには、当然ですが AWS IoT Core を使うデバイスが必要です。とはいえなにか特別なものが必要という訳ではありません。今回は MQTT で通信するので、デバイス証明書を発行して手元の Mac をデバイスとみなしてテストすることにしました。

最初にテストに使うデバイスの登録と証明書の作成を行います。(既存のものを使う場合はスキップしてください)
今回は、AWS IoT Core のコンソールから行います。

01-create-things-and-certs

単一の thing だけ作成するので、「Create single thing」を選択します。

02-create-single-thing

thing の名前は適当なものを入れてください。今回は testDevice01 としました。

画面の下側はデバイスシャドウの設定になります。「名前付きシャドウ」と以前からある「クラシックシャドウ」を選べますが、今回は「クラシックシャドウ」を選択しました。
必要に応じてどちらかを選択してください。

03-thing-property

次はデバイス証明書の設定です。今回はデフォルトの「(AWS IoT Core による)自動生成」を選択しました。こちらも必要に応じていずれかを選択してください。

04-auto-generate-new-certs

次の画面では、証明書にアタッチするポリシーの設定になります。今回は新規に作成するので「Create policy」をクリックします。

06-create-policy

「Create policy」をクリックするとブラウザの別のタブでポリシー作成の画面が開くので、ポリシー名を適当に指定してください。今回は device-advisor-thing-policy としました。
また、この画面でアタッチするポリシー権限も指定できますが、今回はすべて * を指定しています。
本来はもっと権限を絞ったポリシーにすべきですが、今回は動作テストのため緩い内容にしています。

ポリシーの設定まで完了したら「Create」をクリックします。

07-create-policy

ポリシーが作成できたら元の画面(ブラウザのタブ)に戻ります。リロードボタンをクリックすると、先程作成したポリシーを見つけることができるので、選択して「Create thing」をクリックします。

08-attache-policy

次の画面では、デバイスで保持する証明書各種がダウンロードできるので、全てダウンロードしておきます。
何らかのデバイスを使う場合は、これらの証明書類をデバイス側に保存しておいてください。

09-download-certs

これでデバイスの準備ができました。

MQTT Connect のテストスイートの作成

次にテストスイートを作成します。今回は一番簡単な「MQTT Connect」のテストを行いたいと思います。
AWS IoT Core のコンソールでメニューから「Test suites」をクリックします。

10-test-suits

テストスイートの画面が開いたら「Create test suite」をクリックします。
(画像では過去に作成したテストスイートが映っています)

11-create-test-suite

今回は「MQTT Connect」だけテストするので、テストスイートの種類は「Custom test suite」を選択します。またプロトコルは「MQTT 3.1.1」を選択します。
(プロトコルはご利用されているものに合わせて選択してください)

12-select-test-suite-type

次に実施したい「テストケース」を作ります。右側のテストケース一覧から実施したいケース(今回は「MQTT Connect」)をドラッグ&ドロップで中央のテストグループの中に移します。

13-dd-mqtt-connect

「MQTT Connect」を実行するテストグループができたら、画面下にある「Next」をクリックします。

14-next-next-test-suite

次にデバイスロールを選択します。ここで選択したロールを使って Device Advisor が MQTT アクションを実行します。今回は新規に作成するので「Create new role」を選択します。新規作成を選択すると自動的に「Role name」が入力されます。

その下にある「Permissions」ではこのテストで必要となるリソース情報を指定します。今回は MQTT 接続だけなのでクライアント ID のみを指定します。ここで言う「クライアント ID」とは、MQTT における「クライアント ID」のことです。

なお、テストでリソースの指定が必要なものは、選択したテストケースに応じて自動的にチェックが入っているので、該当項目の設定だけで構いません。
また、クライアント ID は任意のもので構いませんが、後でテストを実行する時に必要となるので覚えておきましょう。今回は 最初に作成した thing と同名の testDevice01 としました。

15-set-client-id

次の画面でレビューして、問題なければ「Create test suite」をクリックして作成完了です。

16-create-test-suite

MQTT Connect のテスト実行

正常にテストスイートが作成できたら一覧画面に表示されていることが確認できます。デフォルトでは「Test suite <作成した月>, <日>, <年>, <時分秒> (UTC+0900)」という形で表示されます。これは後で任意の名前に変更が可能です。

テストを実行したいテストスイートをクリックします。先程作成したテストスイートをクリックして下さい。

17-click-test-suites

テストスイートの詳細画面が開くので、画面右上の「Action」から「Run test suite」 をクリックしてください。

18-select-run

テストを実行する設定画面が開くので、テスト対象を指定します。今回はデバイスに対して行うので「Things」を選択してください。

対象のテストデバイスは最初に作成した thing を一覧から選択します。エンドポイントの選択についてですが、Device Advisor によるテストでは、テスト用のエンドポイントに対してテストを実行します。このエンドポイントは2種類ありますが、今回は一度に一つのテストしか行わないので、「Account-level endpoint」 を選択します。エンドポイントを選択するとテストで利用するエンドポイントが表示されるので、こちらを控えておきましょう。

最後に「Run test」をクリックするとテスト開始となります。

19-run-test

テストが開始されると「Activity log」に作成したテストがタイムスタンプとステータスと共に表示されます。タイムスタンプをクリックするとテスト状況の詳細画面が開きます。

余談ですが、テスト作成直後はタイムスタンプのリンクが有効になっていない場合があります。しばらくするとリンクが有効になるので焦らず待ちましょう。リンクが有効にならないとテスト用のエンドポイントも有効にならないようで、エンドポイントに接続できない状態になっています。

20-click-activiy-log

テストの詳細画面を開くと、先程作成したテストグループで並べたテストケースが一覧で表示されます。(今回は MQTT Connect だけです)

21-in-progress

MQTT クライアントの準備

次にテスト用の MQTT クライアントを用意します。今回は Mac をテスト対象のデバイスと想定していますが、テストには Mac にインストールされている「MQTTX」というクライアントツールを使います。

MQTTX については下記のブログをご参考にして頂ければと思います。

今回は「MQTTX」を使っていますが、各種言語で実装したものでもいいですし、Mosquitto など他のツールを使ってもらっても構いせん。

MQTTX の設定は下記のとおりです。

設定項目 設定内容 備考
Name 適当なものを指定 MQTTX 上での設定名です
Client ID testDevice01 テストスイートの作成時に指定したクライントIDを指定
Host mqtts://テスト用のエンドポイント -
Port 8883 -
CA File CA 証明書のパス AWS IoT Core で thing 作成時にダウンロードした Amazon ルート CA 証明書
Client Certificate File デバイス証明書のパス AWS IoT Core で thing 作成時にダウンロードしたデバイス証明書
Client key file 秘密鍵 AWS IoT Core で thing 作成時にダウンロードした秘密鍵
MQTT Version 3.1.1 テストスイート作成時に指定したバージョンと同じものを指定

30-mqttx-settings

31-mqttx-settings-mqtt-version

MQTTX の設定が完了したら、画面右上の矢印をクリックしてエンドポイントに接続します。

エンドポイントへの接続は初回は失敗しますが、失敗してもテスト自体が失敗したわけではないので何度か接続を試みてください。2回目でも接続が失敗することがありますが、諦めずに何度かリトライしてみてください。

また、一度接続が成功してもテストステータスが変わらない場合があります。そのような場合でも再度接続を試してみてください。

32-connect-by-mqttx

無事にエンドポイントに接続できたら、テストステータスが下記のように「Passed」に変わります。

22-passed-mqtt-conn

詳細画面でも「MQTT Connect」のテストケースが成功したことが分かります。

23-result-lists

テスト実行時の注意点ですが、エンドポイントに接続できるのはテストが実行中の場合のみです。

MQTTX の設定に時間がかかってしまって、テストがタイムアウトしてしまうとエンドポイントが無効化されて接続できなくなります。そのような時はテストステータスが下記のように表示されます。
タイムアウトした場合は、あらためて画面右上の「Actions」からテストを再実行してください。

33-test-timeout

なお、MQTT 接続のテストケースにおけるデフォルトのタイムアウトは 5 分です。

これで MQTT Connect のテストが無事に終わりました。

最後に

Device Advisor を初めて使ってみました。今回は単純な接続テストだけでしたが、他のテストについても引き続き試してみたいと思います。

以上です。