

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 管理任務
<a name="create-manage-jobs"></a>

使用任務通知裝置軟體或韌體更新。您可以使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/)、[任務管理和控制 API 操作](jobs-management-control-api.md#jobs-http-api)、[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/reference/iot/index.html) 或 [AWS SDK](https://aws.amazon.com/tools/#sdk) 來建立和管理任務。

## 任務的程式碼簽署
<a name="create-manage-jobs-code-signing"></a>

 傳送程式碼至裝置時，若要讓裝置偵測程式碼在傳輸過程中是否遭到修改，我們建議您使用 AWS CLI對程式碼檔案進行簽署。如需相關說明，請參閱[使用 AWS CLI建立和管理任務](manage-job-cli.md)。

如需詳細資訊，請參閱[什麼是程式碼簽署 AWS IoT？](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html)。

## 任務文件
<a name="create-manage-jobs-job-doc"></a>

建立任務之前，您必須建立任務文件。如果您使用 的程式碼簽署 AWS IoT，則必須將任務文件上傳到版本控制的 Amazon S3 儲存貯體。如需建立 Amazon S3 儲存貯體並將檔案上傳至其中的詳細資訊，請參閱《Amazon S3 入門指南》**中的 [Amazon Simple Storage Service 入門](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)。

**提示**  
如需任務文件範例，請參閱適用於 JavaScript 的 AWS IoT SDK 中的 [job-agent.js](https://www.npmjs.com/package/aws-iot-device-sdk#jobs-agentjs) 範例。

## 預先簽章的 URL
<a name="create-manage-jobs-presigned-URLs"></a>

您的任務文件可以包含指向程式碼檔 (或其他檔案) 的預先簽章 Amazon S3 URL。預先簽章的 Amazon S3 URL 僅在有限的時間內有效，因此在裝置請求任務文件之後才會產生。由於建立任務文件時未建立預先簽章的 URL，所以請在任務文件中使用預留位置 URL。預留位置 URL 如下所示：

`${aws:iot:s3-presigned-url-v2:https://s3.region.amazonaws.com/<bucket>/<code file>}`

其中：
+ *bucket* 為含有程式碼檔案的 Amazon S3 儲存貯體。
+ *code file* 為程式碼檔案的 Amazon S3 金鑰。

當裝置請求任務文件時， AWS IoT 會產生預先簽章的 URL，並將預留位置 URL 取代為預先簽章的 URL。您的任務文件接著會傳送到裝置。

**IAM 角色授予從 S3 下載檔案的許可**  
當建立一個使用預先簽章 Amazon S3 URL 的任務時，您必須提供 IAM 角色。此角色必須授予自資料或更新儲存所在 Amazon S3 儲存貯體中下載檔案的許可。此角色也必須授與 AWS IoT 許可來擔任此角色。

您可指定預先簽章 URL 的選擇性逾時值。如需詳細資訊，請參閱 [CreateJob](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateJob.html)。

**授予 AWS IoT 任務擔任您角色的許可**

1. 前往 [IAM 主控台的角色中心](https://console.aws.amazon.com/iamv2/home#/roles)，然後選擇您的角色。

1. 在 **Trust Relationships** (信任關係) 索引標籤中，選擇 **Edit Trust Relationship** (編輯信任關係)，並將政策文件取代為以下 JSON。選擇 **Update Trust Policy** (更新信任政策)。  
****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "iot.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. 建議您新增全域條件內容金鑰 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 至政策，保護自己免受混淆代理人問題的困擾。
**重要**  
`aws:SourceArn` 必須符合以下格式：`arn:aws:iot:region:account-id:*`。請確定*區域*與您的 AWS IoT 區域相符，且*帳戶 ID* 與您的客戶帳戶 ID 相符。如需詳細資訊，請參閱[預防跨服務混淆代理人](cross-service-confused-deputy-prevention.md)。

   ```
   {
     "Effect": "Allow",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": 
             "iot.amazonaws.com"        
          },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals": {
               "aws:SourceAccount": "123456789012"
            },
            "ArnLike": {
                 "aws:SourceArn": "arn:aws:iot:*:123456789012:job/*"
            }
          }
        }
      ]
   }
   ```

1. 如果您的任務使用本身為 Amazon S3 物件的任務文件，請選擇**許可**並使用下列 JSON。這會新增一個政策，授予從 Amazon S3 儲存貯體下載檔案的許可。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::your_S3_bucket/*"
           }
       ]
   }
   ```

## 檔案上傳的預先簽章 URL
<a name="create-manage-jobs-presigned-URLs-upload"></a>

如果您的裝置需要在任務部署期間將檔案上傳至 Amazon S3 儲存貯體，則可以在任務文件中包含下列預先簽章的 URL 預留位置：

```
${aws:iot:s3-presigned-url-upload:https://s3.region.amazonaws.com/<bucket>/<key>} 
```

您可以在任務文件中的檔案上傳預留位置 URL 中的 `key` 屬性內`${jobId}`，使用每個 `${thingName}`、 和 中最多兩個`${executionNumber}`預留關鍵字。建立任務執行時，將剖析和取代代表 `key` 屬性中預留關鍵字的本機預留位置。使用本機預留位置搭配每個裝置特有的預留關鍵字，可確保從裝置上傳的每個檔案都是該裝置特有的，而不會被相同任務部署所針對之其他裝置的類似上傳檔案覆寫。如需預先簽章的 URL 預留位置中本機預留位置的故障診斷資訊，以便在任務部署期間上傳檔案，請參閱 [對錯誤訊息進行一般故障診斷](software-package-catalog-troubleshooting.md#spc-general-troubleshooting)。

**注意**  
Amazon S3 儲存貯體名稱不能包含代表所上傳檔案預留關鍵字的本機預留位置。本機預留位置必須位於 `key` 屬性中。

此預先簽章的 URL 預留位置會在裝置收到時轉換為任務文件中的 Amazon S3 預先簽章上傳 URL。您的裝置將使用此功能將檔案上傳至目的地 Amazon S3 儲存貯體。

**注意**  
當上述預留位置 URL 中未提供 Amazon S3 儲存貯體和金鑰時， AWS IoT Jobs 會自動為每個裝置產生金鑰`${jobId}`，每個裝置最多使用兩個 `${thingName}`、 和 `${executionNumber}`。

## 使用 Amazon S3 版本控制的預先簽章 URL
<a name="create-manage-jobs-presigned-URLs-versioning"></a>

保護存放在 Amazon S3 儲存貯體中檔案的完整性對於確保使用該檔案對裝置機群進行安全任務部署至關重要。透過使用 Amazon S3 版本控制，您可以為存放在 Amazon S3 儲存貯體中的檔案的每個變體新增版本識別符，以追蹤檔案的每個版本。這可讓您深入了解使用 AWS IoT Jobs 部署到裝置機群的檔案版本。如需使用版本控制之 Amazon S3 儲存貯體的詳細資訊，請參閱[在 Amazon S3 儲存貯體中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。

如果檔案存放在 Amazon S3 中，且任務文件包含預先簽章的 URL 預留位置， AWS IoT Jobs 將使用存放在 Amazon S3 儲存貯體中的檔案的 Amazon S3 儲存貯體、儲存貯體金鑰和版本，在任務文件中產生預先簽章的 URLAmazon S3。任務文件中產生的此預先簽章 URL 將取代任務文件中最初的預先簽章 URL 預留位置。如果您更新存放在 Amazon S3 儲存貯體中的檔案，`versionId`則會建立新的檔案版本和後續版本，以表示所做的更新，並提供在未來任務部署中以該特定檔案為目標的能力。

請參閱下列範例，了解使用 在任務文件中尋找 Amazon S3 預先簽章URLs 之前和期間`versionId`：

**Amazon S3 預先簽章的 URL 預留位置 （在任務部署之前）**

```
//Virtual-hosted style URL
${aws:iot:s3-presigned-url-v2:https://bucket-name.s3.region-code.amazonaws.com/key-name%3FversionId%3Dversion-id}

//Path-style URL
${aws:iot:s3-presigned-url-v2:https://s3.region-code.amazonaws.com/bucket-name/key-name%3FversionId%3Dversion-id}
```

**Amazon S3 預先簽章 URL （在任務部署期間）**

```
//Virtual-hosted style URL
${aws:iot:s3-presigned-url-v2:https://sample-bucket-name.s3.us-west-2.amazonaws.com/sample-code-file.png%3FversionId%3Dversion1}

//Path-style
${aws:iot:s3-presigned-url-v2:https://s3.us-west-2.amazonaws.com/sample-bucket-name/sample-code-file.png%3FversionId%3Dversion1}
```

如需 Amazon S3 虛擬託管和路徑樣式物件 URLs 的詳細資訊，請參閱[Virtual-hosted-style請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#virtual-hosted-style-access)和[路徑樣式請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#path-style-access)。

**注意**  
如果您想要附加`versionId`到 Amazon S3 預先簽章的 URL，則必須符合支援的 URL 編碼 AWS SDK for Java 2.x。如需詳細資訊，請參閱[剖析 Amazon S3 URIs 從版本 1 到版本 2 的變更](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration-s3-uri-parser.html#migration-3-uri-parser-api-changes)。

**Amazon S3 預先簽章的 URL 預留位置版本差異**

下列清單概述 Amazon S3 預先簽章的 URL 預留位置 `${aws:iot:s3-presigned-url-v1`（第 1 版） 和 `${aws:iot:s3-presigned-url-v2`（第 2 版） 之間的差異：
+  Amazon S3 預先簽章的 URL 預留位置`${aws:iot:s3-presigned-url-v1`不支援 `version-id`。
+ Amazon S3 預先簽章的 URL 預留位置`${aws:iot:s3-presigned-url-v1`會收到未編碼的 Amazon S3 URL。Amazon S3 預先簽章 URL 預留位置`${aws:iot:s3-presigned-url-v2`需要對 Amazon S3 URL 進行編碼，以符合 Amazon S3 SDK 標準。

**Topics**
+ [任務的程式碼簽署](#create-manage-jobs-code-signing)
+ [任務文件](#create-manage-jobs-job-doc)
+ [預先簽章的 URL](#create-manage-jobs-presigned-URLs)
+ [檔案上傳的預先簽章 URL](#create-manage-jobs-presigned-URLs-upload)
+ [使用 Amazon S3 版本控制的預先簽章 URL](#create-manage-jobs-presigned-URLs-versioning)
+ [使用 建立和管理任務 AWS 管理主控台](manage-job-console.md)
+ [使用 建立和管理任務 AWS CLI](manage-job-cli.md)

# 使用 建立和管理任務 AWS 管理主控台
<a name="manage-job-console"></a>

本節說明如何從 AWS IoT 主控台建立和管理任務。建立任務之後，您可以在詳細資訊頁面上檢視任務的相關資訊，並管理任務。

**注意**  
如果您想要為 AWS IoT 任務執行程式碼簽署，請使用 AWS CLI。如需詳細資訊，請參閱[使用 建立和管理任務 AWS CLI](manage-job-cli.md)。

**Topics**
+ [使用 建立管理任務 AWS 管理主控台](#create-job-console)
+ [使用 檢視和管理任務 AWS 管理主控台](#view-manage-job-console)

## 使用 建立管理任務 AWS 管理主控台
<a name="create-job-console"></a>

若要建立任務，請登入 AWS IoT 主控台，然後前往**遠端動作**區段中的[任務中樞](https://console.aws.amazon.com/iot/home#/jobhub)。然後，執行下列步驟。

1. 在**任務**頁面上**的任務**對話方塊中，選擇**建立任務**。

1. 視您使用的裝置而定，您可以建立自訂任務、FreeRTOS OTA 更新任務或 AWS IoT Greengrass 任務。在此範例中，請選擇 **Create a custom job** (建立自訂任務)。選擇**下一步**。

1. 在 **Custom job properties**(自訂任務屬性) 頁面的 **Job properties** (任務屬性) 對話方塊中，輸入下列各欄資訊：
   + **Name** (姓名)：輸入任務的唯一英數名稱。
   + **Description - optional ** (說明 - 選擇性)：輸入有關任務的選擇性說明。
   + **標籤 – 選用**：
**注意**  
建議您不要在任務 ID 和描述中使用個人識別資訊。

   選擇**下一步**。

1. 在 **Job targets** (任務 目標) 對話方塊的 **File configuration** (檔案組態) 頁面上，選取要執行此任務的**Things** (物件) 或 **Thing groups** (物件群組)。

   在 **Job document** (任務文件) 對話方塊中選取下列其中一個選項：
   + **From file** (從檔案)：您先前上傳至 Amazon S3 儲存貯體的 JSON 任務檔案。
     + **程式碼簽署**

       在 Amazon S3 URL 中的任務文件中，`${aws:iot:code-sign-signature:s3://region.bucket/code-file@code-file-version-id}` 必須做為預留位置，直到使用**程式碼簽署設定檔**將其取代為已簽署的程式碼檔案路徑為止。新簽署的程式碼檔案一開始會出現在 Amazon S3 來源儲存貯體的 `SignedImages` 資料夾中。系統會建立包含 `Codesigned_` 字首的新任務文件，其中包含已簽署的程式碼檔案路徑取代程式碼簽署預留位置，且放置在 Amazon S3 URL 中以建立新任務。
     + **預先簽署資源 URL**

       在**預先簽署角色**下拉式清單中，選擇您在[預先簽署 URL](https://docs.aws.amazon.com/iot/latest/developerguide/create-manage-jobs.html#create-manage-jobs-presigned-URLs) 中建立的 IAM 角色。對於從 Amazon S3 下載物件的裝置，對位於 Amazon S3 中的物件使用 `${aws:iot:s3-presigned-url:` 預先簽署 URL 是最佳安全實務。

       如果您想將預先簽署的 URL 用於程式碼簽署預留位置，請使用下列範例範本：

       ```
           ${aws:iot:s3-presigned-url:${aws:iot:code-sign-signature:<S3 URL>}
       ```
   + **From template** (從範本)：包含任務文件和任務組態的任務範本。任務範本可以是您建立的自訂任務範本或 AWS 受管範本。

      如果您要建立執行常用遠端動作的任務，例如重新啟動裝置，您可以使用 AWS 受管範本。這些範本已預先設定，可供使用。如需詳細資訊，請參閱[建立自訂任務範本](job-templates-console.md#job-templates-console-create)及[從受管範本建立自訂任務範本](job-template-manage-console-create.md#job-template-manage-create-template)。

1. 在 **Job configuration** (任務組態) 對話方塊的 **Job configuration** (任務組態) 頁面上，選取下列其中一種任務類型：
   + **快照任務**：快照任務在目標裝置和群組上完成執行後即完成。
   + **連續任務**：連續任務適用於物件群組，並在稍後新增至所指定目標群組的任何裝置上執行。

1. 在 **Additional configurations - optional** (其他組態 - 選擇性) 對話方塊中，檢閱下列選擇性任務組態，並視需要進行選擇：
   + **推展組態**
   + **Scheduling configuration** (排程組態)
   + **任務執行逾時組態**
   + **Job executions retry configuration - new** (任務執行重試組態 - 新增)
   + **中止組態**

   如需有關任務組態的其他資訊，請參閱下列各節：
   + [任務推展、排程和中止組態](jobs-configurations-details.md#job-rollout-abort-scheduling)
   + [任務執行逾時和重試組態](jobs-configurations-details.md#job-timeout-retry)

   檢閱所有任務選項，然後選擇 **Submit** (提交) 以建立任務。

## 使用 檢視和管理任務 AWS 管理主控台
<a name="view-manage-job-console"></a>

建立任務後，主控台會產生 JSON 簽章，並將其放置在您的任務文件中。您可以使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/)來檢視狀態，或取消、刪除任務。

如果您選擇您建立的任務，您可以找到：
+ 一般任務詳細資訊，例如任務名稱、描述、類型、建立時間、上次更新時間，以及預估的開始時間。
+ 您指定的任何任務組態及其狀態。
+ 工作文件。
+ 任務執行和您指定的任何選用標籤。

若要管理任務，請前往[主控台的任務中樞](https://console.aws.amazon.com/iot/home#/jobhub)，然後選擇是否要編輯、刪除或取消任務。

# 使用 建立和管理任務 AWS CLI
<a name="manage-job-cli"></a>

本節說明如何建立和管理任務。

## 建立任務
<a name="create-job"></a>

若要建立 AWS IoT 任務，請使用 **CreateJob**命令。任務會排入所指定目標 (物件或物件群組) 的執行佇列。若要建立 AWS IoT 任務，您需要可以包含在請求內文中的任務文件，或做為 Amazon S3 文件的連結。如果任務包含使用預先簽章的 Amazon S3 URLs 下載檔案，您需要 IAM 角色 Amazon Resource Name (ARN)，其具有下載檔案的許可，並授予 AWS IoT Jobs 服務擔任該角色的許可。

如需使用 API 命令或 輸入日期和時間時語法的詳細資訊 AWS CLI，請參閱[時間戳記](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-types.html#parameter-type-timestamp)。

### 使用任務進行程式碼簽署
<a name="code-signing-with-jobs"></a>

如果您使用 的程式碼簽署 AWS IoT，則必須啟動程式碼簽署任務，並在任務文件中包含輸出。這會取代任務文件中的程式碼簽署簽章預留位置，在使用**程式碼簽署設定檔**將其替換為已簽署程式碼檔案路徑之前，這個預留位置是必要的。程式碼簽署簽章預留位置將如下所示：

```
    ${aws:iot:code-sign-signature:s3://region.bucket/code-file@code-file-version-id}
```

使用 [start-signing-job](https://docs.aws.amazon.com/signer/latest/developerguide/api-startsigningjob.html) 命令來建立程式碼簽署任務。`start-signing-job` 會傳回任務 ID。若要取得存放簽章的 Amazon S3 位置，請使用 **describe-signing-job** 命令。然後，您可以從 Amazon S3 下載簽章。如需程式碼簽署任務的詳細資訊，請參閱[適用於 AWS IoT的程式碼簽署](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html)。

您的任務文件必須包含程式碼檔的預先簽章 URL 預留位置，以及使用在 **start-signing-job** 命令放置在 Amazon S3 儲存貯體的 JSON 簽章輸出：

```
{
    "presign": "${aws:iot:s3-presigned-url:https://s3.region.amazonaws.com/bucket/image}",
}
```

### 使用任務文件建立任務
<a name="create-job-with-document"></a>

下列命令顯示如何使用 Amazon S3 儲存貯體 (*jobBucket*) 中存放的任務文件 (*job-document.json*) 來建立任務，以及建立有權從 Amazon S3 下載檔案的角色 (*S3DownloadRole*)。

```
aws iot create-job  \
      --job-id 010  \
      --targets arn:aws:iot:us-east-1:123456789012:thing/thingOne  \
      --document-source https://s3.amazonaws.com/amzn-s3-demo-bucket/job-document.json  \
      --timeout-config inProgressTimeoutInMinutes=100 \
      --job-executions-rollout-config "{ \"exponentialRate\": { \"baseRatePerMinute\": 50, \"incrementFactor\": 2, \"rateIncreaseCriteria\": { \"numberOfNotifiedThings\": 1000, \"numberOfSucceededThings\": 1000}}, \"maximumPerMinute\": 1000}" \
      --abort-config "{ \"criteriaList\": [ { \"action\": \"CANCEL\", \"failureType\": \"FAILED\", \"minNumberOfExecutedThings\": 100, \"thresholdPercentage\": 20}, { \"action\": \"CANCEL\", \"failureType\": \"TIMED_OUT\", \"minNumberOfExecutedThings\": 200, \"thresholdPercentage\": 50}]}" \          
      --presigned-url-config "{\"roleArn\":\"arn:aws:iam::123456789012:role/S3DownloadRole\", \"expiresInSec\":3600}"
```

任務在 *thingOne* 執行。

選用的 `timeout-config` 參數，會指定每個裝置必須完成其任務執行的時間。任務執行狀態設定為 `IN_PROGRESS` 時，計時器即會開始。在時間過期之前，如果任務執行狀態未設定為其他終止狀態，就會將其設定為 `TIMED_OUT`。

進行中的計時器無法更新，並會套用到任務的所有任務執行。每當任務執行保持 `IN_PROGRESS` 狀態超過此間隔時，就會失敗並切換到終端機`TIMED_OUT`狀態。 AWS IoT 也會發佈 MQTT 通知。

如需建立任務推展和中止組態的詳細資訊，請參閱[任務推展和中止組態](job-rollout-abort.html)。

**注意**  
指定為 Amazon S3 檔案的任務文件會在您建立任務時擷取。如果您在建立任務文件後變更了作為任務文件來源的 Amazon S3 檔案的內容，則傳送到任務目標的內容不會變更。

## 更新任務
<a name="update-job"></a>

若要更新任務，請使用 **UpdateJob** 命令。您可以更新任務的 `description`、`presignedUrlConfig`、`jobExecutionsRolloutConfig`、`abortConfig` 和 `timeoutConfig` 欄位。

```
aws iot update-job  \
  --job-id 010  \
  --description "updated description" \
  --timeout-config inProgressTimeoutInMinutes=100 \
  --job-executions-rollout-config "{ \"exponentialRate\": { \"baseRatePerMinute\": 50, \"incrementFactor\": 2, \"rateIncreaseCriteria\": { \"numberOfNotifiedThings\": 1000, \"numberOfSucceededThings\": 1000}, \"maximumPerMinute\": 1000}}" \
  --abort-config "{ \"criteriaList\": [ { \"action\": \"CANCEL\", \"failureType\": \"FAILED\", \"minNumberOfExecutedThings\": 100, \"thresholdPercentage\": 20}, { \"action\": \"CANCEL\", \"failureType\": \"TIMED_OUT\", \"minNumberOfExecutedThings\": 200, \"thresholdPercentage\": 50}]}" \          
  --presigned-url-config "{\"roleArn\":\"arn:aws:iam::123456789012:role/S3DownloadRole\", \"expiresInSec\":3600}"
```

如需詳細資訊，請參閱[任務推展和中止組態](job-rollout-abort.html)。

## 取消任務
<a name="cancel-job"></a>

若要取消任務，請使用 **CancelJob** 命令。取消任務 AWS IoT 會停止推出任務的任何新任務執行。它也會取消處於 `QUEUED` 狀態的任何任務執行。 會 AWS IoT 保留任何處於結束狀態的任務執行，因為裝置已完成任務。如果任務執行的狀態為 `IN_PROGRESS`，則該任務執行也將維持不變，除非您使用選用的 `--force` 參數。

以下命令說明如何使用 ID 010 來取消任務。

```
aws iot cancel-job --job-id 010
```

該命令會顯示下列輸出：

```
{
    "jobArn": "string",
    "jobId": "string",
    "description": "string"
}
```

當您取消任務時，狀態為 `QUEUED` 的任務執行將會遭到取消。處於 `IN_PROGRESS` 狀態的任務執行會遭到取消，前提是您指定了可選 `--force` 參數。處於結束狀態的任務執行不會取消。

**警告**  
取消狀態為 `IN_PROGRESS` (透過設定 `--force` 參數) 的任務將取消任何進行中的任務執行，並導致正在執行任務的裝置無法更新任務執行狀態。請謹慎執行，並確認每個裝置所執行的已取消任務可以復原至有效狀態。

已取消任務或其其中一個任務執行的狀態最終是一致的。 會停止盡快將該任務的新任務執行和任務`QUEUED`執行 AWS IoT 排程到裝置。將任務執行的狀態變更為 `CANCELED` (取消) 可能會需要一些時間，視裝置數量及其他因素而定。

如果任務由於符合 `AbortConfig` 物件定義的條件而被取消，則服務新增自動填入 `comment` 和 `reasonCode` 欄位的值。當任務取消是由使用者驅動時，您可以建立自己的 `reasonCode` 值。

## 取消任務執行
<a name="cancel-job-execution"></a>

若要取消裝置上的任務執行，請使用 **CancelJobExecution** 命令。這麼做會取消狀態為 `QUEUED` 的任務執行。如果想取消進行中的任務執行，您必須使用 `--force` 參數。

以下命令說明如何從 `myThing` 上執行的任務 010 取消任務執行。

```
aws iot cancel-job-execution --job-id 010 --thing-name myThing
```

此命令不會顯示輸出。

系統會取消狀態為 `QUEUED` 的任務執行。處於 `IN_PROGRESS` 狀態的任務執行會遭到取消，前提是您指定了可選 `--force` 參數。處於結束狀態的任務執行無法被取消。

**警告**  
取消狀態為 `IN_PROGRESS` 的任務執行時，將導致裝置無法更新任務執行狀態。請謹慎使用並確保裝置可以還原為有效狀態。

如果任務執行處於終端狀態，或如果任務執行處於 `IN_PROGRESS` 狀態且 `--force` 參數未設定為 `true`，此命令會導致 `InvalidStateTransitionException`。

取消的任務執行之狀態最終會保持一致。將任務執行的狀態變更為 `CANCELED` 可能會需要一些時間，依不同因素而定。

## 刪除任務
<a name="delete-job"></a>

若要刪除任務及其任務執行，請使用 **DeleteJob** 命令。依預設，您只能刪除處於結束狀態 (`SUCCEEDED` 或 `CANCELED`) 的任務。否則會發生例外狀況。不過，只在 `IN_PROGRESS` 參數設定為 `force` 時，您才能刪除處於 `true` 狀態的任務。

若要刪除任務，請執行下列命令：

```
aws iot delete-job --job-id 010 --force|--no-force
```

此命令不會顯示輸出。

**警告**  
刪除狀態為 `IN_PROGRESS` 的任務時，正在部署任務的裝置將無法存取任務資訊或更新任務執行狀態。請謹慎執行，並確保每個裝置所部署的已刪除任務可以復原至有效狀態。

刪除任務可能會需要一些時間，根據為任務建立的任務執行數量與其他因素而定。在刪除任務期間，任務狀態會顯示為「`DELETION_IN_PROGRESS`」。如果嘗試刪除或取消狀態已為 `DELETION_IN_PROGRESS` 的任務將會導致錯誤。

只有 10 個任務可以同時具有 `DELETION_IN_PROGRESS` 狀態。否則會發生 `LimitExceededException`。

## 取得任務文件
<a name="get-job-document"></a>

若要從任務中擷取任務文件，請使用 **GetJobDocument** 命令。任務文件為由裝置執行遠端操作的描述。

若要取得取得任務文件，請執行下列命令：

```
aws iot get-job-document --job-id 010
```

此命令會傳回指定任務的任務文件：

```
{
    "document": "{\n\t\"operation\":\"install\",\n\t\"url\":\"http://amazon.com/firmWareUpate-01\",\n\t\"data\":\"${aws:iot:s3-presigned-url:https://s3.amazonaws.com/amzn-s3-demo-bucket/datafile}\"\n}"
}
```

**注意**  
在使用此命令擷取任務文件時，預留位置 URL 並不會被預先簽章的 Amazon S3 URL 取代。當裝置呼叫 [GetPendingJobExecutions](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-jobs-data_GetPendingJobExecutions.html) API 操作時，預留位置 URL 才會被任務文件中的預先簽章 Amazon S3 URL 取代。

## 列出任務
<a name="list-jobs"></a>

若要取得 中所有任務的清單 AWS 帳戶，請使用 **ListJobs**命令。任務資料和任務執行資料會保留一段[有限的時間](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#job-limits)。執行下列命令來列出 中的所有任務 AWS 帳戶：

```
aws iot list-jobs
```

此命令會傳回您帳戶中所有任務，並依任務狀態排序：

```
{
    "jobs": [
        {
            "status": "IN_PROGRESS", 
            "lastUpdatedAt": 1486687079.743, 
            "jobArn": "arn:aws:iot:us-east-1:123456789012:job/013", 
            "createdAt": 1486687079.743, 
            "targetSelection": "SNAPSHOT",
            "jobId": "013"
        }, 
        {
            "status": "SUCCEEDED", 
            "lastUpdatedAt": 1486685868.444, 
            "jobArn": "arn:aws:iot:us-east-1:123456789012:job/012", 
            "createdAt": 1486685868.444, 
            "completedAt": 148668789.690,
            "targetSelection": "SNAPSHOT",
            "jobId": "012"
        }, 
        {
            "status": "CANCELED", 
            "lastUpdatedAt": 1486678850.575, 
            "jobArn": "arn:aws:iot:us-east-1:123456789012:job/011", 
            "createdAt": 1486678850.575, 
            "targetSelection": "SNAPSHOT",
            "jobId": "011"
        }
    ]
}
```

## 描述任務
<a name="describe-job"></a>

若要取得任務的狀態，請執行 **DescribeJob** 命令。以下命令說明如何描述任務：

```
$ aws iot describe-job --job-id 010
```

此命令會傳回指定任務的狀態。例如：

```
{
    "documentSource": "https://s3.amazonaws.com/amzn-s3-demo-bucket/job-document.json", 
    "job": {
        "status": "IN_PROGRESS", 
        "jobArn": "arn:aws:iot:us-east-1:123456789012:job/010", 
        "targets": [
            "arn:aws:iot:us-east-1:123456789012:thing/myThing"
        ], 
        "jobProcessDetails": {
            "numberOfCanceledThings": 0, 
            "numberOfFailedThings": 0,
            "numberOfInProgressThings": 0,
            "numberOfQueuedThings": 0,
            "numberOfRejectedThings": 0,
            "numberOfRemovedThings": 0,
            "numberOfSucceededThings": 0,
            "numberOfTimedOutThings": 0,
            "processingTargets": [
                arn:aws:iot:us-east-1:123456789012:thing/thingOne, 
                arn:aws:iot:us-east-1:123456789012:thinggroup/thinggroupOne, 
                arn:aws:iot:us-east-1:123456789012:thing/thingTwo, 
                arn:aws:iot:us-east-1:123456789012:thinggroup/thinggroupTwo 
            ]
        }, 
        "presignedUrlConfig": {
            "expiresInSec": 60, 
            "roleArn": "arn:aws:iam::123456789012:role/S3DownloadRole"
        }, 
        "jobId": "010", 
        "lastUpdatedAt": 1486593195.006, 
        "createdAt": 1486593195.006,
        "targetSelection": "SNAPSHOT",
        "jobExecutionsRolloutConfig": { 
            "exponentialRate": { 
                "baseRatePerMinute": integer,
                "incrementFactor": integer,
                "rateIncreaseCriteria": { 
                    "numberOfNotifiedThings": integer, // Set one or the other
                    "numberOfSucceededThings": integer // of these two values.
                },
            "maximumPerMinute": integer
         }
        },    
        "abortConfig": { 
            "criteriaList": [ 
                { 
                    "action": "string",
                    "failureType": "string",
                    "minNumberOfExecutedThings": integer,
                    "thresholdPercentage": integer
                }
            ]
        },
        "timeoutConfig": { 
           "inProgressTimeoutInMinutes": number
          }
    }
}
```

## 列出任務的執行
<a name="list-job-executions-for-job"></a>

任務執行物件代表在特定裝置上運作的任務。執行 **ListJobExecutionsForJob** 命令以列出任務中的所有任務執行。以下顯示如何列出任務執行：

```
aws iot list-job-executions-for-job --job-id 010
```

此命令會傳回一份任務執行清單：

```
{
    "executionSummaries": [
    {
        "thingArn": "arn:aws:iot:us-east-1:123456789012:thing/thingOne", 
        "jobExecutionSummary": {
            "status": "QUEUED", 
            "lastUpdatedAt": 1486593196.378, 
            "queuedAt": 1486593196.378,
            "executionNumber": 1234567890
        }
    },
    {
        "thingArn": "arn:aws:iot:us-east-1:123456789012:thing/thingTwo", 
        "jobExecutionSummary": {
            "status": "IN_PROGRESS", 
            "lastUpdatedAt": 1486593345.659, 
            "queuedAt": 1486593196.378,
            "startedAt": 1486593345.659,
            "executionNumber": 4567890123
        }
    }
    ]
}
```

## 列出物件的任務執行
<a name="list-job-executions-for-thing"></a>

執行 **ListJobExecutionsForThing** 命令以列出在物件上運作的所有任務執行。以下顯示如何列出物件的任務執行：

```
aws iot list-job-executions-for-thing --thing-name thingOne
```

此命令會傳回一份清單，列出特定物件上正在運作或已經運作的任務執行：

```
{
    "executionSummaries": [
    {
        "jobExecutionSummary": {
            "status": "QUEUED", 
            "lastUpdatedAt": 1486687082.071, 
            "queuedAt": 1486687082.071,
            "executionNumber": 9876543210
        }, 
        "jobId": "013"
    }, 
    {
        "jobExecutionSummary": {
            "status": "IN_PROGRESS",
            "startAt": 1486685870.729, 
            "lastUpdatedAt": 1486685870.729, 
            "queuedAt": 1486685870.729,
            "executionNumber": 1357924680
        }, 
        "jobId": "012"
    }, 
    {
        "jobExecutionSummary": {
            "status": "SUCCEEDED", 
            "startAt": 1486678853.415,
            "lastUpdatedAt": 1486678853.415, 
            "queuedAt": 1486678853.415,
            "executionNumber": 4357680912
        }, 
        "jobId": "011"
    }, 
    {
        "jobExecutionSummary": {
            "status": "CANCELED",
            "startAt": 1486593196.378,
            "lastUpdatedAt": 1486593196.378, 
            "queuedAt": 1486593196.378,
            "executionNumber": 2143174250
        }, 
        "jobId": "010"
    }
    ]
}
```

## 描述任務執行
<a name="describe-job-execution"></a>

執行 **DescribeJobExecution** 命令以取得任務執行的狀態。您必須指定任務 ID 及物件名稱，或者可選擇是否指定執行編號來識別任務執行。以下顯示如何描述任務執行：

```
aws iot describe-job-execution --job-id 017 --thing-name thingOne
```

此命令會傳回 [https://docs.aws.amazon.com/iot/latest/apireference/API_JobExecution.html](https://docs.aws.amazon.com/iot/latest/apireference/API_JobExecution.html)。例如：

```
{
    "execution": {
        "jobId": "017", 
        "executionNumber": 4516820379,
        "thingArn": "arn:aws:iot:us-east-1:123456789012:thing/thingOne", 
        "versionNumber": 123,
        "createdAt": 1489084805.285, 
        "lastUpdatedAt": 1489086279.937, 
        "startedAt": 1489086279.937, 
        "status": "IN_PROGRESS",
        "approximateSecondsBeforeTimedOut": 100,
        "statusDetails": {
            "status": "IN_PROGRESS", 
            "detailsMap": {
                "percentComplete": "10"
            }
        }
    }
}
```

## 刪除任務執行
<a name="delete-job-execution"></a>

執行 **DeleteJobExecution** 命令以刪除任務執行。必須指定任務 ID (物件名稱) 和執行編號來識別任務執行。以下顯示如何刪除任務執行：

```
aws iot delete-job-execution --job-id 017 --thing-name thingOne --execution-number 1234567890 --force|--no-force
```

此命令不會顯示輸出。

根據預設，任務執行的狀態必須為 `QUEUED` 或處於終端狀態 (`SUCCEEDED`、`FAILED`、`REJECTED`、`TIMED_OUT`、`REMOVED` 或 `CANCELED`)。否則會發生錯誤。若要刪除狀態為 `IN_PROGRESS` 的任務執行，您可以將 `force` 參數設為 `true`。

**警告**  
當您刪除狀態為 `IN_PROGRESS` 的任務執行時，正在執行任務的裝置將無法存取任務資訊或更新任務執行狀態。請謹慎使用並確保裝置可以還原為有效狀態。