最近serverless和faas的文章不少,各大云厂商都在推广,看着人手痒痒,无奈业务开发没有使用云服务,而是使用了内部k8s集群。因此决定本身搭建faas。说来容易,说干就干!javascript
其实内部早就开始了,一直想写篇文章,无奈业务太忙,总算抽了点时间分享下。java
怎样实现将任意一个函数成为一个接口node
不管是函数仍是接口本质上是想通的,都有输入
和输出
。 接口的请求做为函数的输入,函数的输出做为接口的返回值,完美!chrome
函数怎么运行呢?浏览器
还好nodejs自己实现了本身的VM,很开心的把代码丢给vm来运行,great!安全
打住!你觉得这就解决问题了吗?bash
node官方明确指出,请不要使用VM
运行不信任的代码,你的同事的代码可信吗?来自大佬的发问。less
网上找了一圈发现这行代码,你的服务就挂掉了,这怎么能够?函数
new vm.Script('this.constructor.constructor("return process")().exit()')
复制代码
相信社区的力量是伟大的,又发现了VM2
,如获至宝,正如他的官方slogan那样ui
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
关心的同窗能够持续关注进展哦,后面会考虑将核心开源!
目前内部实现的功能