Amazon Web Services ブログ
AWS IoT Device Management のコマンド機能を使用して IoT Device のリモートアクションを簡単化する
はじめに
高度に接続された現代社会では、モノのインターネット(IoT)機器が、家庭やオフィス、産業との関わり方を一変させています。スマートテクノロジーは今や家庭から自動車、産業機器にまで普及しています。これらのデバイスをリモートで制御することは不可欠であり、生産性、ユーザーエクスペリエンス、リスク管理の向上をもたらします。このブログでは、AWS IoT デバイスに安全かつ効果的にリモートコマンドを送信する方法について説明します。
IoT デバイスにリモートアクションを送信することは、スマートソリューションを構築する上で重要な要件です。リモートコマンドは、ユーザ、オペレータ、技術者が離れた場所からデバイスを制御、監視、管理することを可能にします。ユーザーは、物理的にその場にいなくても、デバイスのオン/オフ、設定値の調整、データの取得など、リアルタイムに近いアクションを行うことができます。リモートコマンドの送信は、自動車、ヘルスケア、製造、輸送、スマートホームなど、リモートデバイス管理によって効率の向上、コスト削減、全体的な運用の柔軟性の向上を行うことのできるような業種では極めて重要になっています。
リモートコマンドを送信するために、カスタムのソリューションやワークアラウンドを自前で開発し、IoTソリューションの機能を強化・拡張するケースがこれまでもありました。しかしながら、このような自社開発のソリューションは、時間が経つにつれて複雑化し、スケールさせるのが難しくなりがちで、インフラや運用コストを増加させることがあります。こうした課題に対処するため、AWS はリモートアクションの実行のライフサイクル管理を行う機能として AWS IoT Device Management コマンドをリリースしました。
概要
コマンド機能は、クラウドとデバイス間の双方向通信を可能にする MQTT 標準に基づいたリモートアクション機能です。コマンド機能を使用することで、細かなアクセス制御メカニズムを実装し、承認されたユーザーのみが特定のデバイスにコマンドを送信できるようにすることができます。一般的な使用例には、デバイスアクションの開始、デバイス状態の更新、デバイス構成の変更があります。
コマンド機能は、個々のデバイスに対してリモートアクションを配信するための、細かいアクセス制御と効率的なデバイス管理ツールを提供します。 この機能は AWS IoT コンソールのリモートアクションのセクションからアクセスでき、JavaScript Object Notation (JSON)、Concise Binary Object Representation (CBOR)、Parquet、プレーンテキストなど、さまざまなデータ形式に対応した、カスタマイズ可能なデータペイロードを持つ一意の名前を持ったコマンドを作成することができます。 一度定義されたコマンドは、異なるターゲットデバイスに対して何度でも使用することができます。各コマンドの実行に対して特定のタイムアウト時間を設定したり、リアルタイムの更新と通知を通じてそのコマンド進行状況を監視することできます。以下のワークフローと手順は、コマンド機能の概要を説明しています。
図 1: AWS IoT デバイス管理コマンド機能のワークフロー
AWS IoT Device Management を使ってデバイスにコマンドを送信する:
- 事前定義された再利用可能なコマンドを作成し、AWS IoT Device Management コマンドに保存する。
- ターゲットデバイスに送信するコマンドのペイロードを指定する。
- デバイスタイプを AWS IoT Thing もしくは MQTT client のどちらかに指定する。
- デバイスは以下に示すコマンドトピックをサブスクライブする。
$aws/commands/[things|clients]/[<thingname>|<clientId>]/executions/+/request/
[json|cbor]
ここに IoT コマンドが送信される。 - クライアントアプリケーションを通してユーザがコマンドをトリガーし、それぞれのデバイスのリクエストトピックにコマンドのペイロードが送信される。
- デバイスはリクエストトピックでコマンドペイロードを受信すると、想定されているアクションを行い、クラウドにレスポンスを送る。
- デバイスは以下のトピックにコマンドの実行の進捗とステータスアップデートを送信する。
$aws/commands/[things|clients]/[<thingname>|<clientId>]/executions/<executionid>/response/[json|cbor]
. - コマンドサービスは
$aws/events/commandExecution/<CommandId>/+
にNotificationをパブリッシュし、ユーザーは Notification を受け取る。( 注意: Notification の受信はオプションで、AWS IoT を通じて設定することが可能です。)
AWS Device Management コマンドの主要な機能は以下となります:
- 単一のデバイス上で複数のコマンドを実行するための並列制御。
- AWS IoT に登録されていないデバイスに対してのオペレーションサポート。
- 各コマンドの実行時間の上限を制御し、適切なタイミングでの完了を保証するための時間制限の設定。
- コマンドの進捗状況のリアルタイムな更新。
- セキュアなコマンドの送信と細かなアクセス制御。
リモートアクションを IoT デバイスに送信するための実際のユースケース
AWS IoT Device Management コマンドはスマートホームや産業向け IoT 、車両のフリート管理アプリケーションにおいて、カスタムの MQTT ソリューションの構築を行うことなく、クラウドとデバイスの間の命令セットの送信を簡単化します。
スマートホーム
OEM やスマートホームインテグレーターは、スマートフォンを使って住人が快適性、セキュリティ、エネルギーシステムを制御できるようリモートコマンド機能を実装することができます。 たとえば、スマートフォンから温度調節機能を用いて家に到着する前に暖房を入れたり、家を出たあとに消し忘れた照明をオフにしたりすることができます。 セキュリティカメラで異常なアクティビティを検知した場合は、リモートでドアの施錠、アラーム作動、あるいはスピーカーから話しかけることで不審者の侵入を防止することもできます。 休暇中には、指定した時間に照明やテレビのオンオフをスケジュール管理して不在を外部に知られなようにすることもできます。 天気予報に基づいて、設定を自動的に調整することも可能です。例えば、空調のコストをを下げるために暑い日にはスマートブラインドを閉じる、雨が降った場合には散水のスケジュールを調整する、といったことが可能になります。
産業向け IoT
大規模な製造工場では、IoT デバイスが製造ラインの機器やシステムに組み込まれ、プラント管理者がリアルタイムに近い形でリモートから製造のパラメータを調節することができ、需要の変動やサプライチェーンの不測の事態に対応することができます。センサーが機器の異常を検知した場合、リモートでの診断を行い、生産を停止することなく必要な調整を行うことができます。緊急時には安全プロトコルを起動し、特定の機器もしくはプラントのセクション全体を停止することができます。プラント管理者はリモートコマンドを用いて予兆保全を行い、リアルタイムに近い機器データを用いてメンテナンスのタスクをスケジュールし、ダウンタイムを最小化し、全体の運用効率を最適化することができます。
フリート管理
車両に搭載された IoT デバイスを用いて運輸会社はリモートで各種メトリクスをモニターすることができます。メトリクスには、リアルタイムの位置情報、燃料消費量、エンジンの状態、ドライバーの運転状況などが含まれます。フリート管理者は、機械的に問題のある車両の速度制限を下げることで損傷を事前に防ぐことができます。ドライバーがルートを外れた際には、ナビゲーションシステムの経路を変更することも可能です。悪天候の際には、フリート管理者は該当する車両に安全プロトコルを適用することもできます。さらに、リモートでの車両診断や、無線によるソフトウエアのアップデートを行うことができ、物理的なメンテナンスの必要性を減らすことができます。コマンド機能を使ったフリート管理ソリューションは安全性を向上させ、ダウンタイムを減らし、フリート全体にかかるメンテナンス費用を大幅に削減することができます。
AWS IoT Device Management コマンドとジョブ機能の違い
リモートでのオペレーションを定義して AWS IoT に接続されている1つ以上のデバイスに送付して実施する方法として AWS IoT Jobs を使用する事もできます。コマンドを使用するか Job を使用するかは、利用者の IoT ユースケースの要件と、利用者がデバイスで実施したいやり取りの性質に依存します。
コマンド機能の開始方法
AWS IoT Device Management のコマンド機能を用いた実際のユースケースの一例として、スマート洗濯機を構築する方法を説明します。
ユースケース: あるエンジニアが、リモートから制御可能なスマート洗濯機を開発していることを想定します。ユーザーはどこからでもモバイルアプリからスマート洗濯機を管理することができます。ユーザーはアプリを通してコマンドを送信することができ、洗濯のスタート、ストップ、洗濯タイプのような設定の調整、水の温度の設定、回転スピードの設定などを行うことができます。これらのコマンドは MQTT プロトコルを通じて洗濯機に送られます。オペレーション中にはスマート洗濯機は MQTT を通じてステータスのアップデートを送り、ユーザーに残り時間を示したり、現在のサイクルを表示したり、アラートがあればアラートを表示します。問題が発生した場合には、技術者が問題解決のためにリモートから洗濯機にアクセスし、デバイスの設定を変更したりすることもできますが、この機能は通常のユーザーには制限されます。この機能はどのようなモバイルアプリにも統合することができますが、今回は IoT バックエンドの実装にフォーカスしているので、モバイルアプリの開発とインテグレーションは割愛しています。.
仮定: ここでは、デバイスはすでに AWS IoT Core に登録されており、「SmartWasher」というモノの ID を取得しているものと仮定します。新規デバイス登録については、AWS IoT workshop をご参照ください。
ここでは、コマンド実行の実装と監視の手順をステップバイステップで説明します:
- システムに必要なコマンドを作成します。
- デバイスが発行されたコマンドを受け取れるように、関連するトピックへのサブスクライブを設定します。
- デバイスにて新しい「コマンド実行」を行うためにコマンドを起動します。
- デバイスから実行ステータスをパブリッシュし、トラッキングアプリケーションで進捗を監視します。
重要なお知らせ: コマンドの作成と管理は、AWS SDK、AWS CLI、AWS 管理コンソールなど複数の方法で行うことが可能です。 このブログで紹介するサンプルでは、コマンドの作成と管理を AWS CLI と AWS 管理コンソールで実施します。
ステップ 1: コマンドの作成
スマート洗濯機の 3 つの主要機能を行うコマンドを作成しましょう。1. 既定の設定で通常の洗濯サイクルを開始する。2. 洗濯サイクルを終了する。3. 技術者が診断システムを実行し、診断データにアクセスできるようにする。
コマンド 1: 通常の洗濯サイクルを開始する
AWS IoT で新しいコマンドを作成するには、AWS マネジメントコンソールにアクセスし、AWS IoT サービスに移動します。 そこで、左側のサイドバーにある「Manage」セクションを探し、「Remote actions」をクリックして「Commands」を選択します。 「Create Command」ボタンをクリックしてプロセスを開始します。 プロンプトが表示されたら、Command ID に「StartDefaultCycle」と入力します。 次に、必要なペイロードを含む JSON ファイル ( 詳細は startdefaultcycle.json として以下に示されています) を作成する必要があります。 コマンド作成インターフェースの「Specify payload」セクションで、この JSON ファイルをアップロードします。 すべての詳細が正しいことを確認したら、「Create Command」ボタンをクリックしてプロセスを完了させ、新しいコマンドを AWS IoT システムに追加します。
startdefaultcycle.json
{
"Action": "RunWashCycle",
"CycleType": "Normal",
"Soak": "Yes",
"SpinSpeed": "Medium",
"WaterTemperature": "Warm"
}
図 2: 通常サイクルの新しいコマンドを作成する
コマンド 2: サイクルを停止する
以下のペイロードを使用して、洗濯機の停止コマンドを作成してください。
stopcycle.json
{
"Action": "StopWashCycle"
}
コマンド 3: 診断情報の取得
トラブルシューティングのために、このペイロードを使用して洗濯機のログを取得するコマンドを作成してください。
retrievediagnostics.json
{
"Action": "RetrieveLogs",
"LogType": "DiagnosticMetrics",
"TimeRange": "12Hr"
}
コマンドのホームページには、作成されたコマンドが表示されます。
図 3: AWS マネジメントコンソールのコマンドホームページ
作成したコマンドは、アクションメニューから管理することが可能です。オプションからは、設定の編集、一時的な無効化、もしくは必要に応じて完全な削除を行うことができます。
ステップ 2: デバイスのセットアップとトピックへのサブスクライブ
コマンドサービスは、新しい実行が開始されるたびに、ターゲットデバイスに MQTT で通知を行います。コマンド実行を受信すると、デバイスは構造化されたアクションのシーケンスを開始します。最初に、デバイスは MQTT メッセージのペイロードに基づき、受け取ったコマンドを解釈します。次に、要求されたアクションを実行します。実行後、デバイスはクラウドに実行ステータスを報告し、操作が成功したか、問題があったかをレポートします。このようなコミュニケーションフローを実現するために、デバイスは、すべてのコマンド実行要求がパブリッシュされるリクエストトピックを購読する必要があります。コマンド処理後、デバイスは応答を指定された応答トピックに公開する必要があります。今回のシミュレーションでは、いくつかのシナリオをカバーするため、コマンド実行に成功した場合と失敗した場合の両方を実演します。
このブログでは、AWS IoT Device SDK v2 for Python を使用して、スマート洗濯機をシミュレーションします。
リクエストトピック:
$aws/commands/things/<thing-id>/executions/+/request/json
サブスクリプションが成功したときのスマート洗濯機からのサンプルログ:
図 4: サブスクリプション出力を表示するターミナルウィンドウ
レスポンストピック:
$aws/commands/things/<thing-id>/executions/<execution-id>/response/json
ステップ 3: コマンド実行
エンドユーザーにとって、スマート洗濯機とのインタラクションは、モバイルアプリなどのユーザーフレンドリーなアプリケーションインターフェースを通じて簡素化されています。今回のデモでは、CLI コマンドを使用してこの体験をシミュレートします。以下の CLI コマンドを実行すると、execution-ID が返されます。この一意の識別子は、コマンドの実行に関する情報を追跡および取得するために不可欠です。この ID を必ずメモしてください。以降のクエリで<execution-id> のプレースホルダーをこの execution-ID で置き換える必要があります。
注意:新しいコマンドの実行を開始するには、エンドポイントタイプを iot:Jobs として指定して、DescribeEndpoint API を使用して固有のエンドポイントを取得してください。
通常の洗濯サイクルを開始する実行コマンド:
サンプルリクエスト:
aws iot-jobs-data start-command-execution \
--command-arn arn:aws:iot:<region>:<account-id>:command/StartDefaultCycle \
--target-arn arn:aws:iot:<region>:<account-id>:thing/SmartWasher \
--execution-timeout-seconds 3600 \>
--endpoint-url <endpoint-from-describe-endpoint-api-result>
サンプルレスポンス:
{
"executionId": "576fe4d7-c604-489d-af91-c37ca9f8303b"
}
StartCommandExecution API の呼び出しが成功すると、スマート洗濯機上で動作する MQTT クライアントが、リクエストトピックで MQTT メッセージを受信します。以下は スマート洗濯機で受信されたサンプルです。
図 5: MQTT メッセージを表示するターミナルウィンドウ
ステップ 4: デバイスによるコマンド実行ステータスの更新
コマンド機能は、デバイスがクラウドに状態を報告するために UpdateCommandExecution MQTT トピックベースの API を提供します。上記の例では、スマート洗濯機が洗濯サイクルを開始すると、継続的に状態をクラウドに報告します。
スマート洗濯機からのステータス更新では、「SOAK」が完了したことを報告しています。AWS マネジメントコンソールのサンプル MQTT クライアントを使用して、洗濯機からのステータス更新をシミュレートします。洗濯機は、デバイスと実行に対して固有のレスポンストピックに実行ステータスを投稿します。
$aws/commands/things/SmartWasher/executions/<execution-id>/response/json
{
"status": "IN_PROGRESS",
"result": {
"SOAK": {
"s": "COMPLETED"
},
"RINSE": {
"s": "PENDING"
},
"SPIN": {
"s": "PENDING"
}
}
}
開発者は、GetCommandExecution API を活用することで、アプリケーションにステータス監視機能を追加することができます。
ステップ5.1: エンドユーザー向けの進捗トラッキング(アプリケーション)
エンドユーザーにコマンドの実行状況について通知するため、アプリケーションは定期的に GetCommandExecution API を呼び出し、特定のコマンド実行のほぼリアルタイムなステータスを取得できます。これにより、ユーザーは即時的に進捗をトラックすることができます。
実行ステータスを取得するためのサンプルリクエスト:
aws iot get-command-execution --execution-id <execution-id> \
--target-arn arn:aws:iot:<region>:<account-id>:thing/SmartWasher
ステップ 5.2: 管理者または技術者による進捗トラッキング
技術者および管理者は、指定されたコマンドのイベントトピックを使用して、フリート全体でのコマンドの実行状態を追跡できます。
$aws/events/commandExecution/<command-id>/<CommandExecutionStatus>
この機能をテストするために、AWS IoT コンソールを利用できます。コンソールにログインし、MQTT テストクライアントに移動します。「トピックへのサブスクリプション」セクションで、上記のトピックを購読します。
図 6: コマンド実行ステータストピックをサブスクライブ
以下のコマンドのいずれかを実行し、生成される <execution-id> をメモしてください。MQTT テストクライアントを使用して、指定されたレスポンストピックにレスポンスを送信します。その後、メッセージがコマンド実行ステータストピックに正しく表示されることを確認してください。
図 7: レスポンストピックに成功のメッセージを送信
図 8: コマンド実行ステータストピックの結果を確認
図 9: レスポンストピックに失敗のメッセージをパブリッシュ
図 10: コマンド実行ステータストピックの結果を確認
ポリシー設定
セキュリティを強化するため、AWS IoT コマンドは、特定のユーザーのみが特定のデバイスにコマンドを送信する権限を付与できるように設定することができます。AWS IoT Core は、アイデンティティとアクセス管理(IAM)権限(ポリシーとも呼ばれる)を使用して、コマンド機能へのアクセスを制御します。これらのポリシーは、認証されたユーザーがデバイスにコマンドを送信できるかどうかを決定します。
IAM ポリシーは、個々のユーザー、グループ、またはロールに適用でき、特定のコマンドを実行できるユーザーを詳細に制御できます。例えば、スマート洗濯機システムに 3 つの異なるアクセス権限に応じたロールがあります:
- 管理者: スマート洗濯機のコマンドの作成と管理を担当します。このロールはシステム制御の最高権限を有します。
- 家族メンバー: 日常の洗濯作業で洗濯機を操作する一般ユーザー。アクセス権限は日常使用に必要な基本機能に限定されています。
- 技術者: 問題が発生した際にシステムのメンテナンスやトラブルシューティングを行う役割。診断や修理のための専門的な権限が与えられています。
以下のサンプル IAM ポリシーは参考の目的で提供されています。包括的なポリシー設定の手順については、コマンドの作成と管理のドキュメントをご確認ください。セキュリティのベストプラクティスと最小権限の原則に従うため、AWS IoT のIdentity and Access Management ガイドをご参照ください。これらの例はデモのためのものであり、実際の適用の場合には、相応のセキュリティ要件に合わせてポリシーをカスタマイズする必要あることに留意してください。
Policy1: 管理者ロール
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot:CreateCommand",
"iot:GetCommand",
"iot:UpdateCommand",
"iot:DeleteCommand"
],
"Effect": "Allow",
"Resource": [
"arn:aws:iot:<region>:<account-id>:command/*"
],
"Condition": {
"ArnLike": {
"aws:PrincipalArn": [
"arn:aws:iam::<account-id>:role/<specific-role>",<
"arn:aws:iam::<account-id>:user/<specific-user>"<
]
}
}
}
]
}
Policy2: 家族メンバーおよび一般のユーザーロール
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot:StartCommandExecution",
"iot:GetCommandExecution"
],
"Effect": "Allow",
"Resource": [
"arn:aws:iot:<region>:<account-id>:command/StartDefaultCycle",
"arn:aws:iot:<region>:<account-id>:command/StopWashCycle",
"arn:aws:iot:<region>:<account-id>:thing/SmartWasher"
]
}
]
}
Policy3: 技術者ロール
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot:StartCommandExecution",
"iot:GetCommandExecution"
],
"Effect": "Allow",
"Resource": [
"arn:aws:iot:<region>:<account-id>:command/RetrieveDiagnostics",
"arn:aws:iot:<region>:<account-id>:thing/SmartWasher"
]
}
]
}
まとめ
結論として、AWS IoT デバイス管理のコマンド機能は、IoT デバイスのコマンドをリモートで管理するための安全で効率的かつコスト効果の高い方法を提供し、優れたスケーラビリティを維持します。その軽量な設計、コスト効果の高い用途に応じた機能は、他のカスタム構築ソリューションに対し明確な優位性を提供します。スマートホームの管理であろうと産業施設の管理であろうと、コマンド機能は低遅延かつ高スループットのアプリケーションを開発する開発者に対して、クラウドからデバイスへのインタラクション、リモート監視、制御、診断をスケール可能な状態で実現します。これにより、ユーザーはどこからでもデバイスの制御が可能となります。
関連情報
AWS IoT Device Management のリモートコマンド実行
著者について
Sara Akkandi は、Amazon Web Service(AWS)のソリューションアーキテクトとして、お客様と協力して well-architected のクラウドソリューションの設計と実装を支援しています。彼女の技術的な専門知識を活かし、組織が AWS のサービスとベストプラクティスを活用してビジネス上の課題を効果的に解決し、最適な結果を達成できるよう導いています。

この記事は Sara Akkandi, Ryan Dsouza によって書かれた Using AWS IoT Device Management commands to simplify remote actions on IoT devices の日本語訳です。この記事は プロフェッショナルサービス本部 シニアデリバリーコンサルタントの小林が翻訳しました。