自定义函数与依赖包整体下发
在编写函数时,我们常常会需要引用第三方依赖,本文将介绍如何把代码以及第三方依赖上传至云端 BOS,并在函数应用中引入该函数。
本文将以 Python3.6 为例进行说明。
配置项创建
代码开发
在将代码上传到云端前,我们需要先在开发机上开发和测试代码。
我们编写的用例是获取 https://cloud.baidu.com/ 的 headers 信息,新建一个文件夹,代码文件命名 index.py
,代码如下:
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4import requests
5
6def handler(event, context):
7 """
8 data: {"action": "A"}
9 """
10 if 'action' in event:
11 if event['action'] == 'A':
12 r = requests.get('https://cloud.baidu.com/')
13 if str(r.status_code) == '200':
14 event['info'] = dict(r.headers)
15 else:
16 event['info'] = 'exception found'
17 else: event['info'] = 'action error'
18 else:
19 event['error'] = 'action not found'
20
21 return event
可以看到我们用到了 requests
库,接下来我们需要把 requests
源码下载到此文件夹内,命令行输入:
1pip3 download requests
下载完成之后,我们发现文件夹内有多个 .whl 结尾的压缩包。
解压 .whl 压缩包,得到源码。
1unzip -d . "*.whl"
这样我们就得到了源码,但压缩包和 .dist-info 并不是我们所需要的,为了使文件体积尽量的小,我们可以把这些文件删除,命令行输入:
1rm -rf *.whl *.dist-info
然后我们进行一个简单的测试,看下 index.py
是否可以正确的输出我们想要的内容。
在此文件夹下新建一个 test.py
文件,代码内容如下:
1import index
2
3event = {}
4event['action'] = "A"
5print(index.handler(event, ""))
可以看到正确输出了我们想要的 handler 内容,测试完成我们可以删除此文件。
将 index.py
和5个源码文件夹压缩成ZIP包,然后上传到云端 BOS。
创建配置项
我们需要创建"配置项"来引入上步中上传到 BOS 的函数。
我们需要设置配置项函数标签,表示这个是一个函数配置项,可供函数应用引用。
然后选择"引入文件",选中刚才上传到 BOS 的文件,并选择"解压",点击确定,完成导入操作。
应用创建
创建函数应用,并选择上步创建的配置项。
新建节点
接下来我们配置边缘规则 baetyl-broker、baetyl-rule 模块来调用上述函数。
在节点创建界面,新建节点。
并将上步中创建的应用绑定到该节点上。
配置 baetyl-rule
在节点"应用部署"菜单栏,选择 baetyl-rule 模块,点击查看。
然后点击数据卷,选择第一个配置项进行配置。
baetyl-rule 的配置如下:
1rules:
2 - name: rule1
3 source:
4 topic: broker/topic1
5 target:
6 topic: broker/topic2
7 function:
8 name: bie-python/process
9
10logger:
11 level: debug
12 encoding: console
函数的完整路径是 [服务名称/函数入口] ,则上述 process 这个python函数的完整调用路径就是:bie-python/process。
配置 baetyl-broker
按照上步方法配置 baetyl-broker, 配置文件如下:
1listeners:
2 - address: tcp://0.0.0.0:8004
3principals:
4 - username: test
5 password: hahaha
6 permissions:
7 - action: pub
8 permit: ["#"]
9 - action: sub
10 permit: ["#"]
11
12logger:
13 level: info
并在 baetyl-broekr 的服务配置界面添加 8004 端口,将服务暴露到宿主机上。
上述配置成成功后,在端侧执行 kubectl 可以看到如下现象:
端侧验证
等待上述服务部署到端侧后,我们使用 mqttbox 发送消息到 baetyl-broker 来进行测试。
首先我们使用 mqttbox 连接,连接信息如下:
连接成功后,如下所示:
我们的输入用例为 {"action":"A"}
结果如图,输出结果正是请求 https://cloud.baidu.com/ 的 header 内容。