

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

# 高レベルのコマンドワークフロー
<a name="iot-remote-command-workflow"></a>

このワークフローは、デバイスが AWS IoT Device Management コマンドとやり取りする方法を示しています。すべての HTTP API リクエストは、署名に [Sigv4 認証情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)を使用します。

![\[AWS IoT Device Management デバイスコマンドの概要ワークフロー。\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/device-command-workflow.png)


**Topics**
+ [コマンドの作成と管理](#command-create-command)
+ [コマンドのターゲットデバイスを選択して MQTT トピックをサブスクライブする](#command-choose-target)
+ [ターゲットデバイスのコマンド実行を開始してモニタリングする](#command-command-executions)
+ [(オプション) コマンドイベントの通知を有効にする](#iot-remote-command-commands-notifications)

## コマンドの作成と管理
<a name="command-create-command"></a>

デバイスのコマンドを作成および管理するには、次の手順を実行します。

1. 

**コマンドリソースを作成する**

   コマンド[ハブから、または API を使用してコマンド](https://console.aws.amazon.com/iot/home#/commandHub)を作成します。 [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCommand.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCommand.html)

1. 

**ペイロードを指定する**

   任意の形式でペイロードを指定します。デバイスが正しく解釈されるようにコンテンツタイプを指定します。

   ペイロードテンプレートを使用する動的コマンドの場合、最終的なペイロードは、指定したパラメータを使用して実行時に生成されます。テンプレートは JSON 形式のみをサポートしますが、生成されたペイロードは JSON または CBOR として送信できます。

1. 

**(オプション) 作成したコマンドを管理する**

   作成後に表示名と説明を更新します。不要になったコマンドを非推奨としてマークするか、完全に削除します。ペイロード情報を変更するには、新しいコマンドを作成します。

## コマンドのターゲットデバイスを選択して MQTT トピックをサブスクライブする
<a name="command-choose-target"></a>

ターゲットデバイスを選択し、コマンドを受信してレスポンスを発行するための MQTT トピックを設定します。

1. 

**コマンドのターゲットデバイスを選択する**

   コマンドを受信して実行するターゲットデバイスを選択します。登録済みデバイスにはモノの名前、未登録デバイスにはクライアント ID を使用します。詳細については、「[ターゲットデバイスに関する考慮事項](iot-remote-command-execution-start-monitor.md#iot-command-execution-target)」を参照してください。

1. 

**AWS IoT デバイスポリシーを設定する**

   実行を受信して更新を発行するアクセス許可を付与する IAM ポリシーを設定します。ポリシーの例[サンプルの IAM ポリシー](iot-remote-command-execution-start-monitor.md#iot-remote-command-execution-update-policy)については、「」を参照してください。

1. 

**MQTT 接続を確立する**

   デバイスをメッセージブローカーに接続し、リクエストとレスポンスのトピックにサブスクライブします。デバイスには アクセス`iot:Connect`許可が必要です。`DescribeEndpoint` API または `describe-endpoint` CLI コマンドを使用してデータプレーンエンドポイントを検索します。

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

   このコマンドを実行すると、以下に示すように、アカウント固有のデータプレーンエンドポイントが返されます。

   ```
   account-specific-prefix.iot.region.amazonaws.com
   ```

1. 

**コマンドトピックをサブスクライブする**

   コマンドリクエストトピックをサブスクライブします。実行を開始すると、メッセージブローカーはこのトピックにペイロードを発行します。デバイスは コマンドを受け取り、処理します。

   (オプション) レスポンストピック (`accepted` または `rejected`) をサブスクライブして、クラウドサービスがデバイスのレスポンスを承認したか拒否したかの確認を受け取ります。

   この例では、次のように置き換えます。
   + *`<device>`* を、ターゲットとするデバイスが IoT のモノとして登録されているか、MQTT クライアントとして指定されているかに応じて、`thing` または `client` に置き換えます。
   + *`<DeviceID>`* をターゲットデバイスの一意の識別子に置き換えます。この ID には、一意の MQTT クライアント ID またはモノの名前を使用することができます。
**注記**  
ペイロードタイプが JSON または CBOR でない場合は、コマンドリクエストトピックに *<PayloadFormat>* フィールドが存在しない可能性があります。ペイロード形式を取得するには、MQTT5 を使用して MQTT メッセージヘッダーから形式情報を取得することをお勧めします。詳細については、「[コマンドトのピック](reserved-topics.md#reserved-topics-commands)」を参照してください。

   ```
   $aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>
   $aws/commands/<devices>/<DeviceID>/executions/+/response/accepted/<PayloadFormat>
   $aws/commands/<devices>/<DeviceID>/executions/+/response/rejected/<PayloadFormat>
   ```

## ターゲットデバイスのコマンド実行を開始してモニタリングする
<a name="command-command-executions"></a>

コマンドを作成し、コマンドのターゲットを指定したら、次の手順を実行してターゲットデバイスで実行を開始できます。

1. 

**ターゲットデバイスでコマンド実行を開始する**

   [Command Hub から、](https://console.aws.amazon.com/iot/home#/commandHub)またはアカウント固有のエンドポイントで `StartCommandExecution` API を使用して実行を開始します。`iot:Data-ATS` デュアルスタック (IPv4/IPv6) または IPv4 のみ`iot:Jobs`に使用します。

   API は、ペイロードを コマンドリクエストトピックに発行します。
**注記**  
デバイスがオフラインで MQTT 永続セッションを使用している場合、 コマンドはメッセージブローカーで待機します。タイムアウト前にデバイスが再接続すると、 コマンドを処理して結果を発行できます。タイムアウトが期限切れになると、実行はタイムアウトし、ペイロードは破棄されます。

1. 

**コマンド実行の結果を更新する**

   デバイスはペイロードを受け取り、 コマンドを処理し、指定されたアクションを実行し、`UpdateCommandExecution`MQTT ベースの API を使用してコマンドレスポンストピックに結果を発行します。受け入れられたトピックと拒否されたトピックにサブスクライブすると、デバイスはクラウドサービスが応答を承諾したか拒否したかの確認を受け取ります。

   リクエストトピックで指定した内容に応じて、*<devices>* はモノまたはクライアントにすることができ、*<DeviceID>* は AWS IoT モノの名前または MQTT クライアント ID にすることができます。
**注記**  
*<PayloadFormat>* は、コマンドレスポンストピックで JSON または CBOR のみを使用できます。

   ```
   $aws/commands/<devices>/<DeviceID>/executions/<ExecutionId>/response/<PayloadFormat>
   ```

1. 

**(オプション) コマンド実行結果を取得する**

    AWS IoT コンソールまたは を使用して実行結果を取得します`GetCommandExecution`。デバイスは、最新の情報について、 コマンドレスポンストピックに結果を発行する必要があります。最終更新時刻、結果、完了時刻などの詳細を表示します。

## (オプション) コマンドイベントの通知を有効にする
<a name="iot-remote-command-commands-notifications"></a>

実行ステータスが変更されたときに通知のコマンドイベントをサブスクライブします。イベントメッセージ形式やペイロード属性など、コマンド実行イベントの詳細については、「」を参照してください[コマンド実行イベント](command-events.md)。

1. 

**トピックルールを作成する**

   ステータス変更通知の コマンドイベントトピックにサブスクライブします。 AWS IoT コンソールまたは を使用して AWS Lambda、Amazon SQS や AWS Step Functions などの他の AWS IoT サービスにデバイスデータをルーティングするトピックルールを作成します[AWS IoT ルールの作成](iot-create-rule.md)。

   この例では、`<CommandID>` を通知を受信するコマンドの識別子に置き換え、`<CommandExecutionStatus>` をコマンド実行のステータスに置き換えます。

   ```
   $aws/events/commandExecution/<CommandID>/<CommandExecutionStatus>
   ```
**注記**  
すべてのコマンドとコマンド実行ステータスの通知を受け取るには、ワイルドカード文字を使用し、次のトピックにサブスクライブします。

   ```
   $aws/events/commandExecution/+/#
   ```

1. 

**コマンドイベントを受信して処理する**

   サブスクライブされたイベントを使用して、コマンドプッシュ通知を管理し、アプリケーションを構築します。

次のコードは、受信するコマンドイベント通知のサンプルペイロードを示しています。

```
{
    "executionId": "2bd65c51-4cfd-49e4-9310-d5cbfdbc8554",
    "status":"FAILED",
    "statusReason": {
         "reasonCode": "DEVICE_TOO_BUSY",
         "reasonDescription": ""
    },
    "eventType": "COMMAND_EXECUTION",
    "commandArn":"arn:aws:iot:us-east-1:123456789012:command/0b9d9ddf-e873-43a9-8e2c-9fe004a90086",
    "targetArn":"arn:aws:iot:us-east-1:123456789012:thing/5006c3fc-de96-4def-8427-7eee36c6f2bd",
    "timestamp":1717708862107
}
```