

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

# 管理任務
<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)