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