

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

# ジョブワークフロー
<a name="jobs-workflow-jobs-online"></a>

以下に、新しいジョブの開始からジョブ実行の完了ステータスのレポートまで、ジョブワークフローのさまざまなステップを示しています。

## 新しいジョブを開始する
<a name="jobs-respond-new-job"></a>

新しいジョブが作成されると、AWS IoTJobs は各ターゲットデバイスの `$aws/things/{{thing-name}}/jobs/notify`トピックにメッセージを発行します。

メッセージには、次に示す情報が含まれます。

```
{
    "timestamp":1476214217017,
    "jobs":{
        "QUEUED":[{
            "jobId":"0001",
            "queuedAt":1476214216981,
            "lastUpdatedAt":1476214216981,
            "versionNumber" : 1
        }]
    }
}
```

デバイスは、ジョブの実行がキューに入れられたときに、`'$aws/things/{{thingName}}/jobs/notify'` トピックでこのメッセージを受け取ります。

**注記**  
オプションの `SchedulingConfig` 付きのジョブの場合、そのジョブの初期状態は `SCHEDULED` に維持されます。ジョブが選択した `startTime` に達すると、次の処理が実行されます。  
ジョブの状態は `IN_PROGRESS` に更新されます。
ジョブによって、対象グループ内のすべてのデバイスに対し、ジョブドキュメントのロールアウトを開始します。

## ジョブ情報を取得する
<a name="jobs-respond-get-job"></a>

ジョブの実行に関する詳細情報を取得するには、デバイスは `includeJobDocument` フィールドを `true` に設定して [DescribeJobExecution](jobs-mqtt-api.md#mqtt-describejobexecution) MQTT API を呼び出します (デフォルト)。

リクエストが成功すると、AWS IoTジョブサービスは`$aws/things/MyThing/jobs/0023/get/accepted`トピックにメッセージを発行します。

```
{
    "clientToken" : "client-001",
    "timestamp" : 1489097434407,
    "execution" : {
        "approximateSecondsBeforeTimedOut": number,
        "jobId" : "023",
        "status" : "QUEUED",
        "queuedAt" : 1489097374841,
        "lastUpdatedAt" : 1489097374841,
        "versionNumber" : 1,
        "jobDocument" : {
            < contents of job document >
        }
    }
}
```

リクエストが失敗すると、AWS IoTジョブサービスは`$aws/things/MyThing/jobs/0023/get/rejected`トピックにメッセージを発行します。

デバイスにはジョブドキュメントがあるようになり、これを使用してジョブのリモートオペレーションを実行できます。ジョブドキュメントに Amazon S3 の署名付き URL が含まれている場合、デバイスはその URL を使用してジョブに必要なファイルをダウンロードできます。

## ジョブの実行ステータスレポート
<a name="jobs-job-processing"></a>

デバイスがジョブを実行しているときに、[UpdateJobExecution](jobs-mqtt-api.md#mqtt-updatejobexecution) MQTT API を呼び出してジョブの実行ステータスを更新できます。

たとえば、デバイスは、`IN_PROGRESS` トピックに次のメッセージを公開することによって、ジョブの実行ステータスを `$aws/things/MyThing/jobs/0023/update` に更新することができます。

```
{
    "status":"IN_PROGRESS",
    "statusDetails": {
        "progress":"50%"
    },
    "expectedVersion":"1",
    "clientToken":"client001"
}
```

ジョブは、`$aws/things/MyThing/jobs/0023/update/accepted` トピックまたは `$aws/things/MyThing/jobs/0023/update/rejected` トピックにメッセージを公開して応答します｡

```
{
    "clientToken":"client001",
    "timestamp":1476289222841
}
```

デバイスは、[StartNextPendingJobExecution](jobs-mqtt-api.md#mqtt-startnextpendingjobexecution) を呼び出すことによって以前の 2 つのリクエストを組み合わせることができます。これは､次の保留中のジョブ実行を取得して開始し、デバイスがジョブ実行ステータスを更新できるようにします。このリクエストは、ジョブの実行が保留中の場合にもジョブドキュメントを返します。

ジョブに [TimeoutConfig](https://docs.aws.amazon.com//iot/latest/apireference/API_TimeoutConfig.html) が含まれている場合、進捗タイマーが開始されます。[UpdateJobExecution](https://docs.aws.amazon.com//iot/latest/apireference/API_iot-jobs-data_UpdateJobExecution.html) を呼び出すときの `stepTimeoutInMinutes`の値を設定することで、ジョブ実行のステップタイマーを設定することもできます。ステップタイマーは更新するジョブ実行にのみ適用されます。ジョブの実行を更新するたびに、このタイマーに新しい値を設定できます。[StartNextPendingJobExecution](https://docs.aws.amazon.com//iot/latest/apireference/API_iot-jobs-data_StartNextPendingJobExecution.html) を呼び出すときに、ステップタイマーを作成することもできます。ジョブの実行がステップタイマーの間隔より長い間、`IN_PROGRESS` ステータスのままになる場合、ジョブの実行は失敗し、終了ステータス `TIMED_OUT` に切り替わります。ステップタイマーは、ジョブの作成時に設定した進捗タイマーには影響を与えません。

`status` フィールドは、`IN_PROGRESS`､`SUCCEEDED`､または `FAILED` に設定できます。すでにターミナル状態になっているジョブの実行ステータスは更新できません。

## レポート実行の完了
<a name="jobs-job-completed"></a>

ジョブの実行が終了すると、デバイスは [UpdateJobExecution](jobs-mqtt-api.md#mqtt-updatejobexecution) MQTT API を呼び出します。ジョブが正常に行われた場合は、`status` を `SUCCEEDED` に設定し､メッセージペイロードの `statusDetails` にジョブに関する他の情報を名前と値のペアとして追加します。ジョブの実行が完了すると、進捗タイマーとステップタイマーが終了します。

以下に例を示します。

```
{
    "status":"SUCCEEDED",
    "statusDetails": {
        "progress":"100%"
    },
    "expectedVersion":"2",
    "clientToken":"client-001"
}
```

ジョブが失敗した場合は、`status` を `FAILED` に設定し、`statusDetails` に発生したエラーに関する情報を追加します。

```
{
    "status":"FAILED",
    "statusDetails": {
        "errorCode":"101",
        "errorMsg":"Unable to install update"
    },
    "expectedVersion":"2",
    "clientToken":"client-001"
}
```

**注記**  
`statusDetails` 属性には、任意の数の名前と値のペアを含めることができます。

AWS IoTジョブサービスは、この更新を受け取ると、 `$aws/things/MyThing/jobs/notify`トピックにメッセージを発行して、ジョブの実行が完了したことを示します。

```
{
    "timestamp":1476290692776,
    "jobs":{}
}
```

## その他のジョブ
<a name="jobs-additional-job"></a>

デバイスに対して保留中の他のジョブの実行がある場合、それらは `$aws/things/MyThing/jobs/notify` に公開されたメッセージに含まれます。

以下に例を示します。

```
{
    "timestamp":1476290692776,
    "jobs":{
        "QUEUED":[{
            "jobId":"0002",
            "queuedAt":1476290646230,
            "lastUpdatedAt":1476290646230
        }],
        "IN_PROGRESS":[{
            "jobId":"0003",
            "queuedAt":1476290646230,
            "lastUpdatedAt":1476290646230
        }]
    }
}
```