FaaS Shell
FaaS Shell is a shell for Serverless Function Workflow, which is a common abstraction layer on top of FaaS Infrastructures to execute multiple workflow languages across multiple clouds.
Faas Shell compiles workflow language and generate workflow DSL. Then FaaS Shell interpreter executes the workflow DSL. This architecture aims at enabling Multi Cloud Strategy which exploits the most attractive features from each provider beyond vendor agnostic solution.
Faas Shell also has REPL, which allows us to develop workflow interactively typing DSL directly into the prompt.
FaaS Shell currently supports one workflow language as the first step, and five FaaS infrastructures.
- Workflow Language
- FaaS Infrastructure
You can run your Amazon State Language workflow code created in AWS Step Functions in anywhere, and your workflow can call not only AWS Lambda but also functions in other FaaS Infrastructures.
Quick Start
-
Create Serverless Function Workflow
Create a Lambda State Machine by following AWS Step Functions tutorial. And save the statemachine as “hello_world_task.json”.
Assume “hello_world_task.json” looks like below except the region “us-east-2” and the account id “410388484666”:
{ "Comment": "A Hello World example of the Amazon States Language using a Task state", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource":"arn:aws:lambda:us-east-2:410388484666:function:hello", "End": true } } }
The lambda function “arn:aws:lambda:us-east-2:410388484666:function:hello” is defined in Nodejs 6.10 as below:
'use strict'; console.log('Loading function'); exports.handler = (event, context, callback) => { console.log('Received event:', JSON.stringify(event, null, 2)); var name = event.name || 'World'; callback(null, {payload: 'Hello, ' + name + '!'}); };
-
Set your AWS Access Keys to environment variables.
How to get the AWS Access Keys is described in Managing Access Keys for Your AWS Account.
$ export AWS_ACCESS_KEY_ID=AAAAAAAAAAAAAAAAAAAA $ export AWS_SECRET_ACCESS_KEY=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-
Start Faas Shell
$ docker run -d -p 5984:5984 apache/couchdb $ docker run -d --net=host -v /tmp:/logs \ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ nao16t/faasshell
- Set the proxy environment variables if you are in private network.
$ export HTTP_PROXY="http://id:pw@proxy.example.com:8080" $ export HTTPS_PROXY="https://id:pw@proxy.example.com:8433" $ export NO_PROXY="localhost,127.0.0.1,0.0.0.0,172.17.0.1" $ docker run -d --net=host -v /tmp:/logs \ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ -e HTTP_PROXY=$HTTP_PROXY \ -e HTTPS_PROXY=$HTTPS_PROXY \ -e NO_PROXY=$NO_PROXY \ nao16t/faasshell
- Set the proxy environment variables if you are in private network.
-
Execute the Serverless Function Workflow
- Set the access information
$ DEMO=ec29e90c-188d-11e8-bb72-00163ec1cd01:0b82fe63b6bd450519ade02c3cb8f77ee581f25a810db28f3910e6cdd9d041bf $ FAASSHELL_APIHOST=http://127.0.0.1:8080
- Register “hello_world_task.json”, then DSL is generated as the
value of “dsl” key.
$ curl -ksX PUT ${FAASSHELL_APIHOST}/statemachine/hello_world_task.json \ -H 'Content-Type: application/json' -d @hello_world_task.json -u $DEMO { "asl": { "Comment":"A Hello World example of the Amazon States Language using a Task state", "StartAt":"HelloWorld", "States": { "HelloWorld": { "End":true, "Resource":"arn:aws:lambda:us-east-2:410388484666:function:hello", "Type":"Task" } } }, "dsl":"fsm([task('HelloWorld',\"arn:aws:lambda:us-east-2:410388484666:function:hello\",[])])", "name":"hello_world_task.json", "namespace":"demo", "output":"ok" }
- Execute the DSL, the result is returned as the value of the output key.
$ curl -ksX POST ${FAASSHELL_APIHOST}/statemachine/hello_world_task.json?blocking=true \ -H 'Content-Type: application/json' -d '{"input": {"name": "Curl"}}' -u $DEMO { "asl": { "Comment":"A Hello World example of the Amazon States Language using a Task state", "StartAt":"HelloWorld", "States": { "HelloWorld": { "End":true, "Resource":"arn:aws:lambda:us-east-2:410388484666:function:hello", "Type":"Task" } } }, "dsl":"fsm([task('HelloWorld',\"arn:aws:lambda:us-east-2:410388484666:function:hello\",[])])", "input": {"name":"Curl"}, "name":"hello_world_task.json", "namespace":"demo", "output": {"payload":"Hello, Curl!"} }
- Set the access information
Getting Started
Quick Start showed just AWS Lambda case. Other FaaS provider cases are covered by Getting started.
Getting started also explains how to deploy function making use of each provider’s CLI, how to build and deploy FaaS Shell, how to use REST API, and etc.
Samples directory contains some examples in each provider’s sub-directory based on the following State Machine Template.
- Hello world (pass state)
- Hello world (task state)
- Wait state
- Retry failure
- Parallel
- Catch failure
- Choice state
- Job Status Poller
- Task Timer
Demo
-
This demonstrates that one state machine calls hello function of each FaaS provider in sequential or in parallel.
-
This demonstrates that the statemachine invokes IFTTT Applet as a task and saves the result into Google sheets.
-
This shows how to execute the above “IFTTT as FaaS” demo in REPL, interactive shell environment.
-
This demonstrates how a long running process hosted outside of FaaS interacts with Activity Task State.
-
Event State is an extention of Amazon State Language. This demonstrates how an event triggers function in Event State.
-
In case of Artificial Intelligence services, specific service has different characteristics, strength and weakness, each other among providers. As an example, this demo presents translation service evaluation workflow among providers using an ambiguous sentence.