如何搭建自己的faas?

5,672 阅读2分钟

缘起

最近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已经开源,可以查看下一篇文章

实践

目前内部实现的功能