Backstage Functions is an Open Source Serverless Platform able to store and execute code.
NOTE: This is no longer maintained, please consider using other serverless engine projects like fn or OpenFaaS instead.
- Your code will be executed in an isolated environment
- You don't have to worry about infrastructure
- Functions can be called at any time by any project
Which languages are supported? Currently, only Javascript.
Is it based on events? Not yet.
How the code execution happens in an isolated way? It uses the Backstage Functions Sandbox.
- Redis 3.0+
- NodeJS 8.13.0
git clone https://github.com/backstage/functions.gitmake setupmake runTo format your log in json, please run:
export LOG_APP_FORMAT=json- Docker 1.12+
- Docker compose 1.8+
mkdir functions cd functions curl 'https://raw.githubusercontent.com/backstage/functions/master/docker-compose.yml'> docker-compose.ymldocker-compose upYour function will have a file, which you define any name you want, and it has to have a function called main, with two parameters: req and res. Req represents the Request and Res represents the Response. At the end of your code, you'll have to use the send method.
functionmain(req,res){constname=(req.body&&req.body.name)||"World"res.send({say: `Hello ${name}!`})}To set your function, you can make a PUT request to /functions/:namespace/:name:
curl -i -X PUT http://localhost:8100/functions/example/hello-world \ -H 'content-type: application/json' \ -d '{"code":"function main(req, res){\n const name = (req.body && req.body.name) || \"World\"\n res.send({say: `Hello ${name}! Nice meeting you...` })\n}\n"}'Ps: if it doesn't exists, it will be created
To delete your function, you can make a DELETE request to /functions/:namespace/:name:
curl -i -X DELETE http://localhost:8100/functions/example/hello-world \ -H 'content-type: application/json'To execute a function, you can make a PUT request to /functions/:namespace/:name/run:
curl -i -X PUT http://localhost:8100/functions/example/hello-world/run \ -H 'content-type: application/json'The result will be something like:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 22 ETag: W/"16-soBGetwJPBLt8CqWpBQu+A" Date: Tue, 11 Oct 2016 16:51:04 GMT Connection: keep-alive{"say":"Hello World!"}If one needs to pass an object in the request, the payload is executed:
curl -i -X PUT http://localhost:8100/functions/example/hello-world/run \ -H 'content-type: application/json' \ -d '{"name": "Pedro"}'The result will be something like:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 22 ETag: W/"16-Ino2/umXaZ3xVEhoqyS8aA" Date: Tue, 11 Oct 2016 17:13:11 GMT Connection: keep-alive{"say":"Hello Pedro!"}To execute many functions in a pipeline, you can make a PUT request to /functions/pipeline:
// Function0functionmain(req,res){\ res.send({x: req.body.x*10});}// Function1functionmain(req,res){res.send({x: req.body.x*20});}curl -g -i -X PUT 'http://localhost:8100/functions/pipeline?steps[0]=namespace/function0&steps[1]=namespace/function1' \ -H 'content-type: application/json' -d '{"x": 1}' Considering the curl above, the pipeline result would be like this:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 22 ETag: W/"16-Ino2/umXaZ3xVEhoqyS8aA" Date: Tue, 11 Oct 2016 17:13:11 GMT Connection: keep-alive{"x": 200}