

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

# 将 Greengrass 核心设备切换到另一台核心设备 AWS 账户 或区域
<a name="switch-core-device-connectivity"></a>

您可以部署 nucleus 配置更新，将核心设备的物联网连接从一个 AWS 账户 或区域切换到另一个或另一个区域。这在以下情况下很有用：
+ **从制造到生产的过渡**-在制造期间在暂存账户中配置设备，并在现场安装期间将其转移到目标帐户。
+ **地理位置重新定位** — 从一个区域移动到另一个区域的设备必须连接到本地区域的 AWS IoT 终端节点以减少延迟。
+ **减少故障影响** — 您可以将最初集中在单个账户中的设备重新分配给多个账户，以限制账户级别问题（例如服务配额限制或安全事件）的影响。

部署物联网连接交换机时，nucleus 会在应用更改之前验证与新端点的连接，并在连接失败时自动回滚。

此功能需要 Greengrass nucleus v2.18.0 或更高版本，或 Greengrass nucleus lite v2.6.0 或更高版本。

**Topics**
+ [先决条件](#switch-connectivity-prerequisites)
+ [创建部署](#switch-connectivity-create-deployment)
+ [预计将发生的情况](#switch-connectivity-what-to-expect)
+ [验证交换机](#switch-connectivity-verify)

## 先决条件
<a name="switch-connectivity-prerequisites"></a>

在部署连接交换机之前，请在目标 AWS 账户 和区域中进行以下设置：
+ AWS IoT thin@@ **g** — 创建与源账户中同名的事物。
+ **证书**-在目标账户中注册相同的设备证书。该证书必须与设备在源账户中使用的证书相同。
+ **AWS IoT 策略**-将策略附加到证书。该策略必须允许`iot:Connect`使用使用通配符后缀作为客户端 ID 的资源 ARN：

  ```
  "Resource": "arn:aws:iot:*:*:client/${iot:Connection.Thing.ThingName}*"
  ```

  您必须包括通配符后缀，因为 nucleus 飞行前连接检查使用客户端 ID。`{{thing-name}}#endpoint-switch`
+ **AWS IoT 角色别名** — 在目标区域中创建一个角色别名，该角色别名具有用于 Greengrass 操作的相应 IAM 角色权限。

**注意**  
要使用诸如策略`${iot:Connection.Thing.ThingName}`中的 AWS IoT 事物 AWS IoT 策略变量，您必须将证书专门附加到目标账户中的 AWS IoT 事物。

对于 Greengrass nucleus 核心设备，还`greengrassDataPlaneEndpoint`必须在核配置中设置为。**iotdata**在连接交换机部署中或初始配置期间包括此设置。

如果没有此设置，数据平面将在切换后保持与原始帐户的绑定。这会中断组件工件下载和控制平面操作。有关更多信息，请参阅中的`greengrassDataPlaneEndpoint`配置参数[Greengrass Nucleus](greengrass-nucleus-component.md)。

对于 Greengrass nucleus lite 核心设备，必须先在账户中创建`aws.greengrass.NucleusLite`私有组件，然后才能将配置更新部署到核心。 AWS IoT Greengrass 部署只能针对账户组件注册表中存在的组件，而且 nucleus lite 没有公共组件。

创建一个包含`aws_nucleus_lite`运行时且生命周期为空的组件（无操作）。组件版本必须与设备上运行的 nucleus lite 版本相匹配。

## 创建部署
<a name="switch-connectivity-create-deployment"></a>

创建以源账户中的核心设备或其事物组为目标的部署。部署会向 nucleus 组件发送包含新 AWS IoT 端点值的合并配置更新。

**要部署连接交换机 (AWS CLI)**

1. 使用以下内容创建名为 `switch-deployment.json` 的文件。将占位符值替换为目标账户的值。
   + {{targetArn}}替换为源账户中的 AWS IoT 事物组或核心设备的 ARN。
   + {{componentName}}替换为 nu `aws.greengrass.Nucleus` cleus 或 nucleu `aws.greengrass.NucleusLite` s lite。
   + {{componentVersion}}替换为设备上运行的原子核版本。

   ```
   {
     "targetArn": "{{targetArn}}",
     "deploymentName": "SwitchConnectivity",
     "components": {
       "{{componentName}}": {
         "componentVersion": "{{componentVersion}}",
         "configurationUpdate": {
           "merge": "{\"iotDataEndpoint\":\"{{account-prefix}}-ats.iot.{{region}}.amazonaws.com\",\"iotCredEndpoint\":\"{{account-prefix}}.credentials.iot.{{region}}.amazonaws.com\",\"awsRegion\":\"{{region}}\",\"iotRoleAlias\":\"{{role-alias-name}}\"}"
         }
       }
     },
     "deploymentPolicies": {
       "failureHandlingPolicy": "ROLLBACK"
     }
   }
   ```

   对于尚未设置为的 Greengrass nucleus 核心设备，请**iotdata**将其`greengrassDataPlaneEndpoint`添加到合并配置中：

   ```
   "merge": "{\"iotDataEndpoint\":\"...\",\"iotCredEndpoint\":\"...\",\"awsRegion\":\"...\",\"iotRoleAlias\":\"...\",\"greengrassDataPlaneEndpoint\":\"iotdata\"}"
   ```

   将该`merge`值编码为 JSON 字符串。使用反斜杠 () `\"` 对所有内部引号进行转义。在创建部署之前，使用 JSON 验证工具验证语法。

1. 运行以下命令来创建部署。

   ```
   aws greengrassv2 create-deployment \
     --cli-input-json file://switch-deployment.json
   ```

## 预计将发生的情况
<a name="switch-connectivity-what-to-expect"></a>

在应用更改之前，nucleus 会验证与新端点的连接。如果设备无法连接到新的端点，则部署将失败，并且设备仍与源帐户保持连接。

Nucleus 使用客户端 ID `{{thing-name}}#endpoint-switch` 进行飞行前连接检查。

应用配置后，Nucleus 将测试与新端点的连通性。如果连接失败，Nucleus 会自动回滚到原始配置。源账户`FAILED`中的部署报告。

如果连接切换成功，则部署将在源帐户`SUCCEEDED`中报告。 AWS IoT Greengrass 在与新终端节点关联的账户和区域中创建核心设备。

**注意**  
在连接切换期间，nucleus 会重新启动对令牌交换服务有硬依赖性的组件。此重启会刷新来自新 AWS IoT 凭证端点的证书。Nucleus 不会重启其他组件，它们会继续以现有状态运行。

## 验证交换机
<a name="switch-connectivity-verify"></a>

部署完成后，验证连接交换机是否成功。

**验证连接开关**

1. 检查源账户中的部署状态。设备连接到新端点`SUCCEEDED`后，部署会报告。

   ```
   aws greengrassv2 list-effective-deployments \
     --core-device-thing-name {{thing-name}}
   ```

1. 验证核心设备是否出现在目标帐户中。打开[AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)或运行以下命令。

   ```
   aws greengrassv2 get-core-device \
     --core-device-thing-name {{thing-name}}
   ```

切换后， AWS IoT 事物和核心设备记录仍保留在源帐户中。要防止 future 部署以该设备为目标，请将其从来源账户的事物组中移除。

如果部署状态不是`SUCCEEDED`，请查看设备上的 Greengrass `{{/greengrass/v2}}/logs/greengrass.log` 日志，了解错误详情。有关与连接交换机操作相关的常见错误代码，请参阅[详细的部署错误代码](troubleshooting-deployment.md)。