Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/blubblub/serverless-nest-monorepo
Plugin to run NestJS Apps from Nest Monorepo
https://github.com/blubblub/serverless-nest-monorepo
Last synced: about 2 months ago
JSON representation
Plugin to run NestJS Apps from Nest Monorepo
- Host: GitHub
- URL: https://github.com/blubblub/serverless-nest-monorepo
- Owner: blubblub
- License: mit
- Created: 2022-02-10T14:44:56.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2023-09-10T07:30:20.000Z (over 1 year ago)
- Last Synced: 2024-11-01T07:41:13.645Z (2 months ago)
- Language: JavaScript
- Size: 29.3 KB
- Stars: 20
- Watchers: 2
- Forks: 5
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Serverless Nest Monorepo Plugin
Plugin that adds support to run NestJS Apps from Nest Monorepo, which is set up using Nest CLI with several microservices.
**This plugin allows you to use Serverless framework with each microservice from monorepo. Each microservice gets separate configuration for Serverless framework.**
Nest monorepo usually looks like this:
- apps/
- service1
- service2
- service3
- lib/
- library1
- library2
- node_modules/
- dist/
- apps/
- service1
- service2
- service3It is build using `nest build ` command and generates webpacked JavaScript file from TypeScript in `dist/apps/service1` directory. Node modules are in root directory as are `nest-cli.json` or other configuration files.
This structure is fairly incompatible with Serverless framework `serverless`, since it does not work very good with microservices.
## Installation
1. Install with npm in monorepo root:
`npm install --save-dev serverless-nest-monorepo`
2. Move existing serverless.yml file from monorepo root to correct NestJS app. Place it in `apps/service1` directory.
`mv serverless.yml apps/service1/serverless.yml`
*There are no updates needed in previous serverless.yml, if it worked from root of the directory. All paths should remain based on root.*
3. Create a new serverless.yml file in monorepo root then add the plugin to your root serverless.yml file:
```
service: ''useDotenv: true # Remove if not in use
plugins:
- serverless-nest-monorepoprovider:
name: aws
runtime: nodejs14.xframeworkVersion: '3'
plugins:
- serverless-nest-monorepo
```
*Both `provider` and `service` settings are ignored, but are there for main Serverless framework config validation, since plugins are loaded after configuration.*## Usage
Once root `serverless.yml` is set up and each microservice you wish to run has `serverless.yml` in it's app directory, run `serverless mono` from the root. Command has two required parameters:
- `nestApp` Nest app to run
- `command` Serverless command to run (interactive not supported yet)Example 1: Run `serverless offline` for microservice `service1`
```
serverless mono --nestApp service1 --command offline
```Example 2: Deploy microservice `service3`
```
serverless mono --nestApp service3 --command deploy
```Example 2: Remove microservice `service3`
```
serverless mono --nestApp service3 --command remove
```### Caveats
- If you are using `useDotenv: true`, ensure you set it to true in root `serverless.yml` and a symlink will be created for correct NestJS microservice.
- It was only tested using Serverless Framework **version 3**.
- Config in root must pass serverless's configuration check, so a provider must be picked. Both name and runtime are ignored in the root file.
- Ensure you implemented handler correctly in your Nest microservice.
- It is suggested to add `.tml.yml` to .gitignore, as the plugin creates symbolic links to prevent commiting them to repository.
- Microservice `serverless.yml` paths need to be based on root, not where file resides.
- It might affect the workings of other plugins.### How it works?
Once `serverless mono` command is executed the flow is following:
1. NestJS app is build using `nest build ` command, generating `dist/apps//main.js` file.
2. A temporary symbolic link (`ln -s`) is created in the root to the serverless file at: `apps//serverless.yml`. The original file remains untouched.
3. A temporary symbolic link is created in the root to the `.env` file to the env at `apps//.env` if `useDotenv` is set to true.
4. Serverless framework is executed in a separate child process using the command passed with `--command` parameter. STDOUT is displayed.
5. Cleanup is done.## TODO
- Check if serverless.yml for microservice exists before linking.
- Pass STDIN input to enable interactive plugins.
- Catch SIGABRT from user for to correctly cleanup links.