pedalpete
pedalpete

Reputation: 21536

Set environment variables from external file in serverless.yml

I'm using serverless and serverless-local for local development.

I've got an external file which holds references to environment variables which I retrieve from node.env in my app.

From what I understand, I should be able to set my environment variables such as

dev:
   AWS_KEY: 'key',
   SECRET: 'secret
test:
   AWS_KEY: 'test-key',
   SECRET: 'test-secret',
etc:
   ...

and have those environment variables included in my app through the following line in my serverless.yml

provider:
  name: aws
  runtime: nodejs4.3
  stage: ${opt:stage, self:custom.default_stage}
  deploymentBucket: serverless-deploy-packages/${opt:stage, self:custom.default_stage}
  environment: 
    ${file(./serverless-env.yml):${opt:stage, self:custom.default_stage}}

then in the commandline, I call

serverless offline --stage dev --port 9000

I thought this would include the correct vars in my app, but it isn't working. Is this not how it is supposed to work? Am I doing something wrong here?

Upvotes: 13

Views: 12971

Answers (5)

rilian
rilian

Reputation: 186

This is how you can separate your environments by different stages:

serverless.yml:

custom:
  test:
    project: xxx
  prod:
    project: yyy

provider:
  ...
  stage: ${opt:stage, 'test'}
  project: ${self:custom.${opt:stage, 'test'}.project}
  environment:
    ${file(.env.${opt:stage, 'test'}.yml):}

package:
  exclude:
    - .env.*

.env.test.yml:

VARIABLE1: value1
VARIABLE2: value2

During deploy, pass --stage=prod or skip and test project will be deployed. Then in your JS code you can access ENV variables with process.env.VARIABLE1.

Upvotes: 9

Jinu George
Jinu George

Reputation: 11

Set Lambda environment variables from JSON file ( using AWS CLI)

aws lambda update-function-configuration --profile mfa --function-name test-api --cli-input-json file://dev.json

Upvotes: 1

DavidWells
DavidWells

Reputation: 132

You can also now use remote async values with the serverless framework. See https://serverless.com/blog/serverless-v1.13.0/

This means you can call values from s3 or remote databases etc.

Example:

serverless.yml

service: serverless-async-vars

provider:
  name: aws
  runtime: nodejs6.10

custom:
  secret: ${file(./vars.js):fetchSecret} # JS file running async / promised

vars.js

module.exports.fetchSecret = () => {
  // async code
  return Promise.resolve('SomeSecretKey');
}

Upvotes: 9

Zanon
Zanon

Reputation: 30710

From docs:

You can set the contents of an external file into a variable:

file: ${file(./serverless-env.yml)}

And later you can use this new variable to access the file variables.

secret: file.dev.SECRET

Or you can use the file directly:

secret: ${file(./serverless-env.yml):dev.SECRET}

Upvotes: 9

pedalpete
pedalpete

Reputation: 21536

I had this correct, but I was referencing the file incorrectly.

I don't see this in the docs, but passing a file to environment will include the files yaml file, and the above structure does work.

Upvotes: 0

Related Questions