

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

# チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション
<a name="iot-dc-runjobs"></a>

これらのチュートリアルでは、ジョブを設定して Raspberry Pi にデプロイして、IoT デバイスにリモートオペレーションを送信する方法をデモンストレーションします。

**このチュートリアルを開始するには、以下を行います。**
+ ローカルホストコンピュータ Raspberry Pi を[前のセクション](iot-dc-testconn.md)で使用したのと同様の設定してください。
+ 前のセクションのチュートリアルを完了していない場合は、 に AWS IoT Device Client をインストールした後に保存したイメージを持つ microSD カードで Raspberry Pi を使用して、このチュートリアルを試すことができます[(オプション) microSD カードイメージを保存する](iot-dc-install-download.md#iot-dc-install-dc-save)。
+ このデモを以前に実行したことがある場合は、リソースエラーが重複しないように[ステップ 2: AWS IoT Device Client でデモを構築 AWS アカウント した後で をクリーンアップする](iot-dc-cleanup.md#iot-dc-cleanup-cloud)、 AWS IoT 「」を参照して、以前の実行で作成したすべてのリソースを削除します。

このチュートリアルの完了には 45 分ほどかかります。

**このトピックが終了したら、次の状態になります。**
+ IoT デバイスが AWS IoT Core を使用して、 によって管理されるリモートオペレーションを実行するさまざまな方法を説明します AWS IoT 。

**必要な機器:**
+ [前のセクション](iot-dc-install-dc.md)でテストしたローカルの開発およびテスト環境
+ [前のセクション](iot-dc-install-dc.md)でテストした Raspberry Pi
+ [前のセクション](iot-dc-install-dc.md)でテストした Raspberry Pi の microSD メモリカード

**Topics**
+ [ジョブを実行するために Raspberry Pi を準備する](iot-dc-runjobs-prepare.md)
+ [AWS IoT Device Client AWS IoT を使用して でジョブを作成して実行する](iot-dc-runjobs-prepare-define.md)

# ジョブを実行するために Raspberry Pi を準備する
<a name="iot-dc-runjobs-prepare"></a>

このセクションの手順では、 AWS IoT Device Client を使用して Raspberry Pi がジョブを実行するように準備する方法について説明します。

**注記**  
これらの手順はデバイス固有です。このセクションの手順を複数のデバイスで同時に実行する場合、各デバイスには独自のポリシーと、一意のデバイス固有の証明書およびモノ名が必要です。各デバイスに固有のリソースを割り当てるには、手順の説明に従ってデバイス固有の要素を変更しながら、デバイスごとに 1 回ずつこの手順を実行します。

**Topics**
+ [Raspberry Pi をプロビジョニングしてジョブをデモンストレーションする](#iot-dc-runjobs-prepare-provision)
+ [ジョブエージェントを実行するように AWS IoT Device Client を設定する](#iot-dc-runjobs-prepare-config)

## Raspberry Pi をプロビジョニングしてジョブをデモンストレーションする
<a name="iot-dc-runjobs-prepare-provision"></a>

このセクションの手順では、 AWS IoT リソースとデバイス証明書を作成して AWS IoT 、 で Raspberry Pi をプロビジョニングします。

**Topics**
+ [デバイス証明書ファイルを作成してダウンロードし、 AWS IoT ジョブをデモンストレーションする](#iot-dc-runjobs-prepare-cert)
+ [AWS IoT ジョブをデモンストレーションする AWS IoT リソースを作成する](#iot-dc-runjobs-prepare-iot)

### デバイス証明書ファイルを作成してダウンロードし、 AWS IoT ジョブをデモンストレーションする
<a name="iot-dc-runjobs-prepare-cert"></a>

この手順では、このデモのデバイス証明書ファイルが作成されます。

複数のデバイスを準備する場合は、この手順を各デバイスで実行する必要があります。

**Raspberry Pi のデバイス証明書ファイルを作成してダウンロードするには、次の手順を実行します。**

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力します。

1. 次のコマンドを入力して、デバイスのデバイス証明書ファイルを作成します。

   ```
   aws iot create-keys-and-certificate \
   --set-as-active \
   --certificate-pem-outfile "~/certs/jobs/device.pem.crt" \
   --public-key-outfile "~/certs/jobs/public.pem.key" \
   --private-key-outfile "~/certs/jobs/private.pem.key"
   ```

   このコマンドでは次のようなレスポンスが返されます。後で使用するために `certificateArn` の値を保存します。

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. 次のコマンドを入力して、証明書ディレクトリとそのファイルに対するアクセス許可を設定します。

   ```
   chmod 700 ~/certs/jobs
   chmod 644 ~/certs/jobs/*
   chmod 600 ~/certs/jobs/private.pem.key
   ```

1. 次のコマンドを実行して、証明書のディレクトリおよびファイルに対するアクセス許可を確認します。

   ```
   ls -l ~/certs/jobs
   ```

   コマンドの出力は、ファイルの日付と時刻が異なることを除いて、ここで表示されるものと同じである必要があります。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

デバイス証明書ファイルを Raspberry Pi にダウンロードしたら、[Raspberry Pi をプロビジョニングしてジョブをデモンストレーションする](#iot-dc-runjobs-prepare-provision) に進む準備が整います。

### AWS IoT ジョブをデモンストレーションする AWS IoT リソースを作成する
<a name="iot-dc-runjobs-prepare-iot"></a>

このデバイスの AWS IoT リソースを作成します。

複数のデバイスを準備する場合は、この手順をデバイスごとに実行する必要があります。



**AWS IoTでデバイスをプロビジョニングするには:**

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

1. 次のコマンドを入力して、 AWS アカウントのデバイスデータエンドポイントのアドレスを取得します。

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

   最後にこのコマンドを実行してからエンドポイントの値は変更されていません。ここでコマンドをここで再度実行すると、このチュートリアルで使用する設定ファイルにデータエンドポイントの値を簡単に検索して貼り付けることができます。

   **describe-endpoint** コマンドでは次のようなレスポンスが返されます。後で使用できるように、`endpointAddress` の値を記録しておきます。

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. *uniqueThingName* をデバイスの一意の名前に置き換えます。このチュートリアルを複数のデバイスで実行する場合は、各デバイスに独自の名前を付けます。例えば、**TestDevice01**、**TestDevice02** などです。

   このコマンドを入力して、Raspberry Pi の新しい AWS IoT モノのリソースを作成します。

   ```
   aws iot create-thing --thing-name "uniqueThingName"
   ```

    AWS IoT モノのリソースはクラウド内のデバイスの*仮想*表現であるため、 で複数のモノのリソースを作成して AWS IoT 、さまざまな目的に使用できます。これらすべてを同じ物理 IoT デバイスで使用して、デバイスのさまざまな側面を表すことができます。
**注記**  
複数のデバイスに対してポリシーを確保する場合は、静的なモノの名前である `uniqueThingName` の代わりに `${iot:Thing.ThingName}` を使用できます。

   これらのチュートリアルでは、デバイスごとに一度に 1 つのモノのリソースしか使用しません。このように、これらのチュートリアルでは、デモの AWS IoT リソースを作成した後、それぞれに特別に作成したリソースを使用してデモに戻って繰り返すことができるように、さまざまなデモを表します。

    AWS IoT モノのリソースが作成された場合、コマンドはこのようなレスポンスを返します。このデバイスで実行するジョブを作成するときに、後で使用するために `thingArn` の値を記録します。

   ```
   {
   "thingName": "uniqueThingName",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/uniqueThingName",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. ターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:DescribeJobExecution",
                      "iot:GetPendingJobExecutions",
                      "iot:StartNextPendingJobExecution",
                      "iot:UpdateJobExecution"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
                  ]
              }
          ]
      }
      ```

   1. エディタでは、すべてのポリシーステートメントの`Resource`セクションで、*us-west-2:57EXAMPLE833* を、自身の AWS リージョン、コロン文字 (:)、12 桁の AWS アカウント 番号に置き換えます。

   1. エディタで、すべてのポリシーステートメントの *uniqueThingName* を、このリソースに付けたモノ名と置き換えます。

   1. テキストエディタのファイルを **\$1/policies/jobs\$1test\$1thing\$1policy.json** として保存します。

      複数のデバイスに対してこの手順を実行する場合は、各デバイスでこのファイル名にファイルを保存します。

1. *uniqueThingName* をデバイスのモノの名前に置き換え、このコマンドを実行して、そのデバイスに合わせた AWS IoT ポリシーを作成します。

   ```
   aws iot create-policy \
   --policy-name "JobTestPolicyForuniqueThingName" \
   --policy-document "file://~/policies/jobs_test_thing_policy.json"
   ```

   ポリシーが作成されると、コマンドは次のようなレスポンスを返します。  
****  

   ```
   {
       "policyName": "JobTestPolicyForuniqueThingName",
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/JobTestPolicyForuniqueThingName",
       "policyDocument": "{\n\"Version\": \"2012-10-17\",\n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
       "policyVersionId": "1"
   }
   ```

1. *uniqueThingName* をデバイスのモノ名と置き換え、`certificateArn` をこのセクションで前に保存したこのデバイスの `certificateArn` の値に置き換えてから、次のコマンドを実行して、ポリシーをデバイス証明書にアタッチします。

   ```
   aws iot attach-policy \
   --policy-name "JobTestPolicyForuniqueThingName" \
   --target "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

1.  *uniqueThingName* をデバイスのモノの名前に置き換え、 をこのセクションの前半`certificateArn`で保存した`certificateArn`値に置き換え、このコマンドを実行してデバイス証明書を AWS IoT モノリソースにアタッチします。

   ```
   aws iot attach-thing-principal \
   --thing-name "uniqueThingName" \
   --principal "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

Raspberry Pi を正常にプロビジョニングしたら、引き続きテストに含まれる別の Raspberry Pi についてこのセクションを繰り返します。すべてのデバイスがプロビジョニングされている場合は、[ジョブエージェントを実行するように AWS IoT Device Client を設定する](#iot-dc-runjobs-prepare-config) に進みます。

## ジョブエージェントを実行するように AWS IoT Device Client を設定する
<a name="iot-dc-runjobs-prepare-config"></a>

この手順では、 AWS IoT Device Client がジョブエージェントを実行するための設定ファイルを作成します。

注: 複数のデバイスを準備する場合は、この手順を各デバイスで実行する必要があります。

**AWS IoT Device Client をテストする設定ファイルを作成するには:**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/jobs/device.pem.crt",
        "key": "~/certs/jobs/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "uniqueThingName",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": true,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": false,
            "publish-topic": "",
            "publish-file": "",
            "subscribe-topic": "",
            "subscribe-file": ""
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. *エンドポイント*値を、「」で見つけ AWS アカウント た のデバイスデータエンドポイント値に置き換えます[でデバイスをプロビジョニングする AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

   1. *uniqueThingName* をこのデバイスに使用したモノ名に置き換えます。

   1. テキストエディタのファイルを **\$1/dc-configs/dc-jobs-config.json** として保存します。

1. 次のコマンドを実行して、新しい設定ファイルのファイルアクセス許可を設定します。

   ```
   chmod 644 ~/dc-configs/dc-jobs-config.json
   ```

**[MQTT test client]** (MQTT テストクライアント) はこのテストには使用しません。デバイスはジョブ関連の MQTT メッセージを と交換しますが AWS IoT、ジョブの進行状況メッセージはジョブを実行しているデバイスとのみ交換されます。ジョブの進行状況メッセージはジョブを実行しているデバイスとのみ交換されるため、 AWS IoT コンソールなどの別のデバイスからサブスクライブすることはできません。

設定ファイルを保存すると、[AWS IoT Device Client AWS IoT を使用して でジョブを作成して実行する](iot-dc-runjobs-prepare-define.md) に進む準備が整います。

# AWS IoT Device Client AWS IoT を使用して でジョブを作成して実行する
<a name="iot-dc-runjobs-prepare-define"></a>

このセクションの手順では、ジョブドキュメントと AWS IoT ジョブリソースを作成します。ジョブリソースを作成すると、 AWS IoT はジョブドキュメントを、ジョブエージェントがジョブドキュメントをデバイスまたはクライアントに適用する指定されたジョブターゲットに送信します。

**Topics**
+ [IoT ジョブのジョブドキュメントを作成して保存する](#iot-dc-runjobs-prepare-define-jobdoc)
+ [1 つの IoT デバイス AWS IoT に対して でジョブを実行する](#iot-dc-runjobs-prepare-define-job)

## IoT ジョブのジョブドキュメントを作成して保存する
<a name="iot-dc-runjobs-prepare-define-jobdoc"></a>

この手順では、 ジョブリソースに含めるシンプルな AWS IoT ジョブドキュメントを作成します。このジョブドキュメントでは「Hello world\$1」と ジョブターゲットに表示されます。

**ジョブドキュメントを作成して保存するには、次の手順に従います。**

1. ジョブドキュメントを保存する Amazon S3 バケットを選択します。これに使用する既存の Amazon S3 バケットがない場合は、バケットを作成する必要があります。Amazon S3 バケットを作成する方法については、「[Amazon S3 の開始方法](https://docs.aws.amazon.com//AmazonS3/latest/userguide/GetStartedWithS3.html)」のトピックを参照してください。

1. このジョブのジョブドキュメントを作成して保存します。

   1. ローカルホストコンピュータで、テキストエディタを開きます。

   1. 次のテキストをコピーしてエディタに貼り付けます。

      ```
      {
          "operation": "echo",
          "args": ["Hello world!"]
      }
      ```

   1. ローカルホストコンピュータで、エディタの内容を **hello-world-job.json** という名前のファイルに保存します。

   1. ファイルが正しく保存されたことを確認します。一部のテキストエディタはテキストファイルを保存するときに自動的に `.txt` をファイル名に追加します。エディタが `.txt` をファイル名に追加した場合、先に進む前にファイル名を修正してください。

1. *path\$1to\$1file* を、**hello-world-job.json** が現在のディレクトリにない場合はそこへのパスに置き換え、*s3\$1bucket\$1name* を、選択したバケットへの Amazon S3 バケットパスに置き換えてから、次のコマンドを実行して、ジョブドキュメントを Amazon S3 バケットに配置します。

   ```
   aws s3api put-object \
   --key hello-world-job.json \
   --body path_to_file/hello-world-job.json --bucket s3_bucket_name
   ```

   Amazon S3 に保存したジョブドキュメントを特定するジョブドキュメント URL は、次の URL の *s3\$1bucket\$1name* と *AWS\$1region* を置き換えたものになります。後で *document\$1path* として使用するために、結果の URL を記録します。

   ```
   https://s3_bucket_name.s3.AWS_Region.amazonaws.com/hello-world-job.json
   ```
**注記**  
AWS セキュリティにより、ブラウザを使用するなどして AWS アカウント、 の外部でこの URL を開くことができなくなります。URL は、デフォルトで ファイルにアクセスできる AWS IoT ジョブエンジンによって使用されます。本番稼働環境では、 AWS IoT サービスに、Amazon S3 に保存されているジョブドキュメントにアクセスするためのアクセス許可があることを確認する必要があります。

ジョブドキュメントの URL を保存したら、[1 つの IoT デバイス AWS IoT に対して でジョブを実行する](#iot-dc-runjobs-prepare-define-job) に進みます。

## 1 つの IoT デバイス AWS IoT に対して でジョブを実行する
<a name="iot-dc-runjobs-prepare-define-job"></a>

このセクションの手順では、Raspberry Pi で AWS IoT Device Client を起動して、デバイスでジョブエージェントを実行してジョブの実行を待機します。また、 にジョブリソースを作成し AWS IoT、ジョブを に送信して IoT デバイス上で実行します。

**注記**  
この手順では、1 つのデバイスでのみジョブを実行します。

**Raspberry Pi でジョブエージェントを開始するには、次の手順に従います。**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、このコマンドを実行して AWS IoT Device Client を起動します。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-jobs-config.json
   ```

1. ターミナルウィンドウで、 AWS IoT Device Client と がこれらのメッセージを表示することを確認します。

   ```
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Jobs is enabled
                         .
                         .
                         .
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Client base has been notified that Jobs has started
   2021-11-15T18:45:56.708Z [INFO]  {JobsFeature.cpp}: Running Jobs!
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to startNextPendingJobExecution accepted and rejected
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to nextJobChanged events
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusAccepted for jobId +
   2021-11-15T18:45:56.738Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionAccepted with code {0}
   2021-11-15T18:45:56.739Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusRejected for jobId +
   2021-11-15T18:45:56.753Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToNextJobChanged with code {0}
   2021-11-15T18:45:56.760Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobRejected with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobAccepted with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionRejected with code {0}
   2021-11-15T18:45:56.777Z [DEBUG] {JobsFeature.cpp}: Publishing startNextPendingJobExecutionRequest
   2021-11-15T18:45:56.785Z [DEBUG] {JobsFeature.cpp}: Ack received for StartNextPendingJobPub with code {0}
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1. ターミナルウィンドウで、次のメッセージが表示されたら、次の手順に進み、ジョブリソースを作成します。これは、リストの最後のエントリではない可能性があることに注意してください。

   ```
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

**AWS IoT ジョブリソースを作成するには**

1. ローカルホストコンピュータで、次の操作を行います。

   1. *job\$1document\$1url* を [IoT ジョブのジョブドキュメントを作成して保存する](#iot-dc-runjobs-prepare-define-jobdoc) のジョブドキュメント URL に置き換えます。

   1. *thing\$1arn* をデバイス用に作成したモノのリソースの ARN に置き換えてから、次のコマンドを実行します。

      ```
      aws iot create-job \
      --job-id hello-world-job-1 \
      --document-source "job_document_url" \
      --targets "thing_arn" \
      --target-selection SNAPSHOT
      ```

      成功すると、コマンドは次のような結果を返します。

      ```
      {
        "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
        "jobId": "hello-world-job-1"
      }
      ```

1. ターミナルウィンドウには、このような AWS IoT Device Client からの出力が表示されます。

   ```
   2021-11-15T18:02:26.688Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Job ids differ
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: Executing job: hello-world-job-1
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Assuming executable is in PATH
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: About to execute: echo Hello world!
   2021-11-15T18:10:24.890Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken 3TEWba9Xj6 in the updateJobExecution promises map
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process now running
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process about to call execvp
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Parent process now running, child PID is 16737
   2021-11-15T18:10:24.891Z [DEBUG] {16737}: Hello world!
   2021-11-15T18:10:24.891Z [DEBUG] {JobEngine.cpp}: JobEngine finished waiting for child process, returning 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job exited with status: 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job executed successfully!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.892Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.892Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken GmQ0HTzWGg in the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken 3TEWba9Xj6 from the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:24.917Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken GmQ0HTzWGg from the updateJobExecution promises map
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:25.861Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1.  AWS IoT Device Client が実行中でジョブを待っている間、`job-id`値を変更し、ステップ 1 **create-job**から を再実行することで、別のジョブを送信できます。

ジョブの実行が完了したら、ターミナルウィンドウで ^C (control-C) と入力して AWS IoT Device Client を停止します。