1.0.1 • Published 2 years ago

@microbackend/plugin-serverless-aws v1.0.1

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

@microbackend/plugin-serverless-aws

Microbackend plugin to add support for the serverless framework.

Installation

npx microbackend plugin add @microbackend/plugin-serverless-aws

Usage

Serverful/Serverless switch

import createPluginConfig from "@microbackend/plugin-core/build/webpack.build";

await createPluginConfig({
  pluginOptions: {
    "@microbackend/plugin-serverless-aws": {
      isEnabled: process.env["INFRASTRUCTURE"] === "serverless",
      serverfulConfig: {
        entry: path.resolve("src", "index.ts"),
        mode: "development",
        output: { path: path.join(__dirname, "build"), filename: "index.js" },
      },
      serverlessConfig: {},
    },
  },
});

This plugin allows running the application in both serverful and serverless modes, depending on whether isEnabled is true or false. In the entry file, we will need to make some modification to the server start code:

import { createExpressApp } from "@microbackend/plugin-express";
import startServerfulApp from "@microbackend/plugin-serverless-aws";
import express from "express";
import { Server } from "http";

let server: Server;

export const handler = startServerfulApp({
  getApp: () => {
    return createExpressApp().then((app) => {
      app.get("/", (...[, res]) => {
        res.sendStatus(204);
      });

      app.use(((err, _req, res, _next) => {
        res.status(err.status || 500).json({ error: err.message });
      }) as express.ErrorRequestHandler);

      return app;
    });
  },
  startApp: async ({ app }) => {
    const port = process.env["PORT"] || 3001;

    server = app.listen(port, () => {
      console.log("Started example server on port", port);
    });
  },
});

The startServerfulApp function abstracts away the work needed to switch between serverful and serverless. We can then add some scripts to our package.json:

{
  "scripts": {
    "build": "webpack",
    "build:sls": "cross-env INFRASTRUCTURE=serverless sls package",
    "deploy": "cross-env INFRASTRUCTURE=serverless sls deploy",
    "start": "webpack --watch",
    "start:sls": "cross-env INFRASTRUCTURE=serverless sls invoke local--function core"
  }
}

In the above example, the serverful/serverless switch is determined using the process.env["INFRASTRUCTURE"] flag, but it is up to us how we want to implement it.

Configuration generation

Running:

npx microbackend gen

will generate a serverless.yml file in the current project directory, if there is not yet an existing file. It serves as a base for you to add on, and is not meant to be an one-size-fits-all configuration.