A module for simplifying development with aws lambda by providing a pattern for modularizing the pre-processing that typically takes place before core business logic is executed (e.g. initialization, authentication/authorization, http header injection...etc.)
Prerequisites: Node.js >=8
, npm version 6+.
You can install the http module using npm:
$ npm install @aws-lambda/flow --save
The following example shows a lambda flow that adds two handlers before executing the main business logic of the lambda function. This illustrates how one can succinctly reuse common pre-tasks like loading a configuration or publishing a cloudwatch metric:
'use strict';
const Flow = require("@aws-lambda/flow").HTTPFlow;
module.exports.basic = (event, context, callback) => {
// instantiate new flow object with lambda parameters
let basicFlow = new Flow(event, context, callback);
// add common functionality that always occurs before the core business logic
// (these are fictional handlers used for illustrative purposes)
basicFlow.add(configLoader);
basicFlow.add(cloudWatchReporter)
// add core business logic
basicFlow.add((event, context, handlerFlow) => {
// access config that was injected by configLoader
let dataSource = handlerFlow.state.config.dataSource;
doDatabaseWork(dataSource);
// complete the flow
handlerFlow.success();
});
};
The following example shows an http lambda flow that adds handlers that are typically used in web flows where an http request needs to be authorized, the request body / paramters need to be parsed, and headers (in this example security headers) need to be added to the response:
'use strict';
const HTTPFlow = require("@aws-lambda/flow").HTTPFlow;
module.exports.hello = (event, context, callback) => {
let flow = new HTTPFlow(event, context, callback);
// add an authorizer and security header injector into the flow ()
flow.add(configLoader);
flow.add(authorizer);
flow.add(securityHeaders);
flow.add(requestValidator);
flow.add((event, context, handlerFlow) => {
/* *
* Since request validation was handled by first flow,
* we can access the name field directly from the state and
* add it to the response.
*/
handlerFlow
.response
.body({
message: "Hello " + handlerFlow.state.name + "!"
});
// complete flow with success
handlerFlow.success();
});
flow.execute();
};