缘起
最近serverless和faas的文章很多,各大云厂商都在推广,看着人手痒痒,无奈业务开发没有使用云服务,而是使用了内部k8s集群。所以决定自己搭建faas。说来容易,说干就干!
其实内部早就开始了,一直想写篇文章,无奈业务太忙,总算抽了点时间分享下。
一句话需求
怎样实现将任意一个函数成为一个接口
分析
无论是函数还是接口本质上是想通的,都有输入
和输出
。 接口的请求作为函数的输入,函数的输出作为接口的返回值,完美!
函数运行
函数怎么运行呢?
还好nodejs本身实现了自己的VM,很开心的把代码丢给vm来运行,great!
打住!你以为这就解决问题了吗?

node官方明确指出,请不要使用VM
运行不信任的代码,你的同事的代码可信吗?来自大佬的发问。
网上找了一圈发现这行代码,你的服务就挂掉了,这怎么可以?
new vm.Script('this.constructor.constructor("return process")().exit()')
相信社区的力量是伟大的,又发现了VM2
,如获至宝,正如他的官方slogan那样
vm2 is a sandbox that can run untrusted code with whitelisted Node's built-in modules. Securely!
大佬跑过来问,你相信他是安全就一定安全吗?跑到issue里面一看,然后一试,这次还好服务没挂,但是似乎无响应
了
const {VM} = require('vm2');
new VM({timeout:1}).run(`
function main(){
while(1){}
}
毕竟已经立了flag了,难道要食盐
了吗?忍痛也要把它解掉。
沙盒安全
归根结底,沙盒不安全,即使是VM2,也不能确信他一定安全,怎么破?
ie浏览器经常崩溃,到了chrome就好很多了,为什么呢?对,没错,就是多进程模型。
举个例子: 进程就像一套房子,线程是房间,房间着火房子没了, 多进程是多套房子,毁了一套还有地方住。
我们最终的方案就是将用户不安全的代码
隔离在子进程中。


vmbox
是独立实现的管理函数运行的进程池,支持函数互相调用,并且完美的解决了死循环的问题。
vmbox
已经开源,可以查看下一篇文章。
实践
目前内部实现的功能

