将 IoT Edge 上的 Azure Blob 存储模块部署到设备
适用于: IoT Edge 1.5 IoT Edge 1.4
重要
IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 IoT Edge。
有多种方法可以将模块部署到 IoT Edge 设备,并且所有这些方法都适用于 IoT Edge 上的 Azure Blob 存储模块。 两种最简单的方法是使用 Azure 门户或 Visual Studio Code 模板。
先决条件
Azure 订阅中的 IoT 中心。
IoT Edge 设备。
如果未设置 IoT Edge 设备,可在 Azure 虚拟机中创建一个。 按照创建虚拟 Linux 设备或创建虚拟 Windows 设备快速入门文章(其中一篇)中的步骤进行操作。
Azure IoT Edge 扩展。 适用于 Visual Studio Code 的 Azure IoT Edge 工具扩展处于维护模式。
如果从 Visual Studio Code 部署,则需要 Azure IoT 中心扩展。
从 Azure 门户部署
Azure 门户引导你创建部署清单并将部署推送到 IoT Edge 设备。
选择设备
- 登录 Azure 门户,导航到 IoT 中心。
- 在“设备管理”菜单下选择“设备”。
- 从列表中选择目标 IoT Edge 设备。
- 选择“设置模块” 。
配置部署清单
部署清单是一个 JSON 文档,其中描述了要部署的模块、数据在模块间的流动方式以及模块孪生的所需属性。 Azure 门户提供了一个引导你完成创建部署清单的向导。 该向导将三个步骤整理成多个选项卡:“模块”、“路由”和“查看 + 创建” 。
添加模块
在页面的“IoT Edge 模块”部分,选择“添加”下拉列表并选择“IoT Edge 模块”,以显示“添加 IoT Edge 模块”页面。
在“设置”选项卡上,提供模块的名称,然后指定容器映像 URI:
- IoT Edge 模块名称:
azureblobstorageoniotedge
- 映像 URI:
mcr.microsoft.com/azure-blob-storage:latest
如本过程所述,在“模块设置”、“容器创建选项”和“模块孪生设置”选项卡上指定值之前,请勿选择“添加” 。
重要
调用模块时,Azure IoT Edge 区分大小写,存储 SDK 也默认为小写。 为确保与 IoT Edge 上的 Azure Blob 存储模块建立的连接不会中断,请将名称更改为小写。
- IoT Edge 模块名称:
打开“容器创建选项” 选项卡。
将以下 JSON 复制并粘贴到框中,以便为设备上的存储提供存储帐户信息和装载。
{ "Env":[ "LOCAL_STORAGE_ACCOUNT_NAME=<local storage account name>", "LOCAL_STORAGE_ACCOUNT_KEY=<local storage account key>" ], "HostConfig":{ "Binds":[ "<mount>" ], "PortBindings":{ "11002/tcp":[{"HostPort":"11002"}] } } }
使用以下信息更新已复制到容器创建选项中的 JSON:
请将
<local storage account name>
替换为容易记住的名称。 帐户名长度应为 3 到 24 个字符,并带有小写字母和数字。 不含空格。将
<local storage account key>
替换为 64 字节 base64 密钥。 你可以使用 GeneratePlus 等工具生成密钥。 你可以使用这些凭据从其他模块访问 blob 存储。根据容器操作系统替换
<mount>
。 提供 blob 模块在其中存储数据的 IoT Edge 设备上卷的名称或指向现有目录的绝对路径。 存储装载将你在设备上提供的位置映射到模块中设置的位置。
对于 Linux 容器,其格式为“<你的存储路径或卷>:/blobroot”。 例如:
- 使用卷装载:
my-volume:/blobroot
- 使用绑定装载:
/srv/containerdata:/blobroot
。 确保按步骤为容器用户授予目录访问权限
重要
请勿更改存储装载值的后半部分,该部分指向 IoT Edge 模块上 Blob 存储中的特定位置。 对于 Linux 容器,存储装载必须始终以“:/blobroot”结尾。
IoT Edge不会删除附加到模块容器的卷。 此行为是符合设计的,因为它允许跨容器实例(例如升级场景)保留数据。 但是,如果这些卷保留为未使用状态,则可能会导致磁盘空间耗尽和后续系统错误。 如果你在自己的场景中使用 docker 卷,那么,建议你使用 docker 工具(如 docker 卷删除和 docker 卷 rm )来删除未使用的卷,尤其是对于生产场景。
在“模块孪生设置”选项卡上,复制以下 JSON 并将其粘贴到框中 。
{ "deviceAutoDeleteProperties": { "deleteOn": <true, false>, "deleteAfterMinutes": <timeToLiveInMinutes>, "retainWhileUploading": <true,false> }, "deviceToCloudUploadProperties": { "uploadOn": <true, false>, "uploadOrder": "<NewestFirst, OldestFirst>", "cloudStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<your Azure Storage Account Name>;AccountKey=<your Azure Storage Account Key>; EndpointSuffix=<your end point suffix>", "storageContainersForUpload": { "<source container name1>": { "target": "<your-target-container-name>" } }, "deleteAfterUpload": <true,false> } }
使用适当的值配置每个属性,如占位符所示。 如果使用 IoT Edge 模拟器,请按照 deviceToCloudUploadProperties 和 deviceAutoDeleteProperties 中所述,将这些属性的值设置为相关环境变量。
提示
target
容器的名称具有命名限制,例如不支持使用$
前缀。 若要查看所有限制,请参阅容器名称。注意
在
storageContainersForUpload
中,如果容器目标未命名或为 null,则会为目标分配默认名称。 如果要停止将内容上传到容器,则必须将其完全从storageContainersForUpload
中删除。 有关详细信息,请参阅使用 IoT Edge 上的 Azure Blob 存储在边缘存储数据的deviceToCloudUploadProperties
部分。有关在部署模块后配置 deviceToCloudUploadProperties 和 deviceAutoDeleteProperties 的信息,请参阅编辑模块孪生。 若要详细了解所需属性,请参阅定义或更新所需属性。
选择“添加” 。
在完成时选择“下一步: 路由”继续转到路由部分。
指定路由
保留默认路由并选择“下一步: 查看 + 创建”继续转到查看部分。
评审部署
评审部分介绍了根据上述两部分中的选择所创建的 JSON 部署清单。 另外还有两个模块已声明但却未添加,它们是: $edgeAgent 和 $edgeHub。 这两个模块构成 IoT Edge 运行时,且是每个部署中所需的默认设置。
查看部署信息,然后选择“创建” 。
验证部署
创建部署后,返回到 IoT 中心的“设备”页。
- 选择用作部署目标的 IoT Edge 设备,以打开其详细信息。
- 在设备详细信息,检查 Blob 存储模块是否列出为“在部署中指定”和“由设备报告”。
可能需要花费片刻时间,模块才会在设备上启动并向 IoT 中心发回报告。 刷新页面以查看更新的状态。
从 Visual Studio Code 部署
Azure IoT Edge 在 Visual Studio Code 中提供模板,以帮助你开发边缘解决方案。 使用以下步骤创建带有 Blob 存储模块的新 IoT Edge 解决方案,并配置部署清单。
重要
Azure IoT Edge Visual Studio Code 扩展处于维护模式。
选择“查看”>“命令面板” 。
在“命令面板”中,输入并运行 Azure IoT Edge:New IoT Edge solution 命令。
按命令面板中的提示创建解决方案。
字段 值 选择文件夹 在适用于 Visual Studio Code 的开发计算机上选择用于创建解决方案文件的位置。 提供解决方案名称 输入解决方案的描述性名称,或者接受默认的 EdgeSolution。 选择模块模板 选择“现有模块(输入完整映像 URL)”。 提供模块名称 输入模块的全小写名称,例如 azureblobstorageoniotedge。
必须对 IoT Edge 上的 Azure Blob 存储模块使用小写名称。 引用模块时,IoT Edge 区分大小写,存储 SDK 默认为小写。提供模块的 Docker 映像 提供映像 URI:mcr.microsoft.com/azure-blob-storage:latest Visual Studio Code 采用你提供的信息,创建一个 IoT Edge 解决方案,然后在新窗口中加载它。 解决方案模板创建包含 blob 存储模块映像的部署清单模板,但需要配置模块的创建选项。
在新的解决方案工作区中打开 deployment.template.json ,然后找到“模块” 部分。 进行以下配置更改:
复制以下代码并将其粘贴到 blob 存储模块的
createOptions
字段中:```json "Env":[ "LOCAL_STORAGE_ACCOUNT_NAME=<local storage account name>", "LOCAL_STORAGE_ACCOUNT_KEY=<local storage account key>" ], "HostConfig":{ "Binds": ["<mount>"], "PortBindings":{ "11002/tcp": [{"HostPort":"11002"}] } }
请将
<local storage account name>
替换为容易记住的名称。 帐户名长度应为 3 到 24 个字符,并带有小写字母和数字。 不含空格。将
<local storage account key>
替换为 64 字节 base64 密钥。 你可以使用 GeneratePlus 等工具生成密钥。 你可以使用这些凭据从其他模块访问 blob 存储。根据容器操作系统替换
<mount>
。 提供卷的名称或 IoT Edge 设备上希望 blob 模块在其中存储其数据的目录绝对路径。 存储装载将你在设备上提供的位置映射到模块中设置的位置。对于 Linux 容器,其格式为“<你的存储路径或卷>:/blobroot”。 例如:
- 使用卷装载:
my-volume:/blobroot
- 使用绑定装载:
/srv/containerdata:/blobroot
。 确保按步骤为容器用户授予目录访问权限
重要
请勿更改存储装载值的后半部分,该部分指向 IoT Edge 模块上 Blob 存储中的特定位置。 对于 Linux 容器,存储装载必须始终以“:/blobroot”结尾。
IoT Edge不会删除附加到模块容器的卷。 此行为是符合设计的,因为它允许跨容器实例(例如升级场景)保留数据。 但是,如果这些卷保留为未使用状态,则可能会导致磁盘空间耗尽和后续系统错误。 如果你在自己的场景中使用 docker 卷,那么,建议你使用 docker 工具(如 docker 卷删除和 docker 卷 rm )来删除未使用的卷,尤其是对于生产场景。
- 使用卷装载:
通过将以下 JSON 添加到 deployment.template.json 文件,为模块配置 deviceToCloudUploadProperties 和 deviceAutoDeleteProperties。 为每个属性配置适当的值并保存文件。 如果使用 IoT Edge 模拟器,请将这些属性的值设置为相关环境变量,可以在 deviceToCloudUploadProperties 和 deviceAutoDeleteProperties 的说明部分中找到这些值
"<your azureblobstorageoniotedge module name>":{ "properties.desired": { "deviceAutoDeleteProperties": { "deleteOn": <true, false>, "deleteAfterMinutes": <timeToLiveInMinutes>, "retainWhileUploading": <true, false> }, "deviceToCloudUploadProperties": { "uploadOn": <true, false>, "uploadOrder": "<NewestFirst, OldestFirst>", "cloudStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<your Azure Storage Account Name>;AccountKey=<your Azure Storage Account Key>;EndpointSuffix=<your end point suffix>", "storageContainersForUpload": { "<source container name1>": { "target": "<target container name1>" } }, "deleteAfterUpload": <true, false> } } }
有关在部署模块后配置 deviceToCloudUploadProperties 和 deviceAutoDeleteProperties 的信息,请参阅编辑模块孪生。 若要详细了解容器创建选项、重启策略和所需状态,请参阅 EdgeAgent 所需属性。
保存 deployment.template.json 文件。
右键单击“deployment.template.json” 并选择“生成 IoT Edge 部署清单” 。
Visual Studio Code 会获取你在 deployment.template.json 中提供的信息,并使用它来创建新的部署清单文件。 在解决方案工作区中的新 config 文件夹中创建部署清单。 获取该文件后,可以按照使用 Azure CLI 2.0 部署 Azure IoT Edge 模块中的步骤操作。
部署多个模块实例
若要在 IoT Edge 模块上部署 Azure Blob 存储的多个实例,需要提供不同的存储路径,并更改模块绑定到的 HostPort
值。 Blob 存储模块始终在容器中公开端口 11002,但你可以声明它在主机上绑定到的端口。
编辑“容器创建选项” (在 Azure 门户中)或 createOptions 字段(在 Visual Studio Code 的 deployment.template.json 文件中),更改 HostPort
值:
"PortBindings":{
"11002/tcp": [{"HostPort":"<port number>"}]
}
连接到其他 blob 存储模块时,请将终结点更改为指向更新的主机端口。
配置代理支持
如果组织使用代理服务器,则需要为 edgeAgent 和 edgeHub 运行时模块配置代理支持。 此过程涉及两项任务:
- 在设备上配置运行时守护程序和 IoT Edge 代理。
- 为部署清单 JSON 文件中的模块设置 HTTPS_PROXY 环境变量。
将 IoT Edge 设备配置为通过代理服务器进行通信中介绍了此过程。
此外,blob 存储模块还需要清单部署文件中的 HTTPS_PROXY 设置。 可以直接编辑部署清单文件,也可以使用 Azure 门户。
导航到 Azure 门户中的 IoT 中心,然后在“设备管理”菜单下选择“设备”
选择要配置模块的设备。
选择“设置模块” 。
在此页的“IoT Edge 模块”部分,选择 blob 存储模块 。
在“更新 IoT Edge 模块”页上,选择“环境变量”选项卡。
添加
HTTPS_PROXY
作为“名称”, 添加代理 URL 作为“值”。选择“更新”,然后单击“查看 + 创建”。
看到代理添加到部署清单中的模块后,选择“创建”。
通过从设备详细信息页中选择模块来验证设置,然后在“IoT Edge 模块详细信息” 页的下半部分选择“环境变量” 选项卡。
后续步骤
详细了解 IoT Edge 上的 Azure Blob 存储。
若要详细了解部署清单的工作原理及创建方式,请参阅了解如何使用、配置和重用 IoT Edge 模块。