Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/globocom/functions
An Open Source Serverless Platform
https://github.com/globocom/functions
lambda lambda-functions nodejs pipeline serverless
Last synced: 4 months ago
JSON representation
An Open Source Serverless Platform
- Host: GitHub
- URL: https://github.com/globocom/functions
- Owner: globocom
- License: mit
- Created: 2016-09-27T21:19:57.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-01-11T13:39:42.000Z (6 months ago)
- Last Synced: 2024-01-15T09:32:57.938Z (5 months ago)
- Topics: lambda, lambda-functions, nodejs, pipeline, serverless
- Language: JavaScript
- Homepage:
- Size: 805 KB
- Stars: 47
- Watchers: 34
- Forks: 22
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Lists
- awesome-serverless - Backstage Functions - An Open Source Serverless Platform able to store and execute code maintained by [Globo.com](http://www.globo.com) (Others)
README
![Tests](https://github.com/globocom/functions/actions/workflows/tests.yml/badge.svg)
# Backstage Functions
Backstage Functions is an Open Source [Serverless](http://martinfowler.com/articles/serverless.html) Platform able to store and execute code.## Benefits
- 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## FAQ
- **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](https://github.com/backstage/functions-sandbox).## Running locally without Docker
### Requirements
- Redis 3.0+
- NodeJS 8.13.0### Download the project
```bash
git clone https://github.com/backstage/functions.git
```### Setup
```bash
make setup
```### Run
```bash
make run
```## Configuration
To format your log in `json`, please run:
```sh
export LOG_APP_FORMAT=json
```## Running locally via Docker
### Requirements
- Docker 1.12+
- Docker compose 1.8+### Download docker-compose.yml
```bash
mkdir functions
cd functions
curl 'https://raw.githubusercontent.com/backstage/functions/master/docker-compose.yml' > docker-compose.yml
```### Run
```bash
docker-compose up
```## How to use
### Function Structure
Your 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.#### Example of a function
```javascript
function main(req, res) {
const name = (req.body && req.body.name) || "World"
res.send({ say: `Hello ${name}!` })
}
```
### Setting a functionTo set your function, you can make a `PUT` request to `/functions/:namespace/:name`:
```bash
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*
### Deleting a function
To delete your function, you can make a `DELETE` request to `/functions/:namespace/:name`:
```bash
curl -i -X DELETE http://localhost:8100/functions/example/hello-world \
-H 'content-type: application/json'
```### Executing a function
To execute a function, you can make a `PUT` request to `/functions/:namespace/:name/run`:
```bash
curl -i -X PUT http://localhost:8100/functions/example/hello-world/run \
-H 'content-type: application/json'
```The result will be something like:
```bash
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:
```bash
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:
```bash
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!"}
```### Executing functions in a pipeline
To execute many functions in a pipeline, you can make a `PUT` request to `/functions/pipeline`:
```javascript
// Function0
function main(req, res) {\
res.send({x: req.body.x * 10});}
// Function1
function main(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:
```bash
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}
```