

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

# 使用 IDT 运行 AWS IoT Greengrass 资格套件
<a name="idt-greengrass-qualification"></a>

您可以使用 AWS IoT Device Tester AWS IoT Greengrass V2 来验证 C AWS IoT Greengrass ore 软件是否在您的硬件上运行并且可以与通信。 AWS 云它还使用执行 end-to-end测试 AWS IoT Core。例如，其将验证您的设备能否部署组件并进行升级。

除了测试设备外，IDT f AWS IoT Greengrass or V2 还会在中创建资源（例如， AWS IoT 事物、群组等）， AWS 账户 以简化认证流程。

<a name="idt-aws-credentials"></a>要创建这些资源，适用于 AWS IoT Greengrass V2 的 IDT 使用`config.json`文件中配置的 AWS 凭据代表您进行 API 调用。这些资源将在测试过程的不同时间进行预置。

当您使用 IDT f AWS IoT Greengrass or V2 运行 AWS IoT Greengrass 资格套件时，它会执行以下步骤：

1. 加载和验证您的设备和凭证配置。

1. 使用所需的本地资源和云资源执行选定测试。

1. 清除本地资源和云资源。

1. 生成测试报告，指明您的主板是否已通过资格认证所需的测试。

## 测试套件版本
<a name="idt-test-suite-versions"></a>

IDT for AWS IoT Greengrass V2 将测试组织到测试套件和测试组中。<a name="idt-test-suites-groups"></a>
+ 测试套件是一组测试组，用于验证设备运行的是否为特定版本的 AWS IoT Greengrass。
+ 测试组是与特定功能相关的一组单独测试，例如组件部署。

测试套件使用 `major.minor.patch` 格式（例如 `GGV2Q_1.0.0`）进行版本控制。当您下载 IDT 时，数据包中包含最新的 Greengrass 资格认证套件版本。

**重要**  
不受支持的测试套件版本进行的测试对于设备资格认证无效。IDT 不会为不受支持的版本打印资格认证报告。有关更多信息，请参阅 [适用于 AWS IoT Device Tester 的 AWS IoT Greengrass 的支持策略](idt-support-policy.md)。  
您可以运行列`list-supported-products`出当前版本的 IDT 支持的版本 AWS IoT Greengrass 和测试套件。

## 测试组描述
<a name="dt-test-groups"></a>

**核心资格必备测试组**  
这些测试组必须使您的 AWS IoT Greengrass V2 设备符合 AWS Partner 设备目录的资格。    
Core 依赖关系  
验证设备是否满足 AWS IoT Greengrass Core 软件的所有软硬件要求。该测试组包括以下测试用例：    
Java 版本  
检查被测设备上是否安装了所需的 Java 版本。 AWS IoT Greengrass 需要 Java 8 或更高版本。  
PreTest 验证  
检查设备是否满足运行测试的软件要求。  
+ 对于基于 Linux 的设备，此测试将检查设备是否可以运行以下 Linux 命令：

  `chmod`, `cp`, `echo`, `grep`, `kill`, `ln`, `mkinfo`, `ps`, `rm`, `sh`, `uname` 
+ 对于基于 Windows 的设备，此测试会检查设备是否安装了以下 Microsoft 软件：

  [Powershell](https://learn.microsoft.com/en-us/powershell/?view=powershell-7.1) [v5.1 或更高版本、[.NET](https://learn.microsoft.com/en-us/dotnet/) v4.6.1 或更高版本、V [isual C\$1\$1](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170) 2017 或更高版本、实用 PsExec](https://learn.microsoft.com/en-us/sysinternals/downloads/psexec)  
版本检查程序  
检查所 AWS IoT Greengrass 提供的版本是否与您正在使用的 AWS IoT 设备测试器版本兼容。  
组件  
验证设备是否可以部署组件并对其进行升级。该测试组包括以下测试：    
云组件  
验证云组件的设备功能。  
本地组件  
验证本地组件的设备功能。  
Lambda  
此测试不适用于基于 Windows 的设备。  
验证设备是否可以部署使用 Java 运行时的 Lambda 函数组件，以及 Lambda 函数是否可以 AWS IoT Core 使用 MQTT 主题作为工作消息的事件源。  
MQTT  
验证设备是否可以订阅和发布 AWS IoT Core MQTT 主题。

**可选测试组**  
这些测试组是可选的，仅用于符合条件的基于 Linux 的 Greengrass 核心设备。如果您选择符合可选测试的资格，则您的设备将在 AWS Partner 设备目录中列出其他功能。  
Docker 依赖关系  
<a name="description-docker"></a>验证设备是否满足使用 AWS提供的 Docker 应用程序管理器 () `aws.greengrass.DockerApplicationManager` 组件所需的所有技术依赖项。  
Docker 应用程序管理器资格认证  
<a name="description-docker-app-manager-qual"></a>验证<a name="description-docker-app-manager-qual-phrase"></a>设备是否可以从 Amazon ECR 下载 Docker 容器镜像。  
机器学习依赖关系  
只有 IDT v4.9.3 支持机器学习可选测试组。
<a name="description-ml"></a>验证设备是否满足使用 AWS提供的机器学习 (ML) 组件所需的所有技术依赖项。  
机器学习推理测试  
只有 IDT v4.9.3 支持机器学习可选测试组。
<a name="description-ml-inference"></a><a name="description-ml-inference-phrase"></a>验证设备是否可以使用[深度学习运行时](https://github.com/neo-ai/neo-ai-dlr)和 L [TensorFlow ite](https://www.tensorflow.org/lite/guide/python) ML 框架执行 ML 推理。  
流管理器依赖关系  
只有 IDT v4.9.3 支持流管理器可选测试组。
<a name="description-sm"></a>验证设备是否可以下载、安装和运行 [AWS IoT Greengrass 流管理器](manage-data-streams.md)。  
硬件安全性集成 (HSI)  
该测试仅在 IDT v4.9.3 及更高版本中适用于基于 Linux 的设备。 AWS IoT Greengrass 目前不支持 Windows 设备的硬件安全集成。
<a name="description-hsi"></a>验证设备是否可以使用存储在硬件安全模块 (HSM) 中的私钥和证书对与和 AWS IoT Greengrass 服务的连接进行身份验证。 AWS IoT 该测试还验证了提供的 [PKCS \$111 AWS提供者组件是否可以使用供应商提供](pkcs11-provider-component.md)的 PKCS \$111 库与 HSM 接口。有关更多信息，请参阅 [硬件安全性集成](hardware-security.md)。

# 运行 AWS IoT Greengrass 资格套件的先决条件
<a name="dev-tst-prereqs"></a>

本节介绍使用 AWS IoT Device Tester (IDT) 的先决条件。 AWS IoT Greengrass

## 下载 for 的最新版本 AWS IoT Device Tester AWS IoT Greengrass
<a name="install-dev-tst-gg"></a>

下载[最新版本的](idt-programmatic-download.md) IDT 并将该软件解压缩到文件系统上您拥有读/写权限的位置 (*<device-tester-extract-location>*)。

**注意**  
<a name="unzip-package-to-local-drive"></a>IDT 不支持由多个用户从共享位置（如 NFS 目录或 Windows 网络共享文件夹）运行。建议您将 IDT 包解压缩到本地驱动器，并在本地工作站上运行 IDT 二进制文件。  
Windows 的路径长度限制为 260 个字符。如果您使用的是 Windows，请将 IDT 提取到根目录（如 `C:\ ` 或 `D:\`）以使路径长度不超过 260 个字符的限制。

## 下载该 AWS IoT Greengrass 软件
<a name="config-gg"></a>

IDT fo AWS IoT Greengrass r V2 会测试您的设备是否与特定版本的兼容。 AWS IoT Greengrass运行以下命令将 AWS IoT Greengrass Core 软件下载到名为的文件中`aws.greengrass.nucleus.zip`。*version*替换为您的 IDT 版本[支持的 nucleus 组件版本](dev-test-versions.md)。

------
#### [ Linux or Unix ]

```
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-version.zip > aws.greengrass.nucleus.zip
```

------
#### [ Windows Command Prompt (CMD) ]

```
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-version.zip > aws.greengrass.nucleus.zip
```

------
#### [ PowerShell ]

```
iwr -Uri https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-version.zip -OutFile aws.greengrass.nucleus.zip
```

------

将下载的 `aws.greengrass.nucleus.zip` 文件放在 `<device-tester-extract-location>/products/` 文件夹中。

**注意**  
对于相同的操作系统和架构，请勿在此目录中放置多个文件。

## 创建和配置 AWS 账户
<a name="config-aws-account-for-idt"></a>

在 AWS IoT Greengrass V2 中使用 AWS IoT Device Tester 之前，必须执行以下步骤：

1. [设置一个 AWS 账户.](#create-aws-account-for-idt) 如果您已经有 AWS 账户，请跳至步骤 2。

1. [为 IDT 配置权限。](#configure-idt-permissions)

这些账户权限允许 IDT 代表您访问 AWS 服务和创建 AWS 资源，例如 AWS IoT 事物和 AWS IoT Greengrass 组件。

<a name="idt-aws-credentials"></a>要创建这些资源，适用于 AWS IoT Greengrass V2 的 IDT 使用`config.json`文件中配置的 AWS 凭据代表您进行 API 调用。这些资源将在测试过程的不同时间进行预置。

**注意**  
尽管大多数测试都符合 [AWS 免费套餐](https://aws.amazon.com/free)的要求，但您在注册 AWS 账户时必须提供信用卡。有关更多信息，请参阅[我的账户使用的是免费套餐，为什么还需要提供付款方式？](https://aws.amazon.com/premiumsupport/knowledge-center/free-tier-payment-method/)

### 第 1 步：设置 AWS 账户
<a name="create-aws-account-for-idt"></a>

在此步骤中，将创建并配置 AWS 账户。如果您已有 AWS 账户，请跳至 [步骤 2：为 IDT 配置权限](#configure-idt-permissions)。

如果您没有 AWS 账户，请完成以下步骤来创建一个。

**报名参加 AWS 账户**

1. 打开[https://portal.aws.amazon.com/billing/注册。](https://portal.aws.amazon.com/billing/signup)

1. 按照屏幕上的说明操作。

   在注册时，将接到电话或收到短信，要求使用电话键盘输入一个验证码。

   当您注册时 AWS 账户，就会创建*AWS 账户根用户*一个。根用户有权访问该账户中的所有 AWS 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

要创建管理员用户，请选择以下选项之一。


****  

| 选择一种方法来管理您的管理员 | 目标 | 方式 | 您也可以 | 
| --- | --- | --- | --- | 
| 在 IAM Identity Center 中 （推荐） | 使用短期凭证访问 AWS。这符合安全最佳实操。有关最佳实践的信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。 | 有关说明，请参阅《AWS IAM Identity Center 用户指南》中的[入门](https://docs.aws.amazon.com//singlesignon/latest/userguide/getting-started.html)。 | 通过在《AWS Command Line Interface 用户指南[》 AWS IAM Identity Center中配置 AWS CLI 要使用的来](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-sso.html)配置编程访问权限。 | 
| 在 IAM 中 （不推荐使用） | 使用长期凭证访问 AWS。 | 按照《IAM 用户指南》中的[创建用于紧急访问的 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started-emergency-iam-user.html)中的说明进行操作。 | 按照《IAM 用户指南》中的[管理 IAM 用户的访问密钥](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_credentials_access-keys.html)，配置编程式访问。 | 

### 步骤 2：为 IDT 配置权限
<a name="configure-idt-permissions"></a>

在此步骤中，配置 IDT for AWS IoT Greengrass V2 用于运行测试和收集 IDT 使用情况数据的权限。您可以使用 [AWS 管理控制台](#configure-idt-permissions-console) 或 [AWS Command Line Interface （AWS CLI）](#configure-idt-permissions-cli)为 IDT 创建 IAM 策略和测试用户，然后将策略附加到用户。如果您已经为 IDT 创建了测试用户，请跳转至 [配置设备以运行 IDT 测试](device-config-setup.md)。

#### 为 IDT 配置权限（控制台）
<a name="configure-idt-permissions-console"></a>

1. 登录 [IAM 控制台](https://console.aws.amazon.com/iam)。

1. 创建客户托管策略，该策略授权创建具有特定权限的角色。

   1. 在导航窗格中，选择 **策略**，然后选择 **创建策略**。

   1. 如果您未使用 PreInstalled，请在 **JSON** 选项卡上将占位符内容替换为以下策略。如果您正在使用 PreInstalled，请继续执行以下步骤。

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/idt-*",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/idt-*",
              "arn:aws:iot:*:*:thinggroup/idt-*",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/idt-*",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```

   1. 如果您使用的是 PreInstalled，请在 **JSON** 选项卡上将占位符内容替换为以下策略。请确保：
      + 将`iotResources`语句*thingGroup*中的*thingName*和替换为在被测设备 (DUT) 上安装 Greengrass 期间创建的事物名称和事物组，以添加权限。
      + 将语句*passRole*和`roleAliasResources`语句*roleAlias*中的和替换为`passRoleForResources`在 DUT 上安装 Greengrass 期间创建的角色。

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/passRole",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/thingName",
              "arn:aws:iot:*:*:thinggroup/thingGroup",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/roleAlias",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```
**注意**  
如果您想使用[自定义 IAM 角色作为被测设备的令牌交换角色](set-config.md#custom-token-exchange-role-idt)，请务必更新策略中的 `roleAliasResources` 语句和 `passRoleForResources` 语句以允许自定义 IAM 角色资源。

   1. 选择**查看策略**。

   1. 对于 **Name (名称)**，请输入 **IDTGreengrassIAMPermissions**。在 **Summary (摘要)** 下，查看策略授予的权限。

   1. 选择**创建策略**。

1. 创建 IAM 用户并附加 IDT for AWS IoT Greengrass所需的权限。

   1. 创建 IAM 用户。按照 *IAM 用户指南*的[创建 IAM 用户（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)中的步骤 1 到 5 操作。

   1. 将权限附加到您的 IAM 用户：

      1. 在 **Set permissions (设置权限)** 页面上，选择 **Attach existing policies to user directly (直接附加现有策略到用户)**。

      1. 搜索您在上一步中创建的**IDTGreengrassIAMPermissions**策略。选中复选框。

   1. 选择**下一步：标签**。

   1. 选择 **Next: Review (下一步：审核)** 以查看您的选择摘要。

   1. 选择**创建用户**。

   1. 要查看用户的访问密钥（访问密钥 IDs 和私有访问密钥），请选择密码和访问密钥旁边的**显示**。要保存访问密钥，请选择**Download.csv (下载 .csv)**，然后将文件保存到安全位置。稍后您可以使用此信息配置 AWS 凭证文件。

1. <a name="aws-account-config-next-steps"></a>下一步：配置[物理设备](device-config-setup.md)。

#### 为 IDT 配置权限 (AWS CLI)
<a name="configure-idt-permissions-cli"></a>

1.  AWS CLI 如果尚未安装，请在您的计算机上进行安装和配置。按照《AWS Command Line Interface 用户指南》**中[安装 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 的步骤来操作。
**注意**  
 AWS CLI 是一个开源工具，可用于通过命令行 shell 与 AWS 服务进行交互。

1. 创建用于授予管理 IDT 和 AWS IoT Greengrass 角色的权限的客户托管策略。

   1. 如果您未使用 PreInstalled，请打开文本编辑器并将以下策略内容保存到 JSON 文件中。如果您正在使用 PreInstalled，请继续执行以下步骤。

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/idt-*",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/idt-*",
              "arn:aws:iot:*:*:thinggroup/idt-*",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/idt-*",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```

   1. 如果您正在使用 PreInstalled，请打开文本编辑器并将以下策略内容保存到 JSON 文件中。请确保：
      + *thingGroup*在被测设备 (DUT) 上安装 Greengrass 期间创建的`iotResources`语句中替换*thingName*和以添加权限。
      + 将语句*passRole*和`roleAliasResources`语句*roleAlias*中的和替换为`passRoleForResources`在 DUT 上安装 Greengrass 期间创建的角色。

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/passRole",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/thingName",
              "arn:aws:iot:*:*:thinggroup/thingGroup",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/roleAlias",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```
**注意**  
如果您想使用[自定义 IAM 角色作为被测设备的令牌交换角色](set-config.md#custom-token-exchange-role-idt)，请务必更新策略中的 `roleAliasResources` 语句和 `passRoleForResources` 语句以允许自定义 IAM 角色资源。

   1. 运行以下命令，创建名为 `IDTGreengrassIAMPermissions` 的客户管理型策略。将 `policy.json` 替换为您在上一步中创建的 JSON 文件的完整路径。

      ```
      aws iam create-policy --policy-name IDTGreengrassIAMPermissions --policy-document file://policy.json
      ```

1. 创建 IAM 用户并附加 IDT for AWS IoT Greengrass所需的权限。

   1. 创建 IAM 用户。在此示例设置中，用户被命名为 `IDTGreengrassUser`。

      ```
      aws iam create-user --user-name IDTGreengrassUser
      ```

   1. 将您在步骤 2 中创建的 `IDTGreengrassIAMPermissions` 策略附加到您的 IAM 用户。*<account-id>*在命令中替换为您的 ID AWS 账户。

      ```
      aws iam attach-user-policy --user-name IDTGreengrassUser --policy-arn arn:aws:iam::<account-id>:policy/IDTGreengrassIAMPermissions
      ```

1. 为用户创建私密访问密钥。

   ```
   aws iam create-access-key --user-name IDTGreengrassUser
   ```

   将输出存储在安全位置。稍后您将使用此信息来配置您的 AWS 凭据文件。

1. <a name="aws-account-config-next-steps"></a>下一步：配置[物理设备](device-config-setup.md)。

### AWS IoT Device Tester 权限
<a name="gg-idt-managed-policy"></a>

以下策略描述了 AWS IoT Device Tester 权限。

AWS IoT Device Tester 版本检查和自动更新功能需要这些权限。
+ `iot-device-tester:SupportedVersion`

  授 AWS IoT Device Tester 予获取受支持产品、测试套件和 IDT 版本列表的权限。
+ `iot-device-tester:LatestIdt`

  授 AWS IoT Device Tester 予获取可供下载的最新 IDT 版本的权限。
+ `iot-device-tester:CheckVersion`

  授 AWS IoT Device Tester 予检查 IDT、测试套件和产品的版本兼容性的权限。
+ `iot-device-tester:DownloadTestSuite`

  授 AWS IoT Device Tester 予下载测试套件更新的权限。

AWS IoT Device Tester 还使用以下权限来报告可选指标：
+ `iot-device-tester:SendMetrics`

  授 AWS 予收集 AWS IoT Device Tester 内部使用情况指标的权限。如果省略此权限，则不会收集这些指标。

# 配置设备以运行 IDT 测试
<a name="device-config-setup"></a>

要让 IDT 运行设备资格认证测试，您必须将主机配置为访问您的设备，并在您的设备上配置用户权限。

## 在主机上安装 Java
<a name="install-java-for-idt"></a>

从 IDT v4.2.0 开始，可选的资格测试 AWS IoT Greengrass 要求运行 Java。

您可以使用 Java 版本 8 或更高版本。我们建议您使用 [Amazon Corretto](https://aws.amazon.com/corretto/) 或 [OpenJDK](https://openjdk.java.net/) 长期支持版本。需要版本 8 或更高版本。

## 配置主机以访问被测设备
<a name="configure-host"></a>

IDT 在主机上运行，并且必须能够使用 SSH 连接到您的设备。有两个选项允许 IDT 获得对被测设备的 SSH 访问权限：

1. 按照此处的说明创建一个 SSH 密钥对并授权您的密钥，以便登录被测设备而无需指定密码。

1. 在 `device.json` 文件中为每个设备提供用户名和密码。有关更多信息，请参阅 [配置 device.json](set-config.md#device-config)。

您可以使用任何 SSL 实现创建 SSH 密钥。以下说明向你展示了如何使用 [SSH-KEYGEN](https://www.ssh.com/ssh/keygen/) 或 [Pu TTYgen](https://www.ssh.com/ssh/putty/windows/puttygen)（适用于 Windows）。如果您使用的是另一个 SSL 实现，请参阅该实现的文档。

IDT 使用 SSH 密钥对被测设备进行身份验证。

**使用 SSH-KEYGEN 创建 SSH 密钥**

1. 创建 SSH 密钥。

   您可以使用 Open SSH **ssh-keygen** 命令创建 SSH 密钥对。如果您的主机上已有一个 SSH 密钥对，则最佳做法是专门为 IDT 创建一个 SSH 密钥对。这样，完成测试后，如果没有输入密码，主机将无法再连接到设备。它还使您能够仅向需要访问远程设备的人员授予访问权限。
**注意**  
Windows 没有安装 SSH 客户端。有关在 Windows 上安装 SSH 客户端的信息，请参阅[下载 SSH 客户端软件](https://www.ssh.com/ssh/#sec-Download-client-software)。

   **ssh-keygen** 命令会提示您输入要存储密钥对的名称和路径。默认情况下，密钥对文件的名称为 `id_rsa`（私有密钥）和 `id_rsa.pub`（公有密钥）。在 macOS 和 Linux 上，这些文件的默认位置为 `~/.ssh/`。在 Windows 上，默认位置为 `C:\Users\<user-name>\.ssh`。

   根据提示，输入密钥短语来保护您的 SSH 密钥。有关更多信息，请参阅[生成新的 SSH 密钥](https://www.ssh.com/ssh/keygen/)。

1. 向被测设备添加经过授权的 SSH 密钥。

   IDT 必须使用您的 SSH 私有密钥登录被测设备。要授权 SSH 私有密钥以登录被测设备，请在主机上使用 **ssh-copy-id** 命令。此命令会将您的公有密钥添加到被测设备上的 `~/.ssh/authorized_keys` 文件中。例如：

   **\$1 ssh-copy-id *<remote-ssh-user>*@*<remote-device-ip>***

   哪里*remote-ssh-user*是用于登录被测设备的用户名，以及*remote-device-ip*用于运行测试的被测设备的 IP 地址。例如：

   **ssh-copy-id pi@192.168.1.5**

   系统提示时，输入在 **ssh-copy-id** 命令中指定的用户名所对应的密码。

   **ssh-copy-id** 公有密钥的名称为 `id_rsa.pub` 并且存储在默认位置（macOS 和 Linux 上的位置为 `~/.ssh/`，Windows 上的位置为 `C:\Users\<user-name>\.ssh`）。如果公有密钥采用其他名称或存储在其他位置，则必须使用 **-i** 选项与 **ssh-copy-id** 指定 SSH 公有密钥的完全限定路径（例如，**ssh-copy-id -i \$1/my/path/myKey.pub**）。有关创建 SSH 密钥和复制公有密钥的更多信息，请参阅 [SSH-COPY-ID](https://www.ssh.com/ssh/copy-id)。

**使用 Pu 创建 SSH 密钥TTYgen （仅限 Windows）**

1. 确保您在被测设备上安装了 OpenSSH 服务器和客户端。有关更多信息，请参阅 [OpenSSH](https://www.openssh.com/)。

1. 在被测设备TTYgen上安装 [Pu](https://www.puttygen.com/)。

1. 打开 Pu TTYgen。

1. 选择 **Generate (生成)**，然后在框中移动鼠标光标以生成私有密钥。

1. 从 **Conversions (转换)** 菜单中，选择 **Export OpenSSH key (导出 OpenSSH 密钥)**，然后使用 `.pem` 文件扩展名保存私有密钥 。

1. 将公有密钥添加到被测设备上的 `/home/<user>/.ssh/authorized_keys` 文件中。

   1. 从 Pu TTYgen 窗口复制公钥文本。

   1. 使用 PuTTY 在被测设备上创建会话。

      1. 从命令提示符或 Windows Powershell 窗口中，运行以下命令：

          **C:/*<path-to-putty>*/putty.exe -ssh *<user>*@*<dut-ip-address>* ** 

      1. 在系统提示时，输入您的设备密码。

      1. 使用 vi 或其他文本编辑器将公有密钥附加到被测设备上的 `/home/<user>/.ssh/authorized_keys` 文件中。

1. 使用您的用户名、IP 地址以及您刚刚为每个被测设备保存在主机上的私钥文件的路径更新 `device.json` 文件。有关更多信息，请参阅 [配置 device.json](set-config.md#device-config)。确保提供私有密钥的完整路径和文件名，并使用正斜杠（“/”）。例如，对于 Windows 路径 `C:\DT\privatekey.pem`，请在 `device.json` 文件中使用 `C:/DT/privatekey.pem`。

## 为 Windows 设备配置用户凭证
<a name="configure-windows-user-for-idt"></a>

要获得基于 Windows 的设备的资格，您必须在被测设备上的LocalSystem 帐户中为以下用户配置用户凭据：
+ 默认 Greengrass 用户（`ggc_user`）。
+ 您用来连接到被测设备的用户。您可以在 [`device.json` 文件](set-config.md#device-config)中配置此用户。

您必须在被测设备上的 LocalSystem 账户中创建每个用户，然后将该用户的用户名和密码存储在LocalSystem 账户的 Credential Manager 实例中。<a name="set-up-windows-device-environment-procedure"></a>

**在 Windows 设备上配置用户**

1. 以管理员身份打开 Windows 命令提示符 (`cmd.exe`)。

1. 在 Windows 设备上的 LocalSystem 帐户中创建用户。为您要创建的每个用户运行以下命令：对于默认 Greengrass 用户，请替换为。*user-name* `ggc_user`*password*替换为安全密码。

   ```
   net user /add user-name password
   ```

1. 从微软下载该[PsExec实用程序](https://docs.microsoft.com/en-us/sysinternals/downloads/psexec)并将其安装到设备上。

1. 使用该 PsExec 实用程序将默认用户的用户名和密码存储在 LocalSystem 账户的凭据管理器实例中。

   为要在 Credential Manager 中配置的每个用户运行以下命令。对于默认 Greengrass 用户，请替换为。*user-name* `ggc_user`*password*替换为您之前设置的用户密码。

   ```
   psexec -s cmd /c cmdkey /generic:user-name /user:user-name /pass:password
   ```

   如果系统打开 **PsExec License Agreement**，请选择 **Accept** 以同意许可并运行命令。
**注意**  
在 Windows 设备上，该 LocalSystem 帐户运行 Greengrass 核心，您必须使用 PsExec 该实用程序在帐户中存储用户信息。 LocalSystem使用凭据管理器应用程序将此信息存储在当前登录用户的 Windows 帐户中，而不是 LocalSystem帐户中。

## 在您的设备上配置用户权限
<a name="root-access"></a>

IDT 将对被测设备中的各种目录和文件执行操作。其中一些操作需要升级权限（使用 **sudo**）。要自动执行这些操作， AWS IoT Greengrass V2 版 IDT 必须能够在不被提示输入密码的情况下使用 sudo 运行命令。

请在被测设备上执行以下步骤，以允许在不提示输入密码的情况下进行 sudo 访问。

**注意**  
`username` 是指 IDT 用来访问被测设备的 SSH 用户。

**将用户添加到 sudo 组**

1. 在被测设备上，运行 `sudo usermod -aG sudo <username>`。

1. 注销，然后重新登录，以使变更生效。

1. 要验证您的用户名是否已成功添加，请运行 **sudo echo test**。如果系统未提示您输入密码，则说明已正确配置您的用户。

1. 打开 `/etc/sudoers` 文件，并将以下行添加到文件末尾：

   `<ssh-username> ALL=(ALL) NOPASSWD: ALL`

## 配置自定义令牌交换角色
<a name="configure-custom-tes-role-for-idt"></a>

您可以选择使用自定义 IAM 角色作为被测设备假设的与 AWS 资源交互的令牌交换角色。有关创建 IAM 角色的信息，请参阅《IAM 用户指南》**中的[创建 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。

您必须满足以下要求才能允许 IDT 使用您的自定义 IAM 角色。强烈建议您仅向该角色添加最低要求的策略操作。
+ 必须更新 [userdata.json](set-config.md#custom-token-exchange-role-idt) 配置文件才能将 `GreengrassV2TokenExchangeRole` 参数设置为 `true`。
+ 必须使用以下最低信任策略配置自定义 IAM 角色：

------
#### [ JSON ]

****  

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

------
+ 必须使用以下最低权限策略配置自定义 IAM 角色：

------
#### [ JSON ]

****  

  ```
  {
     "Version":"2012-10-17",		 	 	 
     "Statement":[
        {
           "Effect":"Allow",
           "Action":[
              "iot:DescribeCertificate",
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents",
              "logs:DescribeLogStreams",
              "iot:Connect",
              "iot:Publish",
              "iot:Subscribe",
              "iot:Receive",
              "iot:ListThingPrincipals", 
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "s3:GetBucketLocation",
              "s3:GetObject",
              "s3:PutObject",
              "s3:AbortMultipartUpload",
              "s3:ListMultipartUploadParts"
           ],
           "Resource":"*"
        }
     ]
  }
  ```

------
+ 自定义 IAM 角色的名称必须与您在测试用户的 IAM 权限中指定的 IAM 角色资源相匹配。默认情况下，[测试用户策略](dev-tst-prereqs.md#configure-idt-permissions)允许访问角色名称中带有 `idt-` 前缀的 IAM 角色。如果您的 IAM 角色名称不使用此前缀，请将 `arn:aws:iam::*:role/custom-iam-role-name` 资源添加到测试用户策略的 `roleAliasResources` 语句和 `passRoleForResources` 语句中，如以下示例所示：

    
**Example `passRoleForResources` statement**  

  ```
  {
     "Sid":"passRoleForResources",
     "Effect":"Allow",
     "Action":"iam:PassRole",
     "Resource":"arn:aws:iam::*:role/custom-iam-role-name",
     "Condition":{
        "StringEquals":{
           "iam:PassedToService":[
              "iot.amazonaws.com",
              "lambda.amazonaws.com",
              "greengrass.amazonaws.com"
           ]
        }
     }
  }
  ```  
**Example `roleAliasResources` statement**  

  ```
  {
     "Sid":"roleAliasResources",
     "Effect":"Allow",
     "Action":[
        "iot:CreateRoleAlias",
        "iot:DescribeRoleAlias",
        "iot:DeleteRoleAlias",
        "iot:TagResource",
        "iam:GetRole"
     ],
     "Resource":[
        "arn:aws:iot:*:*:rolealias/idt-*",
        "arn:aws:iam::*:role/custom-iam-role-name"
     ]
  }
  ```

## 配置设备以测试可选功能
<a name="optional-feature-config"></a>

本节介绍运行可选 Docker 和机器学习（ML）功能的 IDT 测试的设备要求。只有 IDT v4.9.3 支持 ML 功能。只有当您想测试这些功能时，才必须确保您的设备符合这些要求。否则，请继续查看 [配置 IDT 设置以运行 AWS IoT Greengrass 资格套件](set-config.md)。

**Topics**
+ [Docker 资格认证要求](#idt-config-docker-components)
+ [ML 资格认证要求](#idt-config-ml-components)
+ [HSM 资格认证要求](#idt-config-hsm-components)

### Docker 资格认证要求
<a name="idt-config-docker-components"></a>

IDT f AWS IoT Greengrass or V2 提供 Docker 资格测试，以验证您的设备是否可以使用 AWS提供的 [Docker 应用程序管理器组件下载您可以使用自定义 Dock](docker-application-manager-component.md) er 容器组件运行的 Docker 容器镜像。有关创建自定义 Docker 文档的更多信息，请参阅 [运行 Docker 容器](run-docker-container.md)。

要运行 Docker 资格认证测试，您的被测设备必须满足以下要求才能部署 Docker 应用程序管理器组件。
+ <a name="docker-engine-requirement"></a>Greengrass 核心设备上安装的 [Docker Engine](https://docs.docker.com/engine/) 1.9.1 或更高版本。版本 20.10 是经验证可与 AWS IoT Greengrass 核心软件配合使用的最新版本。在部署运行 Docker 容器的组件之前，必须直接在核心设备上安装 Docker。
+ <a name="docker-daemon-requirement"></a>在部署此组件之前，Docker 进程守护程序已启动并在核心设备上运行。
+ <a name="docker-user-permissions-requirement"></a>运行 Docker 容器组件的系统用户必须具有根或管理员权限，或者您必须将 Docker 配置为以非根用户或非管理员用户身份运行。
  + 在 Linux 设备上，您可向 `docker` 组中添加一个用户以调用 `docker` 命令，无需 `sudo`。
  + 在 Windows 设备上，您可将用户添加到 `docker-users` 组中以调用 `docker` 命令，无需管理员权限。

------
#### [ Linux or Unix ]

  要添加 `ggc_user` 或您用于运行 Docker 容器组件的非根用户至 `docker` 组中，请运行以下命令：

  ```
  sudo usermod -aG docker ggc_user
  ```

  有关更多信息，请参阅[以非根用户身份管理 Docker](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)。

------
#### [ Windows Command Prompt (CMD) ]

  要添加 `ggc_user` 或您用于运行 Docker 容器组件的非根用户至 `docker-users` 组中，请以管理员身份运行以下命令：

  ```
  net localgroup docker-users ggc_user /add
  ```

------
#### [ Windows PowerShell ]

  要添加 `ggc_user` 或您用于运行 Docker 容器组件的非根用户至 `docker-users` 组中，请以管理员身份运行以下命令：

  ```
  Add-LocalGroupMember -Group docker-users -Member ggc_user
  ```

------

### ML 资格认证要求
<a name="idt-config-ml-components"></a>

**注意**  
只有 IDT v4.9.3 支持机器学习功能。

[IDT f AWS IoT Greengrass or V2 提供机器学习资格测试，以验证您的设备是否可以使用 AWS提供的[机器学习组件，使用深度学习](machine-learning-components.md)[运行时或 TensorFlow Lite ML 框架在本地执行机器学习](https://github.com/neo-ai/neo-ai-dlr)推理。](https://www.tensorflow.org/lite/guide/python)有关在 Greengrass 设备上运行 ML 推理的更多信息，请参阅 [执行机器学习推理](perform-machine-learning-inference.md)。

要运行 ML 资格认证测试，您的被测设备必须满足以下要求才能部署机器学习组件。<a name="ml-component-requirements"></a>
+ 在运行 Amazon Linux 2 或 Ubuntu 18.04 的 Greengrass 核心设备上，[GNU C 库](https://www.gnu.org/software/libc/)（glibc）版本 2.27 或更高版本已安装在设备上。
+ 在 Armv7l 设备（例如 Raspberry Pi）上，OpenCV-Python 的依赖关系已安装在设备上。运行以下命令以安装依赖关系。

  ```
  sudo apt-get install libopenjp2-7 libilmbase23 libopenexr-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk-3-0 libwebp-dev
  ```
+ 运行 Raspberry Pi OS Bullseye 的 Raspberry Pi 设备必须满足以下要求：
  + NumPy 设备上安装了 1.22.4 或更高版本。Raspberry Pi OS Bullseye 包含的早期版本 NumPy，因此你可以运行以下命令在设备 NumPy 上进行升级。

    ```
    pip3 install --upgrade numpy
    ```
  + 旧摄像机堆栈已在设备上启用。Raspberry Pi OS Bullseye 包含一个新摄像机堆栈，该堆栈默认处于启用状态且不兼容，因此您必须启用旧摄像机堆栈。<a name="raspberry-pi-bullseye-enable-legacy-camera-stack"></a>

**启用旧摄像机堆栈**

    1. 运行以下命令以打开 Raspberry Pi 配置工具。

       ```
       sudo raspi-config
       ```

    1. 选择**接口选项**。

    1. 选择**旧摄像机**以启用旧摄像机堆栈。

    1. 重启 Raspberry Pi。

### HSM 资格认证要求
<a name="idt-config-hsm-components"></a>

AWS IoT Greengrass 提供 [PKCS \$111 提供程序组件](pkcs11-provider-component.md)，用于与设备上的 PKCS 硬件安全模块 (HSM) 集成。HSM 设置取决于您的设备和您选择的 HSM 模块。只要提供了 [IDT 配置设置](set-config.md)中记录的预期 HSM 配置，IDT 就会获得运行此可选功能资格认证测试所需的信息。

# 配置 IDT 设置以运行 AWS IoT Greengrass 资格套件
<a name="set-config"></a>

在运行测试之前，您必须在主机上配置 AWS 凭据和设备的设置。

## 在 config.json 中配置 AWS 凭据
<a name="cfg-aws-gg"></a>

您必须在 `<device_tester_extract_location>/configs/config.json` 文件中配置 IAM 用户凭证。使用中创建的 AWS IoT Greengrass V2 版 IDT 用户的凭证。[创建和配置 AWS 账户](dev-tst-prereqs.md#config-aws-account-for-idt)您可以采用以下两种方法之一来指定凭证：
+ 在凭证文件中
+ 作为环境变量

### 使用 AWS 凭证文件配置凭证
<a name="config-cred-file"></a>

IDT 使用与 AWS CLI相同的凭证文件。有关更多信息，请参阅[配置和凭证文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html)。

凭证文件的位置因您使用的操作系统而异：
+ macOS、Linux：`~/.aws/credentials`
+ Windows：`C:\Users\UserName\.aws\credentials`

按以下格式将您的 AWS 凭证添加到`credentials`文件中：

```
[default]
aws_access_key_id = <your_access_key_id>
aws_secret_access_key = <your_secret_access_key>
```

要将 IDT f AWS IoT Greengrass or V2 配置为使用`credentials`文件中的 AWS 凭据，请按如下方式编辑您的`config.json`文件：

```
{
  "awsRegion": "region",
  "auth": {
    "method": "file",
    "credentials": {
      "profile": "default"
    }
  }
}
```

**注意**  
如果您不使用`default` AWS 配置文件，请务必更改文件中的配置`config.json`文件名称。有关更多信息，请参阅[命名配置文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)。

### 使用环境变量配置 AWS 凭证
<a name="config-env-vars"></a>

环境变量是由操作系统维护且由系统命令使用的变量。如果您关闭 SSH 会话，则不会保存它们。适用于 AWS IoT Greengrass V2 的 IDT 可以使用`AWS_ACCESS_KEY_ID`和`AWS_SECRET_ACCESS_KEY`环境变量来存储您的 AWS 证书。

要在 Linux、macOS 或 Unix 上设置这些变量，请使用 **export**：

```
export AWS_ACCESS_KEY_ID=<your_access_key_id>
export AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
```

要在 Windows 上设置这些变量，请使用 **set**：

```
set AWS_ACCESS_KEY_ID=<your_access_key_id>
set AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
```

要配置 IDT 以使用环境变量，请编辑 `config.json` 文件中的 `auth` 部分。示例如下：

```
{
  "awsRegion": "region",
  "auth": {
    "method": "environment"
  }
}
```

## 配置 device.json
<a name="device-config"></a>

**注意**  
IDT v4.9.3 支持测试 `ml`、`docker` 和 `streamManagement` 功能。IDT v4.9.4 及更高版本支持测试 `docker`。如果您不希望测试这些功能，请将相应的值设置为 `no`。

除了 AWS 凭证外，IDT fo AWS IoT Greengrass r V2 还需要有关运行测试的设备的信息。示例信息包括 IP 地址、登录信息、操作系统和 CPU 架构。

您必须使用位于 ` <device_tester_extract_location>/configs/device.json` 中的 `device.json` 模板提供此信息：

------
#### [ IDT v4.9.3 ]

```
[
  {
    "id": "<pool-id>",
    "sku": "<sku>",
    "features": [
      {
        "name": "arch",
        "value": "x86_64 | armv6l | armv7l | aarch64"
      },
      {
        "name": "ml",
        "value": "dlr | tensorflowlite | dlr,tensorflowlite | no"
      },
      {
        "name": "docker",
        "value": "yes | no"
      },
      {
        "name": "streamManagement",
        "value": "yes | no"
      }, 
      {
        "name": "hsi", 
        "value": "hsm | no" 
      }
    ],
    "devices": [
      {
        "id": "<device-id>",
        "operatingSystem": "Linux | Windows",
        "connectivity": {
          "protocol": "ssh",
          "ip": "<ip-address>",
          "port": 22,
          "publicKeyPath": "<public-key-path>",
          "auth": {
            "method": "pki | password",
            "credentials": {
              "user": "<user-name>",
              "privKeyPath": "/path/to/private/key",
              "password": "<password>"
            }
          }
        }
      }
    ]
  }
]
```

**注意**  
只有当 `method` 设置为 `pki` 时才指定 `privKeyPath`。  
只有当 `method` 设置为 `password` 时才指定 `password`。

包含值的所有属性均为必填字段，如下所述：

`id`  
一个用户定义的字母数字 ID，用于唯一地标识称作*设备池*的设备集合。属于池的设备必须具有相同的硬件。运行一组测试时，池中的设备将用于对工作负载进行并行化处理。多个设备用于运行不同测试。

`sku`  
唯一标识所测试设备的字母数字值。该 SKU 用于跟踪符合条件的主板。  
如果您想在设备目录中列出您的 AWS Partner 设备，则在此处指定的 SKU 必须与您在发布过程中使用的 SKU 相匹配。

`features`  
包含设备支持的功能的数组。所有功能都是必需的。    
`arch`  
支持测试运行验证的操作系统架构。有效值为：  
+ `x86_64`
+ `armv6l`
+ `armv7l`
+ `aarch64`  
`ml`  
<a name="description-ml"></a>验证设备是否满足使用 AWS提供的机器学习 (ML) 组件所需的所有技术依赖项。  
启用此功能还可以验证<a name="description-ml-inference-phrase"></a>设备是否可以使用[深度学习运行时和 [TensorFlow Lite](https://www.tensorflow.org/lite/guide/python) ML 框架执行机器学习](https://github.com/neo-ai/neo-ai-dlr)推理。  
有效值是 `dlr` 和 `tensorflowlite` 或 `no` 的任意组合。  
`docker`  
<a name="description-docker"></a>验证设备是否满足使用 AWS提供的 Docker 应用程序管理器 () `aws.greengrass.DockerApplicationManager` 组件所需的所有技术依赖项。  
启用此功能还会验证<a name="description-docker-app-manager-qual-phrase"></a>设备是否可以从 Amazon ECR 下载 Docker 容器镜像。  
有效值是 `yes` 或 `no` 的任意组合。  
`streamManagement`  
<a name="description-sm"></a>验证设备是否可以下载、安装和运行 [AWS IoT Greengrass 流管理器](manage-data-streams.md)。  
有效值是 `yes` 或 `no` 的任意组合。  
`hsi`  
<a name="description-hsi"></a>验证设备是否可以使用存储在硬件安全模块 (HSM) 中的私钥和证书对与和 AWS IoT Greengrass 服务的连接进行身份验证。 AWS IoT 该测试还验证了提供的 [PKCS \$111 AWS提供者组件是否可以使用供应商提供](pkcs11-provider-component.md)的 PKCS \$111 库与 HSM 接口。有关更多信息，请参阅 [硬件安全性集成](hardware-security.md)。  
有效值为 `hsm` 或 `no`。
测试 `hsi` 仅在 IDT v4.9.3 及更高版本中可用。

`devices.id`  
用户定义的测试的设备的唯一标识符。

`devices.operatingSystem`  
设备操作系统。支持的值为 `Linux` 和 `Windows`。

`connectivity.protocol`  
用于与此设备通信的通信协议。目前，物理设备唯一支持的值是 `ssh`。

`connectivity.ip`  
测试的设备 IP 地址。  
<a name="connectivity-protocol-ssh-only"></a>此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。

`connectivity.port`  
可选。用于 SSH 连接的端口号。  
默认值为 22。  
此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。

`connectivity.publicKeyPath`  
可选。用于验证待测设备连接的公有密钥的完整路径。  
如果指定 `publicKeyPath`，IDT 会在与待测设备建立 SSH 连接时验证设备的公有密钥。如果未指定此值，IDT 将创建 SSH 连接，但不验证设备的公有密钥。  
我们强烈建议您指定公有密钥的路径，并使用安全的方法来获取此公有密钥。对于基于标准命令行的 SSH 客户端，`known_hosts` 文件中提供了公有密钥。如果您指定单独的公有密钥文件，则该文件必须使用与 `known_hosts` 文件相同的格式，即 ` ip-address key-type public-key`。如果有多个条目具有相同 IP 地址，则 IDT 所用密钥类型的条目必须位于文件中的其它条目之前。

`connectivity.auth`  
连接的身份验证信息。  
<a name="connectivity-protocol-ssh-only"></a>此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。    
`connectivity.auth.method`  
用于通过给定的连接协议访问设备的身份验证方法。  
支持的值为：  
+ `pki`
+ `password`  
`connectivity.auth.credentials`  
用于身份验证的凭证。    
`connectivity.auth.credentials.password`  
该密码用于登录到正在测试的设备。  
此值仅在 `connectivity.auth.method` 设置为 `password` 时适用。  
`connectivity.auth.credentials.privKeyPath`  
用于登录所测试设备的私有密钥的完整路径。  
此值仅在 `connectivity.auth.method` 设置为 `pki` 时适用。  
`connectivity.auth.credentials.user`  
用于登录所测试设备的用户名。

------
#### [ IDT v4.9.4 ]

```
[
  {
    "id": "<pool-id>",
    "sku": "<sku>",
    "features": [
      {
        "name": "arch",
        "value": "x86_64 | armv6l | armv7l | aarch64"
      },
      {
        "name": "docker",
        "value": "yes | no"
      }, 
      {
        "name": "hsi", 
        "value": "hsm | no" 
      }
    ],
    "devices": [
      {
        "id": "<device-id>",
        "operatingSystem": "Linux | Windows",
        "connectivity": {
          "protocol": "ssh",
          "ip": "<ip-address>",
          "port": 22,
          "publicKeyPath": "<public-key-path>",
          "auth": {
            "method": "pki | password",
            "credentials": {
              "user": "<user-name>",
              "privKeyPath": "/path/to/private/key",
              "password": "<password>"
            }
          }
        }
      }
    ]
  }
]
```

**注意**  
只有当 `method` 设置为 `pki` 时才指定 `privKeyPath`。  
只有当 `method` 设置为 `password` 时才指定 `password`。

包含值的所有属性均为必填字段，如下所述：

`id`  
一个用户定义的字母数字 ID，用于唯一地标识称作*设备池*的设备集合。属于池的设备必须具有相同的硬件。运行一组测试时，池中的设备将用于对工作负载进行并行化处理。多个设备用于运行不同测试。

`sku`  
唯一标识所测试设备的字母数字值。该 SKU 用于跟踪符合条件的主板。  
如果您想在设备目录中列出您的 AWS Partner 设备，则在此处指定的 SKU 必须与您在发布过程中使用的 SKU 相匹配。

`features`  
包含设备支持的功能的数组。所有功能都是必需的。    
`arch`  
支持测试运行验证的操作系统架构。有效值为：  
+ `x86_64`
+ `armv6l`
+ `armv7l`
+ `aarch64`  
`docker`  
<a name="description-docker"></a>验证设备是否满足使用 AWS提供的 Docker 应用程序管理器 () `aws.greengrass.DockerApplicationManager` 组件所需的所有技术依赖项。  
启用此功能还会验证<a name="description-docker-app-manager-qual-phrase"></a>设备是否可以从 Amazon ECR 下载 Docker 容器镜像。  
有效值是 `yes` 或 `no` 的任意组合。  
`hsi`  
<a name="description-hsi"></a>验证设备是否可以使用存储在硬件安全模块 (HSM) 中的私钥和证书对与和 AWS IoT Greengrass 服务的连接进行身份验证。 AWS IoT 该测试还验证了提供的 [PKCS \$111 AWS提供者组件是否可以使用供应商提供](pkcs11-provider-component.md)的 PKCS \$111 库与 HSM 接口。有关更多信息，请参阅 [硬件安全性集成](hardware-security.md)。  
有效值为 `hsm` 或 `no`。
测试 `hsi` 仅在 IDT v4.9.3 及更高版本中可用。

`devices.id`  
用户定义的测试的设备的唯一标识符。

`devices.operatingSystem`  
设备操作系统。支持的值为 `Linux` 和 `Windows`。

`connectivity.protocol`  
用于与此设备通信的通信协议。目前，物理设备唯一支持的值是 `ssh`。

`connectivity.ip`  
测试的设备 IP 地址。  
<a name="connectivity-protocol-ssh-only"></a>此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。

`connectivity.port`  
可选。用于 SSH 连接的端口号。  
默认值为 22。  
此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。

`connectivity.publicKeyPath`  
可选。用于验证待测设备连接的公有密钥的完整路径。  
如果指定 `publicKeyPath`，IDT 会在与待测设备建立 SSH 连接时验证设备的公有密钥。如果未指定此值，IDT 将创建 SSH 连接，但不验证设备的公有密钥。  
我们强烈建议您指定公有密钥的路径，并使用安全的方法来获取此公有密钥。对于基于标准命令行的 SSH 客户端，`known_hosts` 文件中提供了公有密钥。如果您指定单独的公有密钥文件，则该文件必须使用与 `known_hosts` 文件相同的格式，即 ` ip-address key-type public-key`。如果有多个条目具有相同 IP 地址，则 IDT 所用密钥类型的条目必须位于文件中的其它条目之前。

`connectivity.auth`  
连接的身份验证信息。  
<a name="connectivity-protocol-ssh-only"></a>此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。    
`connectivity.auth.method`  
用于通过给定的连接协议访问设备的身份验证方法。  
支持的值为：  
+ `pki`
+ `password`  
`connectivity.auth.credentials`  
用于身份验证的凭证。    
`connectivity.auth.credentials.password`  
该密码用于登录到正在测试的设备。  
此值仅在 `connectivity.auth.method` 设置为 `password` 时适用。  
`connectivity.auth.credentials.privKeyPath`  
用于登录所测试设备的私有密钥的完整路径。  
此值仅在 `connectivity.auth.method` 设置为 `pki` 时适用。  
`connectivity.auth.credentials.user`  
用于登录所测试设备的用户名。

------

## 配置 userdata.json
<a name="userdata-config"></a>

IDT fo AWS IoT Greengrass r V2 还需要有关测试工件和 AWS IoT Greengrass 软件位置的更多信息。

您必须使用位于 ` <device_tester_extract_location>/configs/userdata.json` 中的 `userdata.json` 模板提供此信息：

```
{
    "TempResourcesDirOnDevice": "/path/to/temp/folder",
    "InstallationDirRootOnDevice": "/path/to/installation/folder",
    "GreengrassNucleusZip": "/path/to/aws.greengrass.nucleus.zip",
    "PreInstalled": "yes/no",
    "GreengrassV2TokenExchangeRole": "custom-iam-role-name",
	"hsm": {
        "greengrassPkcsPluginJar": "/path/to/aws.greengrass.crypto.Pkcs11Provider-latest.jar",
        "pkcs11ProviderLibrary": "/path/to/pkcs11-vendor-library",
        "slotId": "slot-id",
        "slotLabel": "slot-label",
        "slotUserPin": "slot-pin",
        "keyLabel": "key-label",
        "preloadedCertificateArn": "certificate-arn"
        "rootCA": "path/to/root-ca"
    }
}
```

包含值的所有属性均为必填字段，如下所述：

`TempResourcesDirOnDevice`  
被测试设备上用于存储测试构件的临时文件夹的完整路径。确保不需要 sudo 权限即可写入此目录。  
IDT 会在完成测试运行后删除该文件夹的内容。

`InstallationDirRootOnDevice`  
设备上要安装 AWS IoT Greengrass的文件夹的完整路径。对于 PreInstalled Greengrass 来说，这是 Greengrass 安装目录的路径。  
您必须为该文件夹设置必要的文件权限。对安装路径中的每个文件夹运行以下命令。  

```
sudo chmod 755 folder-name
```

`GreengrassNucleusZip`  
主机上 Greengrass Nucleus ZIP (`greengrass-nucleus-latest.zip`) 文件的完整路径。使用 PreInstalled Greengrass 进行测试时不需要此字段。  
有关适用于 IDT 的 Greengrass nucleus 支持版本的信息，请参阅。 AWS IoT Greengrass[适用 AWS IoT Greengrass 于 V2 的最新 IDT 版本](dev-test-versions.md#idt-latest-version)[要下载最新的 Greengrass 软件，请参阅下载该软件。 AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/dev-tst-prereqs.html#config-gg)

`PreInstalled`  
此功能仅适用于 Linux 设备上的 IDT v4.5.8 及更高版本。  
（可选）当值为时*yes*，IDT 将假设中`InstallationDirRootOnDevice`提到的路径是安装 Greengrass 的目录。  
有关如何在设备上安装 Greengrass 的更多信息，请参阅 [安装具有自动资源配置功能的 AWS IoT Greengrass Core 软件](quick-installation.md)。如果[使用手动配置进行安装](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html)，请在手动创建 AWS IoT 事物时包含 “将事物添加到新的或现有[AWS IoT 的事物](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html#create-iot-thing)组” 步骤。IDT 假设事物和事物组是在安装设置期间创建的。确保这些值反映在 `effectiveConfig.yaml` 文件中。IDT 检查 `<InstallationDirRootOnDevice>/config/effectiveConfig.yaml` 下的文件 `effectiveConfig.yaml`。  
要使用 HSM 运行测试，请确保在 `effectiveConfig.yaml` 中更新了 `aws.greengrass.crypto.Pkcs11Provider` 字段。

  `GreengrassV2TokenExchangeRole`  
（可选）您要用作令牌交换角色的自定义 IAM 角色，被测试设备会担任该角色以与 AWS 资源交互。  
IDT 将在测试运行期间使用此自定义 IAM 角色，而非创建默认的令牌交换角色。如果您使用自定义角色，则可以更新[测试用户的 IAM 权限](dev-tst-prereqs.md#configure-idt-permissions)，以排除允许该用户创建和删除 IAM 角色和策略的 `iamResourcesUpdate` 语句。
有关创建自定义 IAM 角色作为令牌交换角色的更多信息，请参阅[配置自定义令牌交换角色](device-config-setup.md#configure-custom-tes-role-for-idt)。

`hsm`  
此功能适用于 IDT v4.5.1 及更高版本。  
（可选）用于通过 AWS IoT Greengrass 硬件安全模块（HSM）进行测试的配置信息。否则，应忽略 `hsm` 属性。有关更多信息，请参阅 [硬件安全性集成](hardware-security.md)。  
<a name="connectivity-protocol-ssh-only"></a>此属性仅在 `connectivity.protocol` 设置为 `ssh` 时适用。  
如果硬件安全模块在 IDT 与其他系统间共享，则 HSM 配置可能被视为敏感数据。在这种情况下，您可以通过将这些配置值存储在 Paramet AWS er Stor SecureString e 参数中并配置 IDT 使其在测试执行期间获取它们，从而避免以明文形式保护这些配置值。有关更多信息，请参阅 [从 AWS 参数存储中获取配置](#fetch-config)。  
`hsm.greengrassPkcsPluginJar`  
您下载到 IDT 主机的 [PKCS\$111 提供程序组件](pkcs11-provider-component.md)的完整路径。 AWS IoT Greengrass 将此组件作为 JAR 文件提供，您可以下载该文件以在安装过程中将其指定为预置插件。您可以通过以下 URL 下载该组件 JAR 文件的最新版本：[https://d2s8p88vqu9w66.cloudfront。 net/releases/Pkcs11Provider/aws.greengrass.crypto.pkcs11Provider](https://d2s8p88vqu9w66.cloudfront.net/releases/Pkcs11Provider/aws.greengrass.crypto.Pkcs11Provider-latest.jar)-latest.jar。  
`hsm.pkcs11ProviderLibrary`  
硬件安全模块（HSM）供应商提供的 PKCS\$111 库的完整路径，用于与 HSM 交互。  
`hsm.slotId`  
用于识别要加载密钥和证书的 HSM 槽的槽 ID。  
`hsm.slotLabel`  
用于识别要加载密钥和证书的 HSM 槽的槽标签。  
`hsm.slotUserPin`  
IDT 用来向 HSM 验证 AWS IoT Greengrass 核心软件的用户 PIN。  
作为安全最佳实践，请勿在生产设备上使用同一用户 PIN。  
`hsm.keyLabel`  
用于标识硬件模块中的键的标签。密钥和证书必须使用相同密钥标签。  
`hsm.preloadedCertificateArn`  
 AWS IoT 云中上传的设备证书的 Amazon 资源名称（ARN）。  
您之前必须使用 HSM 中的密钥生成此证书，将其导入您的 HSM，然后将其上传到云端。 AWS IoT 有关生成和导入证书的信息，请参阅您的 HSM 文档。  
您必须将证书上传到您在 [config.json](#cfg-aws-gg) 中提供的同一个账户和区域。有关将证书上传到的更多信息 AWS IoT，请参阅*《AWS IoT 开发人员指南》*中的[手动注册客户端证书](https://docs.aws.amazon.com/iot/latest/developerguide/manual-cert-registration.html)。  
`hsm.rootCAPath`  
（可选）IDT 主机上指向签署证书的根证书颁发机构（CA）的完整路径。如果您在 HSM 中创建的证书并非由 Amazon 根 CA 签名，则这是必需的。

## 从 AWS 参数存储中获取配置
<a name="fetch-config"></a>

AWS IoT 设备测试器 (IDT) 包含一项可选功能，用于从 S [AWS ystems Manager 参数存储](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)区获取配置值。 AWS Parameter Store 允许对配置进行安全和加密的存储。配置后，IDT 可以从 Paramet AWS er Store 获取参数，而不是将参数以纯文本形式存储在文件中。`userdata.json`这对于任何应加密存储的敏感数据都很有用，例如密码、PIN 和其他密钥。

1. 要使用此功能，您必须更新创建 [IDT 用户](https://docs.aws.amazon.com/greengrass/v2/developerguide/dev-tst-prereqs.html)时使用的权限，以允许对 IDT 配置为使用的参数进行 GetParameter 操作。以下是可以添加到 IDT 用户的权限语句示例。有关更多信息，请参阅[《AWS Systems Manager 用户指南》](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html)。

   ```
   {
          "Sid":"parameterStoreResources",
          "Effect": "Allow",
           "Action": [
               "ssm:GetParameter"
           ],
           "Resource": "arn:aws:ssm:*:*:parameter/IDT*"
   }
   ```

   配置以上权限是为了允许使用通配符 `*` 获取名称以 `IDT` 开头的所有参数。您应该根据自己的需要进行自定义，以便 IDT 可以根据您正在使用的参数的命名来获取任何已配置的参数。

1. 你需要将配置值存储在 P AWS aramater Store 中。这可以通过 AWS 控制台或 AWS CLI 完成。 AWS Parameter Store 允许您选择加密或未加密的存储。要存储机密、密码和 PIN 等敏感值，应使用加密选项，该选项的参数类型为 SecureString。要使用 AWS CLI 上传参数，可以使用以下命令：

   ```
   aws ssm put-parameter --name IDT-example-name --value IDT-example-value --type SecureString
   ```

   您可以使用以下命令验证是否已存储参数。（可选）使用该`--with-decryption`标志获取解密后的参数。SecureString 

   ```
   aws ssm get-parameter --name IDT-example-name
   ```

   使用 AWS CLI 将上传当前 CLI 用户 AWS 所在区域中的参数，IDT 将从中`config.json`配置的区域获取参数。要通过 AWS CLI 查看您所在的区域，请使用以下命令：

   ```
   aws configure get region
   ```

1. 在 AWS 云端拥有配置值后，您可以更新 IDT 配置中的任何值以从 AWS 云端获取。为此，您可以在表单`{{AWS.Parameter.parameter_name}}`的 IDT 配置中使用占位符从 Parameter Store 中按该名称获取 AWS 参数。

   例如，假设您要在 HSM 配置中使用步骤 2 中的 `IDT-example-name` 参数作为 HSM keyLabel。为此，可以按以下方式更新 `userdata.json`：

   ```
   "hsm": {
           "keyLabel": "{{AWS.Parameter.IDT-example-name}}",
           [...]
       }
   ```

   IDT 将在运行时获取步骤 2 中设置为 `IDT-example-value` 的此参数的值。此配置与设置类似，`"keyLabel": "IDT-example-value"`但相反，该值以加密形式存储在 AWS 云中。

# 运行 AWS IoT Greengrass 资格套件
<a name="run-tests"></a>

[设置所需的配置](set-config.md)后，就可以开始测试了。完整测试套件的运行时取决于您的硬件。作为参考，在 Raspberry Pi 3B 上完成完整的测试套件大约需要 30 分钟。

使用以下 `run-suite` 命令运行一系列测试。

```
devicetester_[linux | mac | win]_x86-64 run-suite  \\
    --suite-id suite-id  \\
    --group-id group-id  \\
    --pool-id your-device-pool \\
    --test-id test-id  \\
    --update-idt y|n  \\
    --userdata userdata.json
```

所有选项均为可选。例如，如果您只有一个设备池（即 `device.json` 文件中定义的一组相同设备），则可以忽略 `pool-id`。或者，如果您要在 `tests` 文件夹中运行最新的测试套件版本，则可以忽略 `suite-id`。

**注意**  
如果在线提供了更新的测试套件版本，IDT 会提示您。有关更多信息，请参阅 [测试套件版本](idt-greengrass-qualification.md#idt-test-suite-versions)。

## 用于运行资格认证套件的示例命令
<a name="idt-run-suite-examples"></a>

以下命令行示例介绍如何针对某个设备池运行资格认证测试。有关 `run-suite` 和其他 IDT 命令的更多信息，请参阅 [AWS IoT Greengrass V2 命令的 IDT](#bk-cli)。

使用以下命令在指定的测试套件中运行所有测试组。`list-suites` 命令可列出 `tests` 文件夹中的测试套件。

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --suite-id GGV2Q_1.0.0 \
    --pool-id <pool-id> \
    --userdata userdata.json
```

使用以下命令运行测试套件中的特定测试组。`list-groups` 命令可列出测试套件中的测试组。

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --suite-id GGV2Q_1.0.0 \
    --group-id <group-id> \
    --pool-id <pool-id> \
    --userdata userdata.json
```

使用以下命令运行测试组中的特定测试案例。

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --group-id <group-id> \
    --test-id <test-id> \
    --userdata userdata.json
```

使用以下命令运行测试组中的多个测试案例。

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --group-id <group-id> \
    --test-id <test-id1>,<test-id2>
    --userdata userdata.json
```

使用以下命令列出测试组中的所有测试案例。

```
devicetester_[linux | mac | win]_x86-64 list-test-cases --group-id <group-id>
```

建议您运行完整的资格认证测试套件，该套件会按正确的顺序运行测试组依赖关系。如果您选择运行特定测试组，建议您先运行依赖关系检查程序测试组，以确保在运行相关测试组之前已安装所有 Greengrass 依赖关系。例如：
+ 在运行核心资格测试组之前运行 `coredependencies`。

## AWS IoT Greengrass V2 命令的 IDT
<a name="bk-cli"></a>

IDT 命令位于 `<device-tester-extract-location>/bin` 目录中。要运行测试套件，请按以下格式提供命令：

`help`  <a name="idt-command-help"></a>
列出有关指定命令的信息。

`list-groups`  <a name="idt-command-list-groups"></a>
列出给定测试套件中的组。

`list-suites`  <a name="idt-command-list-suites"></a>
列出可用的测试套件。

`list-supported-products`  
列出当前 IDT AWS IoT Greengrass 版本支持的产品（在本例中为版本）和测试套件版本。

`list-test-cases`  
列出给定测试组中的测试用例。支持以下选项：  
+ `group-id`. 要搜索的测试组。此选项是必需的，必须指定单个组。

`run-suite`  
对某个设备池运行一组测试。以下是一些受支持的选项：  
+ `suite-id`. 要运行的测试套件版本。如果未指定，IDT 将使用 `tests` 文件夹中的最新版本。
+ `group-id`. 要以逗号分隔的列表形式运行的测试组。如果未指定，IDT 将运行测试套件中的所有相应测试组，具体取决于 `device.json` 中已配置的设置。IDT 不会根据您配置的设置运行设备不支持的任何测试组，即使这些测试组是在 `group-id` 列表中指定的。
+ `test-id`. 要以逗号分隔的列表形式运行的测试用例。指定后，`group-id` 必须指定单个组。
+ `pool-id`. 要测试的设备池。如果您在 `device.json` 文件中定义了多个设备池，则必须指定一个池。
+ `stop-on-first-failure`。将 IDT 配置为在第一次失败时停止运行。当您想要调试指定的测试组时，请将此选项与 `group-id` 配合使用。在运行完整测试套件以生成资格认证报告时，请勿使用此选项。
+ `update-idt`。为更新 IDT 的提示设置响应。如果 IDT 检测到有更新的版本，则 `Y` 响应将停止执行测试。`N` 响应会继续执行测试。
+ `userdata`。包含有关测试构件路径的信息的 `userdata.json` 文件的完整路径。此选项是 `run-suite` 命令所必需的。该`userdata.json`文件必须位于 /devic *devicetester\$1extract\$1location* etester\$1ggv2\$1 /c *[win\$1mac\$1linux]* onfigs/ 目录中。
有关 `run-suite` 选项的更多信息，请使用 `help` 选项：  

```
devicetester_[linux | mac | win]_x86-64 run-suite -h
```

# 了解结果和日志
<a name="results-logs"></a>

本节介绍如何查看和解释 IDT 结果报告和日志。

要对错误进行故障排查，请参阅[V2 版 IDT 故障排除 AWS IoT Greengrass](idt-troubleshooting.md)。

## 查看结果
<a name="view-results"></a>

在运行时，IDT 会将错误写入控制台、日志文件和测试报告中。IDT 在完成资格测试套件后，会生成两个测试报告。这些报告位于 `<device-tester-extract-location>/results/<execution-id>/` 下。两个报告都捕获资格认证测试套件运行的结果。

`awsiotdevicetester_report.xml` 是您提交给 AWS 的资格测试报告，用于在 AWS Partner 设备目录中列出您的设备。该报告包含以下元素：
+ IDT 版本。
+ 所测试的 AWS IoT Greengrass 版本。
+ `device.json` 文件中指定的 SKU 和设备池名称。
+ `device.json` 文件中指定的设备池的功能。
+ 测试结果的摘要汇总。
+ 按照基于设备功能（例如，本地资源访问、影子、MQTT）测试的库细分的测试结果。

`GGV2Q_Result.xml` 报告采用 [JUnit XML 格式](https://llg.cubic.org/docs/junit/)。您可以将它集成到持续集成和开发平台，例如 [Jenkins](https://jenkins.io/)、[Bamboo](https://www.atlassian.com/software/bamboo) 等。该报告包含以下元素：
+ 测试结果的摘要汇总。
+ 按照已测试的 AWS IoT Greengrass 功能细分的测试结果。

## 解析 AWS IoT Device Tester 结果
<a name="interpreting-results-gg"></a>

`awsiotdevicetester_report.xml` 或 `awsiotdevicetester_report.xml` 中的报告部分列出了运行的测试以及结果。

第一个 XML 标签 `<testsuites>` 包含测试运行情况的摘要。例如：

```
<testsuites name="GGQ results" time="2299" tests="28" failures="0" errors="0" disabled="0">
````<testsuites>` 标签中使用的属性

`name`  
测试套件的名称。

`time`  
运行资格认证套件所用的时间（以秒为单位）。

`tests`  
已运行的测试数。

`failures`  
已运行但未通过的测试数。

`errors`  
IDT 无法运行的测试数。

`disabled`  
忽略此属性。不会使用。

`awsiotdevicetester_report.xml` 文件包含一个 `<awsproduct>` 标签，其中包含有关正测试的产品以及在运行测试套件后验证的产品功能的信息。`<awsproduct>` 标签中使用的属性

`name`  
所测试的产品的名称。

`version`  
所测试的产品的版本。

`features`  
验证的功能。标记为 `required` 的功能需要提交您的主板信息以供资格审核。以下代码段演示了此信息在 `awsiotdevicetester_report.xml` 文件中的显示方式。  

```
<name="aws-iot-greengrass-v2-core" value="supported" type="required"></feature>
```

如果没有针对所需功能的测试失败或错误，则设备满足运行 AWS IoT Greengrass 的技术要求并可以与 AWS IoT 服务互操作。如果您想要在 AWS Partner 设备目录中列出您的设备，则可以使用此报告作为资格证明。

如果出现测试失败或错误，则可以通过检查 `<testsuites>` XML 标签来确定失败的测试。`<testsuite>` 标签内的 `<testsuites>` XML 标签显示了测试组的测试结果摘要。例如：

```
<testsuite name="combination" package="" tests="1" failures="0" time="161" disabled="0" errors="0" skipped="0">
```

其格式与 `<testsuites>` 标签类似，但包含一个未使用并可忽略的 `skipped` 属性。在每个 `<testsuite>` XML 标签内部，对于一个测试组，所运行的每个测试都有 `<testcase>` 标签。例如：

```
<testcase classname="Security Combination (IPD + DCM) Test Context" name="Security Combination IP Change Tests sec4_test_1: Should rotate server cert when IPD disabled and following changes are made:Add CIS conn info and Add another CIS conn info" attempts="1"></testcase>>
````<testcase>` 标签中使用的属性

`name`  
测试的名称。

`attempts`  
IDT 运行测试用例的次数。

当测试失败或出现错误时，将会在 `<failure>` 标签中添加包含用于故障排除的信息的 `<error>` 或 `<testcase>` 标签。例如：

```
<testcase classname="mcu.Full_MQTT" name="AFQP_MQTT_Connect_HappyCase" attempts="1">
	<failure type="Failure">Reason for the test failure</failure>
	<error>Reason for the test execution error</error>
</testcase>
```

## 查看日志
<a name="view-logs-gg"></a>

IDT 从测试运行生成的日志位于 `<devicetester-extract-location>/results/<execution-id>/logs` 中。它会生成两组日志：

`test_manager.log`  
从 AWS IoT Device Tester 的 Test Manager 组件生成的日志（例如，与配置、测试序列和报告生成相关的日志）。

`<test-case-id>.log (for example, lambdaDeploymentTest.log)`  
测试组内测试用例的日志，包括来自所测试设备的日志。从 IDT v4.2.0 开始，IDT 会将每个测试用例的测试日志归类到 `<devicetester-extract-location>/results/<execution-id>/logs/<test-group-id>/` 目录下的单独 *<test-case-id>* 文件夹中。