

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 管理任务
<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 SDKs](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)。

**提示**  
有关作业文档示例，请参阅软件 AWS IoT 开发工具包中的 [jobs-agent.js](https://www.npmjs.com/package/aws-iot-device-sdk#jobs-agentjs) 示例 JavaScript。

## 预签名 URLs
<a name="create-manage-jobs-presigned-URLs"></a>

您的任务文档可以包含指向您的代码文件（或其它文件）的预签名 Amazon S3 URL。预签名 Amazon S3 URLs 仅在有限的时间内有效，并且是在设备请求任务文档时生成的。因为在您创建任务文档时尚未创建预签名 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 的任务时 URLs，必须提供一个 IAM 角色。该角色必须授予从存储数据或更新的 Amazon S3 桶下载文件的权限。该角色还必须向 AWS IoT 授予代入角色的权限。

您可以为预签名 URL 指定可选的超时。有关更多信息，请参阅 [CreateJob](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateJob.html)。

**授予 AWS IoT Jobs 代入你的角色的权限**

1. 转到 [IAM 控制台的角色中心](https://console.aws.amazon.com/iamv2/home#/roles)，然后选择您的角色。

1. 在**信任关系**选项卡上，选择 **Edit Trust Relationship** （编辑信任关系），用以下 JSON 替换当前策略文档。选择**更新信任策略**。  
****  

   ```
   {
     "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:*`。请确保它*region*与您的 AWS IoT 地区相*account-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 中，您最多可以使用 `${thingName}`、`${jobId}` 和 `${executionNumber}` 中的两个作为 `key` 属性中的保留关键字。创建任务执行时，将解析并替换代表 `key` 属性中保留关键字的本地占位符。使用包含特定于每台设备的保留关键字的本地占位符，可确保从设备上传的每个文件都特定于该设备，并且不会被从同一任务部署的另一台目标设备上传的类似文件所覆盖。有关对任务部署期间用于上传文件的预签名 URL 占位符中的本地占位符进行问题排除的信息，请参阅 [一般错误消息疑难解答](software-package-catalog-troubleshooting.md#spc-general-troubleshooting)。

**注意**  
Amazon S3 存储桶名称不能包含代表已上传文件的保留关键字的本地占位符。本地占位符必须位于 `key` 属性中。

当设备收到预签名 URL 占位符时，该预签名 URL 占位符将在您的任务文档中转换为 Amazon S3 预签名上传 URL。您的设备将使用该 URL 将文件上传到目标 Amazon S3 存储桶。

**注意**  
如果上述占位符 URL 中未提供 Amazon S3 存储桶和密钥，则 AWS IoT Jobs 将最多使用 `${thingName}`、`${jobId}` 和 `${executionNumber}` 中的两个自动为每台设备生成一个密钥。

## 使用 Amazon S3 版本控制的预签名 URL
<a name="create-manage-jobs-presigned-URLs-versioning"></a>

保护存储在 Amazon S3 存储桶中的文件的完整性，对于确保使用该文件将任务安全部署到您的设备实例集至关重要。使用 Amazon S3 版本控制，您可以为存储在 Amazon S3 存储桶中的文件的每个变体添加版本标识符，以便跟踪文件的每个版本。这可以让您深入了解使用 AWS IoT 任务将哪个版本的文件部署到您的设备群中。有关使用版本控制的 Amazon S3 存储桶的更多信息，请参阅[在 Amazon S3 存储桶中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。

如果文件存储在 Amazon S3 中，并且任务文档包含预签名 URL 占位符，则 AWS IoT 任务将使用 Amazon S3 存储桶、存储桶密钥和存储在 Amazon S3 存储桶中的文件版本在任务文档中生成预签名 URL。在任务文档中生成的这个预签名 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，则它必须符合支持 AWS SDK for Java 2.x的 URL 编码。有关更多信息，请参阅[解析 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)
+ [预签名 URLs](#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)