Load environment variables when running locally via serverless offline

1.4k Views Asked by At

I want to load env variables from .env file, when running locally, So here's my serverless.yaml file,

functions:
  health:
    handler: src/api/health.check
    name: ${self:provider.stackName}-health
    environment:
      USER_POOL_APP_CLIENT_ID: !Ref UserPoolClient

You see, it sets a userpool id that gets created in the resources section as an environment variable to a lambda. This works perfectly fine, when deployed as expected.

However, when I try to run it locally via serverless-offline, no matter how I set the env variables, via dotenv or manually, it seems to get overriden by serverless, in this case all I see is "[object object]".

Other workflows that I see, load all env variables from files, like below

functions:
  health:
    handler: src/api/health.check
    name: ${self:provider.stackName}-health
    environment:
      USER_POOL_APP_CLIENT_ID: {env:USER_POOL_APP_CLIENT_ID}

But wouldn't this require us to have variables of all stages, stored locally as files?

I was hoping to store only the dev version, locally, and have all the remaining fetched from the serverless file itself, automatically via !Ref like shown at the beginning.

So, how do I prevent, serverless from populating/polluting my env variables when I run locally, while sticking to the first format?

Or are there other better ways to handle this?

1

There are 1 best solutions below

0
On

It happened here with the new version of serverless-offline (v12.0.4).

My solution was to use: https://www.serverless.com/plugins/serverless-plugin-ifelse

See the example below:

serverlessIfElse:
- If: '"${env:NODE_ENV}" == "development"'
  Set:
    functions.health.environment.USER_POOL_APP_CLIENT_ID: "${env:USER_POOL_APP_CLIENT_ID, ''}"

You can change it for your use case.