智能边缘BIE

    如何在自定义存储卷上传第三方依赖源码并调用

    在编写函数时,我们常常会需要引用第三方依赖,本文将介绍如何把第三方依赖上传至云端存储卷,并跟随存储卷下发到设备中去。

    进行本文操作之前, 先根据 快速入门-建立核心 创建一个核心。

    本文将以 Python3.6 为例进行说明。

    自定义存储卷创建

    代码开发

    在上传到自定义存储卷之前,我们需要先在开发机上开发和测试代码。

    我们编写的用例是获取 https://baetyl.io/ 的 headers 信息,新建一个文件夹,代码文件命名 index.py,代码如下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import requests
    
    def handler(event, context):
      """
      data: {"action": "A"}
      """
      if 'action' in event:
        if event['action'] == 'A':
          r = requests.get('https://baetyl.io/')
          if str(r.status_code) == '200':
            event['info'] = dict(r.headers)
          else:
            event['info'] = 'exception found'
        else:      event['info'] = 'action error'
      else:
        event['error'] = 'action not found'
    
      return event

    可以看到我们用到了 requests 库,接下来我们需要把 requests 源码下载到此文件夹内,命令行输入:

    pip3 download requests

    download-requests01.png

    下载完成之后,我们发现文件夹内有多个 .whl 结尾的压缩包。

    download-requests02.png

    解压 .whl 压缩包,得到源码。

    unzip -d . "*.whl"

    download-requests03.png

    这样我们就得到了源码,但压缩包和 .dist-info 并不是我们所需要的,为了使文件体积尽量的小,我们可以把这些文件删除,命令行输入:

    rm -rf *.whl *.dist-info

    download-requests04.png

    index.py 和5个源码文件夹压缩成ZIP包稍后我们用于上传到自定义存储卷。

    download-request06.png

    最后我们进行一个简单的测试,看下 index.py 是否可以正确的输出我们想要的内容。

    在此文件夹下新建一个 test.py 文件,代码内容如下:

    import index
    
    event = {}
    event['action'] = "A"
    print(index.handler(event, ""))

    可以看到正确输出了我们想要的 handler 内容,测试完成我们可以删除此文件。

    download-requests05.png

    自定义存储卷创建

    进入智能边缘存储卷页面,自定义存储卷需要两个,为 bie-upload-codebie-upload-code-conf,分别是用来保存代码和配置。

    bie-upload-code 存储卷

    首先在存储卷页面点击“创建存储卷”按钮,选择模板 自定义存储卷,命名为 bie-upload-code 并点击确定。

    image.png

    进入该自定义存储卷的页面,选择 "上传存储卷ZIP包"。

    image.png

    我们选择上一步压缩好的ZIP包。

    image.png

    上传完成,我们确认一下代码相关的文件是否有遗漏。

    image.png

    确认无误,我们点击 “发布新版本” 按钮。

    image.png

    bie-upload-code-conf 存储卷

    我们在存储卷页面,点击 "创建存储卷" 按钮,取名为 bie-upload-code-conf ,模板选择baetyl模块配置。

    image.png

    存储卷默认为我们生成了 service.yml 文件, 我们点击 “查看” 输入如下配置并保存。

    functions:
      - name: 'handler'
        handler: 'index.handler'
        codedir: 'var/db/baetyl/request'

    image.png

    最后我们需要发布新版本。

    image.png

    baetyl-hub 服务的存储卷创建

    共三个存储卷,分别为:

    • bie-demo-hub-conf
    • bie-demo-hub-log
    • bie-demo-hub-data

    具体见 配置发布与下发 ,我们只需要创建这三个存储卷。

    baetyl-function-manager 服务的存储卷创建

    我们在存储卷页面,点击 "创建存储卷" 按钮,存储卷名称 bie-upload-func-conf,模板选择 baetyl模块配置

    image.png

    进入 bie-upload-func-conf 存储卷,修改 service.yml 我们输入如下配置并保存。

    hub:
      address: tcp://local-hub:1883
      username: test
      password: hahaha
    rules:
      - clientid: localfunc-1
        subscribe:
          topic: t
        function:
          name: handler
        publish:
          topic: t/handler
    functions:
      - name: handler
        service: function-request
    logger:
      path: var/log/baetyl/service.log
      level: "debug"

    image.png

    同样,最后我们需要发布新版本。

    image.png

    添加/创建 服务

    我们创建了所有需要用到的6个存储卷。

    下面我们进入智能边缘核心页面,选择我们第一步所创建的核心,进行配置。

    baetyl-hub 服务配置

    点击 "添加服务" 按钮。

    image.png

    我们取名为 local-hub,模块选择 baetyl-hub,端口映射输入 1883:1883,随后点击存储卷挂载,挂载相应的三个存储卷。

    映射端口为 1883 并不是强制的,具体映射端口与各服务配置文件保持一致即可。例如 local-hub 服务针对 tcp 连接监听 8883 端口,其他服务与 local-hub 服务建立连接时,相应连接端口也一并设置为 8883 即可。

    image.png

    image.png

    挂载 bie-demo-hub-confbie-demo-hub-logbie-demo-hub-data 三个存储卷。

    image.png

    image.png

    image.png

    最后可以看到总共是挂载了三个存储卷。

    cfc-core-hub-create08.png

    baetyl-function-manager 服务配置

    点击新增服务,我们取名为 local-function-manager,模块选择 baetyl-function-manager

    image.png

    选择挂载 bie-upload-func-conf 存储卷。

    image.png

    挂载完成。

    image.png

    baetyl-function-python36 服务配置

    点击新增服务,我们取名为 function-request,模块选择 baetyl-function-python36

    image.png

    存储卷选择挂载 bie-upload-code-confbie-upload-code

    image.png image.png

    存储卷挂载完成:

    image.png

    查看最终配置结果并发布

    服务配置完成,我们的核心服务如下图:

    image.png

    核对服务配置无误,点击“发布”按钮发布此版本。

    image.png

    发布完成,可以看到此核心目前最新版本现在为“v2”版本。

    已经下载过核心并启动,直接点击“下发”按钮,等待重启升级。

    未下载过核心可点击"下载"按钮,注意需要选择包括主程序的下载,启动的步骤可参照 快速入门

    image.png

    最后同样用 mqttbox 发送消息来进行测试,mqttbox 的使用可以参照 使用MQTTBox订阅数据检查结果 ,我们的输入用例为 {"action":“A”}, 结果如图,输出结果正是请求 https://baetyl.io/ 的 header 内容。

    66ED6AB5-531E-412F-B8DA-1FBD23E6E445.jpg

    上一篇
    存储卷预定义宏
    下一篇
    如何在自定义存储卷中添加python代码并调用