如何使用 Azure CLI 自动迁移 IoT 中心

使用 Azure CLI 将 IoT 中心迁移到新区域、新层或新配置。

如果想要执行以下操作,本文中的步骤将会非常有用:

  • 从免费层升级到基本层或标准层 IoT 中心。
  • 将 IoT 中心移动到新区域。
  • 将 IoT 中心状态信息导出为备份。
  • 增加 IoT 中心的分区数目。
  • 为开发环境而不是生产环境设置中心。

比较自动和手动迁移步骤

本文的结果类似于如何使用 Azure 资源管理器模板迁移 Azure IoT 中心,但过程不同。 在开始之前,请确定适用于方案的过程。

  • Azure CLI 过程(本文):

    • 迁移设备注册表、路由和终结点信息,以及其他配置详细信息,例如 IoT Edge 部署或自动设备管理配置。
    • 迁移少量设备(例如,最多 10,000 台)更轻松。
    • 不需要 Azure 存储帐户。
    • 收集路由和文件上传终结点的连接字符串,并将其包含在 ARM 模板输出中。
  • 手动过程:

    • 迁移设备注册表以及路由和终结点信息。 必须在新的 IoT 中心手动重新创建其他配置详细信息。
    • 迁移大量设备(例如,超过 100,000 台)的速度更快。
    • 使用 Azure 存储帐户传输设备注册表。
    • 从 ARM 模板输出中清理路由和文件上传终结点的连接字符串,而且需要手动重新添加这些字符串。

先决条件

  • Azure CLI

    本文中所述的功能需要 0.20.0 或更高版本的 azure-iot 扩展。 要检查扩展版本,请运行 az --version。 若要更新扩展,请运行 az extension update --name azure-iot

    如果仍然安装旧版 azure-cli-iot-ext 扩展,请先移除该扩展,然后再添加 azure-iot 扩展。

IoT 中心状态

在谈到迁移 IoT 中心的状态时,我们指的是三个方面的组合:

  • Azure 资源管理器 (ARM) 资源。 这是可在资源模板中定义的所有内容,并且与从 Azure 门户中的 IoT 中心导出资源模板时获取的信息相同。 作为 Azure 资源管理器方面的一部分所捕获的信息包括:

    • 内置事件中心的保留时间
    • 证书
    • 云到设备属性
    • 禁用设备 SAS
    • 禁用本地身份验证
    • 启用文件上传通知
    • 文件上传存储终结点
    • 标识
      • 用户分配的标识
      • 系统分配的标识(已启用或已禁用)
    • 网络规则集
    • 路由
      • 自定义终结点
      • 回退路由
      • 路由
    • 标记
  • 配置。 此方面适用于未在 ARM 模板中表示的 IoT 中心的各个方面。 具体而言,此方面涵盖了自动设备管理配置和 IoT Edge 部署。

  • 设备。 此方面表示设备注册表中的信息,其中包括:

    • 设备标识和孪生
    • 模块标识和孪生

未在此处列出的任何 IoT 中心属性或配置可能无法正确导出或导入。

导出 IoT 中心的状态

使用 az iot hub state export 命令将 IoT 中心的状态导出到 JSON 文件。

如果要在一个命令中同时运行导出和导入步骤,请参阅本文后面的迁移 IoT 中心部分。

在导出 IoT 中心的状态时,可以选择导出哪些方面。

参数 详细信息
--aspects 要导出的状态方面。 指定一个或多个接受的值:arm配置设备。 如果忽略此参数,则导出所有三个方面。
--state-file -f 写入状态信息的文件的路径。
--replace -r 如果包含此参数,则 export 命令将覆盖状态文件的内容。
--hub-name -n
or
--login -l
源 IoT 中心的名称(-n)或源 IoT 中心的连接字符串(-l)。 如果同时提供两者,则连接字符串优先。
--resource-group -g 源 IoT 中心资源组的名称。

以下示例可将 IoT 中心状态的所有方面导出到名为 myHub-state 的文件:

az iot hub state export --hub-name myHub --state-file ./myHub-state.json

以下示例仅导出 IoT 中心状态的设备和 Azure 资源管理器方面,并覆盖现有文件的内容:

az iot hub state export --hub-name myHub --state-file ./myHub-state.json --aspects arm devices --replace

导出终结点

如果选择导出 IoT 中心的 Azure 资源管理器方面,则 export 命令会检索具有基于密钥身份验证的任何终结点的连接字符串,并将其包含在输出 ARM 模板中。

export 命令还会检查所有终结点,以验证它连接到的资源是否仍然存在。 如果不存在,则不会导出该终结点以及使用该终结点的任何路由。

导入 IoT 中心的状态

使用 az iot hub state import 命令将状态信息从导出的文件导入到新的或现有 IoT 中心。

如果要在一个命令中同时运行导出和导入步骤,请参阅本文后面的迁移 IoT 中心部分。

参数 详细信息
--aspects 要导入的状态方面。 指定一个或多个接受的值:arm配置设备。 如果忽略此参数,则导入所有三个方面。
--state-file -f 导出的状态文件的路径。
--replace -r 如果包含此参数,则 import 命令将删除目标中心的当前状态。
--hub-name -n
or
--login -l
目标 IoT 中心的名称(-n),或目标 IoT 中心的连接字符串(-l)。 如果同时提供两者,则连接字符串优先。
--resource-group -g 目标 IoT 中心资源组的名称。

以下示例会将所有方面导入到新的 IoT 中心,如果尚不存在,则会创建该中心:

az iot hub state import --hub-name myNewHub --state-file ./myHub-state.json

以下示例仅将设备和配置方面导入到必须已经存在的新 IoT 中心,并覆盖任何现有的设备和配置:

az iot hub state import --hub-name myNewHub --state-file ./myHub-state.json --aspects devices configurations --replace

通过状态导入创建新的 IoT 中心

可以使用 az iot hub state import 命令创建新的 IoT 中心或写入到现有 IoT 中心。

如果要创建新的 IoT 中心,则必须在导入命令中包含 arm 方面。 如果命令中未包含 arm,并且目标中心不存在,则导入命令将失败。

如果目标中心不存在,则导入命令还需要使用 --resource-group 参数。

通过状态导入更新现有 IoT 中心

如果目标 IoT 中心已存在,则 az iot hub state import 命令不需要 arm 方面。 如果确实包含了 arm 方面,则除以下在创建中心后无法更改的属性外,将会覆盖所有资源属性:

  • 位置
  • SKU
  • 内置事件中心分区计数
  • 数据驻留
  • 功能

如果在导入命令中指定了 --resource-group,并且它不同于 IoT 中心的当前资源组,则该命令会失败,因为它会尝试创建一个与已存在的中心同名的新中心。

如果在导入命令中包含 --replace 标记,则在上传中心状态之前,将从目标中心移除以下 IoT 中心方面:

  • ARM:将删除目标中心上的任何已上传证书。 如果证书存在,则需要更新实体标记。
  • 设备:删除所有设备和模块(包括边缘和非边缘)。
  • 配置:删除所有 ADM 配置和 IoT Edge 部署。

迁移 IoT 中心

使用 az iot hub state migrate 命令将一个 IoT 中心的状态迁移到新的或现有的 IoT 中心。

此命令可将导出和导入步骤包装到单个命令中,但没有输出文件。 导出 IoT 中心的状态导入 IoT 中心的状态部分中介绍的所有指导和限制也适用于 state migrate 命令。

例如,如果要迁移包含许多设备的设备注册表(例如,数百台或数千台),则可能会发现单独运行导出和导入命令要比运行迁移命令更简单、更快。

参数 详细信息
--aspects 要迁移的状态方面。 指定一个或多个接受的值:arm配置设备。 如果忽略此参数,则迁移所有三个方面。
--replace -r 如果包含此参数,则迁移命令将删除目标中心的当前状态。
--destination-hub --dh
or
--destination-hub-login --dl
目标 IoT 中心的名称(--dh),或目标 IoT 中心的连接字符串(--dl)。 如果同时提供两者,则连接字符串优先。
--destination-resource-group --dg 目标 IoT 中心资源组的名称。 如果目标中心不存在,则需要使用目标资源组。
--origin-hub --oh
or
--origin-hub-login --ol
源 IoT 中心的名称(--oh)或源 IoT 中心的连接字符串(--ol)。 如果同时提供两者,则连接字符串优先。 使用连接字符串可避免必须登录到 Azure CLI 会话。
--origin-resource-group --og 源 IoT 中心资源组的名称。

以下示例可将源中心的所有方面迁移到目标中心,如果目标中心不存在,则会创建该中心:

az iot hub state migrate --origin-hub myHub --origin-resource-group myGroup  --destination-hub myNewHub --destination-resource-group myNewGroup

排查迁移问题

如果无法导出或导入设备或配置,请检查是否有权访问这些属性。 验证访问权限的一种方法是运行 az iot hub device-identity listaz iot hub configuration list 命令。

如果 az iot hub state migrate 命令失败,可尝试单独运行导出和导入命令。 这两个命令会分别生成与 migrate 命令相同的功能,但通过单独运行它们,可以查看根据 import 命令创建的状态文件。

后续步骤

有关对 IoT 中心内的标识注册表执行批量操作的详细信息,请参阅导入和导出 IoT 中心设备标识