serverless-offline-env
Version:
Use environment variables that are defined in .env or in your serverless.yml within Serverless Offline plugin
196 lines (163 loc) • 6.21 kB
Markdown
# Serverless Offline Env
This is a serverless offline plugin extension.
It gives the ability to make local development environment easier & cleaner by reducing
the potentially extra configuration required for local environments within `serverless.yml`.
Imagine you have environment variables defined for dev, staging and prod environments. You might need "local"
environments in order to make your local development easy.
This plugin can add / override environment variables configured in `serverless.yml` regardless of current
environment / stage only when `serverless offline` starts.
**Why?**
* Serverless Offline plugin wasn't copying my AWS profile.
* I wanted ability to have different environment variables when I run `sls offline` (or `serverless offline`) without
adding yet another set of environment / stage variables for local.
**WARNING:** This plugin changes environment variables only for `serverless offline` when you start it. It will not
affect other `sls` commands like `deploy`.
### Documentation
* [Installation](#installation)
* [Usage](#usage)
### Installation
Install the plugin:
via yarn;
```bash
yarn add --dev serverless-offline-env
```
or using npm;
```bash
npm install --save-dev serverless-offline-env
```
Add the plugin to your `serverless.yml` file:
```yaml
plugins:
- serverless-offline-env
- serverless-offline
```
**Warning:** `serverless-offline-env` must be added before `serverless-offline`. Order is important.
See [usage](#usage) for options.
### Usage
#### Options
| Option | Type | Description |
| -------------|--------|------------------------------------------------------------------------------------------|
| path | string | Relative path (to the project root) of a `.env` file |
| environment | object | key - value environment variables and their values |
| include | array | list of environment variables to include, rest of the environment variables will excluded|
| exclude | array | list of environment variables to be excluded |
| replace | object | replace environment variable key to given value |
No option is mandatory.
* If you don't have a `path` or `environment` defined, and you use `include`, `exclude` it will attempt to load `.env`
file under the project root.
#### YAML Configuration
```yaml
custom:
serverless-offline-env:
# Global configuration (available for all functions)
functions:
myFunc:
# Function specific configuration
```
#### CLI
When running `sls offline` command you can define path variable globally by;
```bash
sls offline --env-path .env
```
### Examples
Before we dive further in, first `.env` files can include very sensitive information. These kinds of files should never
be committed. Read [Important Topic About Env Files](#important-topic-about-env-files) for more information.
Let's imagine we have following `.env` file;
```
ENV=dev
DATABASE_URL='http://127.0.0.1'
DATABASE_PORT=3306
DATABASE_USER=my-user
DATABASE_PASS=123456
THIS_IS_CLI_ONLY=some-cli-only-value
```
#### Example 1: Loading `.env` Globally
```yaml
custom:
serverless-offline-env:
path: .env
```
#### Example 2: Globally Specifying Variables
```yaml
custom:
serverless-offline-env:
# path / include / exclude not defined thus no file will be loaded
environment:
ENV: local
DATABASE_URL: ${env:LOCAL_DATABASE_URL}
```
#### Example 3: Include Only Selected Variables
```yaml
custom:
serverless-offline-env:
# path is not defined, by default will attempt to load `.env` under project root
include:
- ENV
- DATABASE_URL
```
#### Example 4: Exclude Selected Variables, Include Rest
```yaml
custom:
serverless-offline-env:
path: .env.local # instead of .env, we are specifying another file
exclude:
- THIS_IS_CLI_ONLY
```
#### Example 5: Replace Selected Variable Names
```yaml
custom:
serverless-offline-env:
path: /envs/.env.local # remember, it is relative to the project root
replace:
DATABASE_URL: DYNAMODB_URL
```
Now we can access in our lambda functions **DYNAMODB_URL** as environment variable instead of **DATABASE_URL**.
#### Example 6: Overwriting Variable From `.env`
```yaml
custom:
serverless-offline-env:
path: .env # load the file
environment:
ENV: local # overwrite ENV variable's value
```
#### Example 7: Function Specific
All options are available to functions as well;
```yaml
custom:
serverless-offline-env:
functions:
myFunc: # function name must be the same as your functions definition.
environment:
BUCKET_NAME: test
```
#### Example 8: Overwrite Global Environment Variable's Value
```yaml
custom:
serverless-offline-env:
environment:
BUCKET_NAME: read-only-bucket
functions:
myFunc: # function name must be the same as your functions definition.
environment:
BUCKET_NAME: write-only-bucket
```
## Important Topic About `.env` Files
This file under local development environments usually contains developer specific, sensitive information.
You should never commit this file to a repository as you would be exposing these sensetive information to the world /
other people to see.
Remember to add your `.env` file to your `.gitignore` file.
Let's say we have `.env` under project root (don't worry, I generated these texts similar to what you would get from AWS)
```
AWS_ACCESS_KEY_ID=4T2RREEDW5EO3INFGY87
AWS_SECRET_ACCESS_KEY=VkzMCqNS/5mgQYEZavt3U8tWz8vb3tqQugAD4ttR
```
Now, we can create `.env.dist` (or something similar like `.env.example`) to clean up the sensitive information
and commit that sample file for other developers to reference it and create their own using it.
`.env.dist` file example;
```
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
```
#### Inspiration
This plugin inspired by [serverless-offline-dotenv](https://www.npmjs.com/package/serverless-offline-dotenv). I just
needed a little different approach.