コマンドの概念とステータス
AWS IoT コマンドを使用して、AWS IoT に接続されているデバイスにクラウドから指示を送信します。コマンド機能を使用するには:
-
まず、デバイスでコマンドを実行するために必要な設定を含むペイロードを使用して、コマンドリソースを作成します。
-
ペイロードを受信し、指定されたアクションを実行するターゲットデバイスを指定します。
-
ターゲットデバイスでコマンドを実行し、デバイスからステータス情報を取得します。問題をトラブルシューティングするには、CloudWatch ログを参照してください。
ワークフローの詳細については、「高レベルのコマンドワークフロー」を参照してください。
コマンドキーの概念
コマンド機能を使用するためのいくつかの重要な概念を以下に示しています。
- コマンド
-
コマンドとは、クラウドから IoT デバイスに送信される指示のことです。これらの指示 (コマンドペイロード) は、MQTT メッセージとしてデバイスに送信されます。デバイスは、コマンドペイロードを受信すると、指示を処理して、対応するアクションを実行することができます。アクションの例としては、デバイス設定の変更、センサーの読み取り値の送信、ログのアップロードなどが挙げられます。その後、デバイスはコマンドを実行して、結果をクラウドに返すことができます。これによって、接続されたデバイスをリモートでモニタリングしたり制御したりすることが可能となっています。
- 名前空間
-
コマンド機能を使用すると、コマンドの名前空間を指定できます。AWS IoT Device Management でコマンドを作成する場合は、デフォルトの
AWS-IoT名前空間を使用する必要があります。この名前空間を使用する場合は、コマンドの作成時にペイロードを指定する必要があります。ペイロードは、ターゲットデバイスで コマンドを実行するときに使用されます。代わりに AWS IoT FleetWise のコマンドを作成する場合は、AWS-IoT-FleetWise名前空間を使用する必要があります。詳細については、「AWS IoT FleetWise デベロッパーガイド」の「コマンド」でリモートコマンドを参照してください。 - ペイロード
-
コマンドを作成するときは、デバイスが実行する必要があるアクションを定義するペイロードを指定する必要があります。ペイロードには、任意の形式を使用できます。ユーザーが送信する情報をデバイスが正しく読み、理解できるように、コマンドでペイロード形式タイプを指定することをお勧めします。デバイスで MQTT5 が使用されている場合は、デバイスは MQTT 標準に従ってペイロード形式を識別できます。JSON または CBOR の形式インジケータは、コマンドリクエストトピックで使用できます。
- 対象デバイス
-
コマンドを実行する場合、コマンドを受信して指定された指示を実行するターゲットデバイスを指定する必要があります。デバイスが AWS IoT でモノとして登録されている場合は、モノの名前を使用できます。デバイスが登録されていない場合は、代わりに MQTT クライアント ID を使用できます。クライアント ID は、MQTT プロトコルで定義されたデバイスまたはクライアントの一意の識別子です。デバイスを AWS IoT に接続するために使用できます。
- コマンドの実行
-
コマンドの実行とは、ターゲットデバイスで実行されるコマンドのステップを指します。実行を開始すると、コマンド (ペイロード) がターゲットデバイスに配信されます。現在、ターゲットに対して一意のコマンド実行 ID が生成されるようになりました。その後デバイスは、コマンドを実行し、その進行状況を AWS IoT に報告できます。コマンドの実行方法および予約済みトピックへステータスが公開される方法は、デバイス側のロジックによって決定されます。
- コマンドトのピック
-
コマンドを実行する前に、デバイスがコマンドリクエストのトピックをサブスクライブしている必要があります。リクエストをクラウドに送信してコマンドを実行すると、ペイロードはコマンドリクエストのトピックでデバイスに送信されます。デバイスはコマンドを実行すると、実行の結果とステータスをコマンドレスポンスのトピックに発行できます。詳細については、「コマンドトのピック」を参照してください。
コマンドの状態
AWS アカウントで作成するコマンドは、使用可能、非推奨、または削除を保留中のいずれかの状態になります。
- 使用可能
-
コマンドリソースが正常に作成されると、使用可能な状態になります。コマンドを使用して、デバイスにコマンド実行を送信することができます。
- 非推奨
-
コマンドを使用する予定がなくなった場合は、非推奨としてマークできます。この状態では、新たにコマンドの実行をデバイスに送信することはできません。すでに開始されていた保留中の実行は、完了するまでデバイスで実行され続けます。新しく実行を送信するには、コマンドを復元して使用可能にする必要があります。
- 削除の保留中
-
コマンドを削除対象としてマークすると、コマンドが非推奨になっている期間が最大タイムアウト期間を超えると、コマンドは自動的に削除されます。これは永久的な操作で、取消すことはできません。デフォルトでは、セッションの最大タイムアウト期間は 12 時間です。コマンドが非推奨になっていない場合、または非推奨状態にある期間が最大タイムアウト期間より短い場合、そのコマンドは [保留中の削除] の状態になります。コマンドは、最大タイムアウト期間経過後に、アカウントから自動的に削除されます。
コマンド実行ステータス
ターゲットデバイスでコマンドの実行を開始すると、コマンドの実行は CREATED ステータスになります。その後、デバイスによって報告されたステータスに応じて、他のコマンド実行ステータスのいずれかに移行できます。その後、ユーザーはステータス情報を取得したり、コマンドの実行を追跡したりできます。
注記
特定のターゲットデバイスに対して、複数のコマンドを同時に実行することができます。同時実行制御機能を使用すると、同じデバイスに送信される実行の最大数を制限できるため、デバイスが過負荷になるのを防ぐことができます。各デバイスに対して実行できる同時実行の最大数については、「AWS IoT Device Management コマンドクォータ」を参照してください。
次の表は、コマンド実行のさまざまなステータスと、実行の進行状況に応じてコマンド実行がさまざまなステータス間でどのように移行するかを示しています。
| コマンド実行ステータス | 開始元はデバイスかクラウドか | 実行の終了かどうか | 許可されたステータスの移行 |
|---|---|---|---|
CREATED |
Cloud | いいえ |
|
IN_PROGRESS |
デバイス | なし |
|
TIMED_OUT |
デバイスとクラウド | なし |
|
SUCCEEDED |
デバイス | はい | 該当しない |
FAILED |
デバイス | あり | 該当しない |
REJECTED |
デバイス | あり | 該当しない |
デバイスがコマンドを実行すると、予約された MQTT トピックのコマンドを使用して、ステータスと結果をいつでもクラウドに発行できます。各コマンド実行ステータスに関する追加のコンテキストをクラウドに提供するには、statusReason オブジェクトに含まれる reasonCode と reasonDescription を使用できます。
次の図は、さまざまなコマンド実行ステータスと、それらの間でコマンド実行がどのように移行していくかを示しています。
注記
AWS IoT でタイムアウト期間内にデバイスのレスポンスが検出されない場合、再試行と状態の変更を許可する一時的なステータス、TIMED_OUT が設定されます。コマンドの実行中にデバイスが明示的に TIMED_OUT を報告する場合、これは終了ステータスになり、それ以上の移行はできなくなります。「非終了のコマンド実行」を参照してください
次のセクションでは、終了と非終了のコマンド実行、さまざまな実行ステータス、および動作について説明します。
非終了のコマンド実行
実行がデバイスまたはクライアントからの更新を受け入れることができる場合、コマンド実行は非終了です。非終了ステータスの実行は、アクティブと見なされます。次のステータスは非終了です。
-
CREATED
AWS IoT コンソールからコマンド実行を開始する場合、または
StartCommandExecutionAPI を使用して、コマンドリクエストトピックを使用してデバイスにコマンドを送信する場合。リクエストが成功すると、コマンドの実行ステータスはCREATEDに変わります。このステータスから、コマンドの実行は他の非終了または終了のいずれかのステータスに移行できます。 -
IN_PROGRESS
コマンドペイロードを受信すると、デバイスはペイロードの指示の実行を開始し、指定されたアクションを実行することができます。コマンドの実行中に、デバイスはコマンドレスポンストピックへレスポンスを発行し、コマンド実行ステータスを
IN_PROGRESSとして更新できます。IN_PROGRESSステータスから、コマンド実行はCREATED以外の他の終了または非終了のステータスに移行できます。注記
UpdateCommandExecutionAPI は、ステータスIN_PROGRESSで複数回呼び出すことができます。statusReasonオブジェクトを使用すると、実行に関する追加の詳細を指定できます。 -
TIMED_OUT
このコマンド実行ステータスは、クラウドとデバイスの両方でトリガーできます。
CREATEDまたはIN_PROGRESSステータスの実行は、次の理由でTIMED_OUTステータスに変わる場合があります。-
コマンドがデバイスに送信されると、タイマーが開始されます。指定した期間内にデバイスからの応答がない場合、クラウドはコマンド実行ステータスを
TIMED_OUTに変更します。この場合、コマンド実行は非終了です。 -
デバイスは、ステータスを他の終了ステータスのいずれかに上書きするか、コマンドの実行時にタイムアウトが発生したことを報告して、ステータスを
TIMED_OUTに設定することができます。この場合、実行ステータスはTIMED_OUTのままですが、StatusReasonオブジェクトのフィールドはデバイスによって報告された情報に応じて変わります。このコマンドの実行は終了になります。
詳細については、「タイムアウト値と TIMED_OUT 実行ステータス」を参照してください。
-
終了のコマンド実行
実行がデバイスからの追加の更新を受け入れなくなった場合、コマンド実行は終了になります。次のステータスは終了です。実行は、非終了の CREATED、IN_PROGRESS、または TIMED_OUT のいずれかのステータスから終了のステータスに移行できます。
-
成功
デバイスがコマンドの実行に成功すると、コマンドレスポンストピックにレスポンスを発行し、コマンド実行ステータスを
SUCCEEDEDに更新できます。 -
FAILED
デバイスがコマンドの実行を完了できなかった場合、コマンドレスポンストピックにレスポンスを発行し、コマンド実行ステータスを
FAILEDに更新できます。statusReasonオブジェクトのreasonCodeフィールドとreasonDescriptionフィールド、または CloudWatch ログを使用して、実行の失敗をさらにトラブルシューティングできます。 -
拒否
デバイスが無効または互換性のないリクエストを受信すると、デバイスは
REJECTEDのステータスでUpdateCommandExecutionAPI を呼び出すことができます。statusReasonオブジェクトのreasonCodeフィールドとreasonDescriptionフィールド、または CloudWatch ログを使用して、問題をさらにトラブルシューティングできます。