华为云用户手册

  • 操作步骤 登录 CTS 管理控制台。 选择左侧导航栏的“事件列表”,进入事件列表页面。 事件记录了云资源的操作详情,设置筛选条件,单击“查询”。 当前事件列表支持四个维度的组合查询,详细信息如下: 事件类型、事件来源、资源类型和筛选类型。 在下拉框中选择查询条件。其中,“事件类型”选择“管理事件”,“事件来源”选择“IEF”。 图1 设置筛选条件 其中, 筛选类型选择“按资源ID”时,还需手动输入某个具体的资源ID,目前仅支持全字匹配模式的查询。 筛选类型选择“按资源名称”时,还需选择或手动输入某个具体的资源名称。 操作用户:在下拉框中选择某一具体的操作用户。 事件级别:可选项为“所有事件级别”、“Normal”、“Warning”、“Incident”,只可选择其中一项。 时间范围:可选项为“最近1小时”、“最近1天”、“最近1周”和“自定义时间段”,本示例选择“最近1周”。 在需要查看的事件左侧,单击图标展开该事件的详细信息。 图2 展开事件 在需要查看的事件右侧,单击“查看事件”,弹出一个窗口,显示了该操作事件结构的详细信息。 关于 云审计 事件结构的关键字段详解,请参见“事件结构”。
  • HTTP请求检查 向容器发送HTTP GET请求,如果探针收到2xx或3xx,说明容器是健康的。 例如下图这个配置,IEF会在容器启动10秒(延迟时间)后,发送HTTP GET请求到“http://{实例IP}/healthz:8080”,如果在2秒(超时时间)内没有响应则视为检查失败;如果请求响应的状态码为2xx或3xx,则说明容器是健康的。 这里无需填写主机地址,默认直接使用实例的IP(即往容器发送请求),除非您有特殊需求。 图1 HTTP请求检查
  • 操作场景 IEF支持从边缘节点上报消息到云端。 您可以将消息发送到边缘节点SystemEventBus(MQTT broker)的自定义Topic中,IEF会将这些数据转发到DIS通道或APIG后端地址。数据转发到DIS通道或者APIG后端地址后,您可以提取这些数据,并对数据进行处理分析。 本章节使用DIS端点作为示例,APIG端点的使用方法类似,主要分如下几个步骤。 创建消息端点 购买DIS接入通道 创建消息路由 发送消息
  • 示例 $hw/events/device/ab39361a-6fc0-4c94-b919-72b1e08ca690/twin/get/result{ "event_id":"123456", "timestamp":1557317510926, "twin":{ "state":{ "expected":{ "value":"stop", "metadata":{ "timestamp":1557316778931 } }, "optional":true, "metadata":{ "type":"string" } } } }
  • Topic $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 参数 类型 说明 project_id String 项目ID。获取方式请参见获取项目ID。 encryptdata_name String 加密数据集名称。 properties_name String 加密数据的“键名”。
  • 示例 $hw/events/device/ab39361a-6fc0-4c94-b919-72b1e08ca690/twin/update{ "event_id":"123457", "twin":{ "state":{ "actual":{ "value":"stop" } } } }
  • 示例 $hw/events/device/ab39361a-6fc0-4c94-b919-72b1e08ca690/twin/update{ "event_id":"123457", "twin":{ "state":{ "actual":{ "value":"stop" } } } }
  • 示例 终端设备绑定到边缘节点时可收到如下消息。 $hw/events/node/{node_id}/membership/updated{ "event_id":"04a975ab-fd51-49be-85f5-5967e994f640", "timestamp":1557314742136, "added_devices":[ { "id":"ab39361a-6fc0-4c94-b919-72b1e08ca690", "name":"IEF-device", "state":"unknown", "attributes":{ "address":{ "value":"xxx", "optional":true, "metadata":{ "type":"string" } } }, "twin":{ "state":{ "expected":{ "value":"running", "metadata":{ "timestamp":1557314434570 } }, "optional":true, "metadata":{ "type":"string" } } } } ], "removed_devices":null }
  • 云端修改孪生属性控制终端设备状态 图3 修改终端设备状态 在IEF中修改终端设备的孪生属性,IEF将终端设备期望状态(Expected State)发送给边缘节点的EdgeHub。 EdgeHub发送终端设备期望状态消息到DeviceTwin,DeviceTwin在边缘节点存储终端设备期望状态。 终端设备实时发消息给MQTT broker查询终端设备期望状态。 EventBus接收到从MQTT broker发过来的消息。 EventBus根据消息去查询终端设备期望状态。 DeviceTwin反馈当前终端设备期望状态给EventBus。 EventBus发送设终端备期望状态的结果给MQTT broker。 终端设备从MQTT broker收到订阅消息,根据期望状态调整实际状态。
  • 约束与限制 边缘节点磁盘占用超过70%时,会启动镜像回收机制回收容器镜像占用的磁盘空间,此时部署容器应用会导致容器启动变慢,请在部署容器应用前规划好边缘节点磁盘空间。 创建容器应用时,边缘节点会从 容器镜像服务 拉取镜像,如果镜像超大且边缘节点下载带宽较小,容器镜像没有拉取完成,从而导致控制台上容器应用显示创建失败。虽然应用创建失败,但容器镜像拉取不会中断,等容器镜像拉取成功后,容器应用的状态会刷新为创建成功。此情况下也可以先将容器镜像拉取到边缘节点,然后再创建容器应用。 容器镜像的架构必须与节点架构一致,比如节点为x86,那容器镜像的架构也必须是x86。 铂金版可将应用实例数量修改为零。
  • 状态说明 批量应用升级作业有以下八种状态。 排队中:作业等待执行 执行中:作业处于执行状态 成功:全部任务执行成功 部分成功:部分任务执行成功 失败:全部任务执行失败 停止中:作业处于停止中 已停止:作业已停止 更新超时:作业排队和执行时间超过10分钟仍未完成 批量作业执行过程中可以停止,停止后可以继续。 如果批量作业执行失败、部分成功或更新超时,可以重试执行作业,将未执行成功的作业再次执行一遍。
  • 操作步骤 在边缘节点上执行如下命令修改EdgeCore配置,并保存。 vi /opt/IEF/Edge-core/conf/edge.yaml 支持配置的参数如下表所示: 表1 参数说明 组件 参数 说明 取值 edge-core interface-name 网卡名称 默认:eth0 internal-server 内置mqtt broker监听地址 tls://lo:8883,tls://docker0:8883 image-gc-high-threshold 触发镜像垃圾回收的磁盘使用率百分比 默认:80 image-gc-low-threshold 镜像垃圾回收试图释放资源后达到的磁盘使用率百分比 默认:40 swr-url 拉取镜像的代理地址 默认:"" 更改完配置之后,重启EdgeCore。 systemctl restart edgecore
  • 终端设备上报实际状态到云端 终端设备上报实际状态到云端的过程如图2所示。 图2 设备上报状态 终端设备将实际状态(Actual State)实时上报给MQTT broker。 EventBus从MQTT broker收到订阅消息,消息内容包含终端设备的实际状态。 EventBus把终端设备实际状态发送给DeviceTwin,DeviceTwin在边缘节点存储终端设备实际状态。 DeviceTwin同步实际状态给WebSocket客户端EdgeHub。 EdgeHub发送消息给IEF。
  • 参数说明 参数 类型 说明 event_id String 事件ID timestamp Int64 事件发生事件戳 twin Object 设备孪生变更信息集合,每个孪生以key/value形式存在。value中包含是否可选、孪生metadata包含类型信息、孪生期望状态包含期望值和更新时间、孪生真实状态包含真实值和更新时间等。 delta Map 包含设备孪生期望值与真实值不同的孪生名称和期望值。
  • 配置边缘节点环境 以具备sudo权限的用户登录边缘节点。 GPU驱动配置。 如果边缘节点使用GPU,您需要安装并配置GPU驱动,详细方法请参见安装并配置GPU驱动。 NPU驱动配置。 如果边缘节点使用昇腾AI加速处理器,请确保已安装对应驱动。 在边缘节点上安装Docker并检查Docker状态。 Docker版本必须高于17.06,推荐使用18.06.3版本。请勿使用18.09.0版本Docker,该版本存在严重bug,如果已使用此版本,请尽快升级。 Docker安装完成后,可以执行docker -v命令检查Docker是否安装正常,如果回显如下则说明安装正常。 # docker -vDocker version 19.03.12, build 48a66213fee 配置边缘节点防火墙规则。 检查边缘节点防火墙状态。 systemctl status firewalldfirewall-cmd --state 回显中,not running表示关闭,running表示开启。 如果防火墙开启,您需要打开8883端口,或关闭防火墙。 打开8883端口。 firewall-cmd --add-port=8883/tcp --permanent systemctl restart firewalld 关闭防火墙。 systemctl disable firewalld systemctl stop firewalld
  • 示例 终端设备绑定到边缘节点时可收到如下消息。 $hw/events/device/{device_id}/twin/update/delta{ "event_id":"b9625811-f34f-4252-bee9-98185e7e1ec7", "timestamp":1557314742131, "twin":{ "state":{ "expected":{ "value":"running", "metadata":{ "timestamp":1557314742122 } }, "optional":true, "metadata":{ "type":"string" } } }, "delta":{ "state":"running" } }
  • 安全提示 为提升主机安全性,建议您对边缘节点进行操作系统加固,可参考: 设置所有OS系统密码(包括管理员和普通用户)、数据库账号密码、应用(WEB)系统管理账号密码为强密码,密码12位以上。强密码设置请参见账户密码最佳实践。 应用程序不以管理员权限账号运行,应用程序(如Web)不使用数据库管理员权限账号与数据库交互。设置安全组,仅向公网开放必要端口,业务WEB控制台端口、局域网内部通信端口避免暴露在公网。关闭高危端口(如SSH端口),或采取限制允许访问端口的源IP、使用VPN/ 堡垒机 建立的运维通道等措施消减风险。 业务数据定期异地备份,避免黑客入侵主机造成数据丢失。 定期检测系统和软件中的安全漏洞,及时更新系统安全补丁,将软件版本升级到官方最新版本。 建议从官方渠道下载安装软件,对非官方渠道下载的软件,建议使用杀毒软件扫描后再运行。 如果使用的是华为云 E CS ,可参考: 将主机登录方式设置为密钥登录,密钥登录设置请参见主机密码被暴力破解的解决方案。 使用华为云官方提供的管理检测与响应服务进行全面的安全体检或使用 企业主机安全 服务深度防御。
  • 示例 当用户名为test的时候,才可以使用该策略。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "ief:deployment:create", "ief:appVersion:update", "ief:deployment:update", "ief:application:create" ], "Condition": { "StringEquals": { "ief:AssumeUserName": [ "test" ] } }, "Resource": [ "ief:*:*:deployment:*", "ief:*:*:appVersion:*", "ief:*:*:application:*" ] } ]}
  • 示例流程 图1 给用户授权IEF权限流程 创建用户组并授权 在 IAM 控制台创建用户组,并授予IEF只读权限“IEF ReadOnlyAccess”。为用户组授权时,作用范围选择“区域级项目”,然后根据以下原则设置: 在个别区域授权:选择指定的一个或多个项目,例如“cn-north-4 [华北-北京四]”。注意:此场景选择“所有项目”时,授权将不生效。 在所有区域授权:选择“所有项目”。 图2 在个别区域授权 图3 在所有区域授权 创建用户并加入用户组 在IAM控制台创建用户,并将其加入1.创建用户组并授权中创建的用户组。 用户登录并验证权限。 新创建的用户登录控制台,验证IEF服务的管理员权限。
  • 状态说明 批量应用部署作业有以下八种状态。 排队中:作业等待执行 执行中:作业处于执行状态 成功:全部任务执行成功 部分成功:部分任务执行成功 失败:全部任务执行失败 停止中:作业处于停止中 已停止:作业已停止 更新超时:作业排队和执行时间超过10分钟仍未完成 批量作业执行过程中可以停止,停止后可以继续。 如果批量作业执行失败、部分成功或更新超时,可以重试执行作业,将未执行成功的作业再次执行一遍。
  • 状态说明 批量应用部署作业有以下八种状态。 排队中:作业等待执行 执行中:作业处于执行状态 成功:全部任务执行成功 部分成功:部分任务执行成功 失败:全部任务执行失败 停止中:作业处于停止中 已停止:作业已停止 更新超时:作业排队和执行时间超过10分钟仍未完成 批量作业执行过程中可以停止,停止后可以继续。 如果批量作业执行失败、部分成功或更新超时,可以重试执行作业,将未执行成功的作业再次执行一遍。
  • 上报设备属性实际值 发布终端设备孪生更新事件。 Topic:$hw/events/device/{device_id}/twin/update Payload:{"event_id":"", "timestamp":0, "twin":{"属性":{"actual":{"value":"设备实际值"}}}} 示例如下: { "event_id": "", "timestamp": 0, "twin": { "temperature": { "actual": { "value": "2" } } }} 发布后,在云端可以观察到设备孪生的实际值发生了相应的变化,如图2所示。 图2 孪生属性值发生变化 在边缘侧订阅设备孪生更新结果,能收到设备孪生更新事件的结果。 Topic:$hw/events/device/{device_id}/twin/update/result 更新的结果如下所示。 { "event_id": "", "timestamp": 1554992093859, "twin": { "temperature": { "actual": { "value": "2", "metadata": { "timestamp": 1554992093859 } }, "optional": true, "metadata": { "type": "int" } } }}
  • 加密数据的使用 加密数据绑定到边缘节点后,在边缘节点上使用MQTT客户端就可以获取到加密数据。 请求时必须使用证书进行安全认证,认证方法请参见使用证书进行安全认证。 订阅获取加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 发布请求加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 请求发布后,1中就能收到解密后的明文数据。
  • MQTT broker 终端设备可以通过MQTT协议与IEF云端进行通信,您也可以通过发送/订阅消息控制终端设备。 边缘节点上有一个内置MQTT broker,内置MQTT broker使用8883端口与终端设备通信,与内置MQTT broker通信需要经过安全认证,具体请参见使用证书进行安全认证。 另外,边缘节点还支持与外置MQTT broker通信,即在边缘节点上安装一个MQTT broker(如开源的Mosquitto,默认使用1883端口通信)。 如使用外置MQTT broker,请注意需要保证外置MQTT broker通信的端口能正常使用。
  • MQTT Topic 终端设备与边缘节点、IEF的通信都是通过给MQTT broker中转消息实现的,在MQTT broker中,默认提供如表1所示的Topic(消息主题),上报状态、控制终端设备状态都是通过发送/订阅消息实现的。 应用程序编写完后,可以通过应用部署功能,将应用从IEF中部署到边缘节点,详情请参见容器应用管理。 表1 IEF提供的默认Topic 名称 使用类型 Topic 说明 设备孪生变更 订阅 $hw/events/device/{device_id}/twin/update/document 设备孪生更新文档,当孪生变化时,反映孪生变化前、变化后的区别。 设备孪生delta 订阅 $hw/events/device/{device_id}/twin/update/delta 设备孪生delta事件,当孪生变化时,反映期望值与真实值不一致的孪生信息。 设备成员变更 订阅 $hw/events/node/{node_id}/membership/updated 绑定终端设备关系变化。 设备属性变更 订阅 $hw/events/device/{device_id}/updated 终端设备属性更新。 设备成员获取 发布 $hw/events/node/{node_id}/membership/get 绑定终端设备关系获取。 设备成员获取结果 订阅 $hw/events/node/{node_id}/membership/get/result 绑定终端设备关系获取结果。 设备孪生获取 发布 $hw/events/device/{device_id}/twin/get 设备孪生获取。 设备孪生获取结果 订阅 $hw/events/device/{device_id}/twin/get/result 设备孪生获取结果。 设备孪生更新 发布 $hw/events/device/{device_id}/twin/update 设备孪生更新。 设备孪生更新结果 订阅 $hw/events/device/{device_id}/twin/update/result 设备孪生更新结果。 请求加密数据 发布 $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 发布获取加密数据请求。 获取加密数据 订阅 $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 订阅获取加密数据。 添加告警 发布 $hw/alarm/{appname}/add 向 AOM 发送告警。 清除告警 发布 $hw/alarm/{appname}/clear 清除AOM中告警。 自定义Topic 发布 {project_id}/nodes/{node_id}/user/{custom_topic} 自定义Topic,Topic根据您的需要自行定义。 您可以将终端设备数据发送到边缘节点MQTT broker的自定义Topic中,IEF会将这些数据转发到DIS通道或APIG后端地址。数据转发到DIS通道或者APIG后端地址后,您可以提取这些数据,并对数据进行处理分析。 接下来将介绍如何在边缘侧获取终端设备信息,接收云上的控制消息,以及如何将终端设备数据上报到云端。MQTT收发消息的示例代码请参见Go语言代码样例和Java语言代码样例。
  • 获取设备孪生 向设备孪生获取发送请求获取设备孪生。 Topic:$hw/events/device/{device_id}/twin/get Payload:{"event_id":"自定义id"} 向设备孪生获取结果订阅设备孪生的返回结果。 Topic:$hw/events/device/{dvice_id}/twin/get/result 获取的结果如下: { "event_id": "", "timestamp": 1554988425592, "twin": { "humidity": { "expected": { "value": "0", "metadata": { "timestamp": 1554988419529 } }, "optional": true, "metadata": { "type": "int" } }, "temperature": { "expected": { "value": "0", "metadata": { "timestamp": 1554988419529 } }, "optional": true, "metadata": { "type": "int" } } }}
  • 获取节点关联的终端设备成员 向设备成员获取发送获取终端设备成员消息的请求。 Topic:$hw/events/node/{node_id}/membership/get Payload:{"event_id":"自定义ID"} 示例如下: $hw/events/node/{node_id}/membership/get{"event_id":""} 向设备成员获取结果订阅终端设备成员的返回结果。 Topic:$hw/events/node/{node_id}/membership/get/result 返回结果示例如下: { "event_id": "", "timestamp": 1554986455386, "devices": [ { "id": "2144773f-13f1-43f5-af07-51991d4fd064", "name": "equipmentA", "state": "unknown", "attributes": { "name": { "value": "a", "optional": true, "metadata": { "type": "string" } } } } ]}
  • 监听设备孪生事件 通过获取节点关联的终端设备成员和获取设备孪生以后,即可获取到节点绑定的终端设备ID,随后即可监听该终端设备的事件。 在云端更新设备孪生属性,设置期望值从而达到控制边侧终端设备的目的。 例如某个设备有两个孪生属性,humidity和temperature。 图1 孪生属性 在“设备孪生”页签中编辑孪生属性,将humidity由9改为10。属性修改完成以后,在端侧可收到两个事件:“设备孪生变更事件”和“设备孪生delta事件”。 设备孪生变更事件:包含变更前和变更后的设备孪生信息详情。 设备孪生delta事件:包含设备孪生的详情信息以及设备孪生属性期望值与实际值不一致的delta部分。 订阅这两个Topic,就可以收到变更设备孪生的消息。 订阅设备孪生变更。 Topic:$hw/events/device/{device_id}/twin/update/document 在边侧收到变更消息如下: { "event_id": "0f921313-4074-46a2-96f6-aac610721059", "timestamp": 1555313685831, "twin": { "humidity": { "last": { "expected": { "value": "9", "metadata": { "timestamp": 1555313665978 } }, "optional": true, "metadata": { "type": "int" } }, "current": { "expected": { "value": "10", "metadata": { "timestamp": 1555313685831 } }, "optional": true, "metadata": { "type": "int" } } }, "temperature": { "last": { "expected": { "value": "0", "metadata": { "timestamp": 1555313665978 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } }, "current": { "expected": { "value": "0", "metadata": { "timestamp": 1555313685831 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } } } }} 订阅设备孪生delta。 Topic:$hw/events/device/{device_id}/twin/update/delta 在边侧收到变更消息如下: { "event_id": "60fb5baf-d4ad-47b0-a21e-8b57b52d0978", "timestamp": 1555313685837, "twin": { "humidity": { "expected": { "value": "10", "metadata": { "timestamp": 1555313685831 } }, "optional": true, "metadata": { "type": "int" } }, "temperature": { "expected": { "value": "0", "metadata": { "timestamp": 1555313685831 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } } }, "delta": { "humidity": "10", "temperature": "0" }}
  • 密钥的使用 您可以在创建容器应用高级配置中选择数据存储时使用Secret。 图2 使用密钥 Secret挂载到容器后,会根据Secret的内容在挂载目录下创建文件,每条密钥数据(属性名-属性值)为一个文件,其中属性名即文件的名称,属性值为文件的内容。例如Secret的属性名为“key”,属性值为“ZXhhbXBsZSB2YWx1ZQ==”,这条Secret挂载到/tmp0目录下,那么挂载成功后,在/tmp0录下就存在一个名为“key”的文件,其内容为“example value”。
  • 设备孪生(DeviceTwin) 终端设备通常包含两类数据: 一是不会改变的元数据,包括序列号、资产标识符、Mac地址等描述设备信息的数据。这种数据也可以称为终端设备的静态属性或设备属性。 另一类是终端设备的动态数据,包括特定背景下的终端设备专有实时数据,例如灯的开、关状态。这种数据也可以称为终端设备的孪生属性。 设备孪生具有与物理设备相同的特性,便于终端设备与应用之间进行更好地通信。应用发送的命令首先到达设备孪生,设备孪生根据应用设置的Expected State(期望的状态)进行状态更新,此外终端设备实时反馈自身的Actual State(真实的状态),设备孪生同时记录终端设备的Actual State和Expected State 。这种方式也使终端设备在离线状况下再次上线时,终端设备的状态也能得到同步。 图2 DeviceTwin 在IEF中可以创建终端设备,并能将终端设备与边缘节点关联,关联后会在边缘节点上保存被关联设备的属性和孪生信息。边缘节点上的应用程序可在边缘节点获取终端设备属性、设备孪生信息、以及修改终端设备孪生期望值和真实值。同时IEF负责同步云、边的孪生信息,当有冲突时,将以边缘侧的修改为主。 详细的终端设备状态边云协同机制请参见设备孪生工作原理。
共99354条