Environment variables 从serverless.yml中的外部文件设置环境变量

Environment variables 从serverless.yml中的外部文件设置环境变量,environment-variables,yaml,serverless-framework,Environment Variables,Yaml,Serverless Framework,我使用无服务器和无服务器本地进行本地开发 我有一个外部文件,其中包含对环境变量的引用,我从我的应用程序中的node.env中检索到这些变量 据我所知,我应该能够设置环境变量,例如 dev: AWS_KEY: 'key', SECRET: 'secret test: AWS_KEY: 'test-key', SECRET: 'test-secret', etc: ... 并通过myserverless.yml中的以下行将这些环境变量包含在我的应用程序中 provid

我使用无服务器和无服务器本地进行本地开发

我有一个外部文件,其中包含对环境变量的引用,我从我的应用程序中的
node.env
中检索到这些变量

据我所知,我应该能够设置环境变量,例如

dev:
   AWS_KEY: 'key',
   SECRET: 'secret
test:
   AWS_KEY: 'test-key',
   SECRET: 'test-secret',
etc:
   ...
并通过myserverless.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}}
然后在命令行中,我调用

无服务器脱机--后台开发--端口9000

我以为这会在我的应用程序中包含正确的变量,但它不起作用。这不是它应该如何工作的吗?我做错什么了吗?

来自:

可以将外部文件的内容设置为变量:

file: ${file(./serverless-env.yml)}
稍后,您可以使用这个新变量访问文件变量

secret: file.dev.SECRET
或者您可以直接使用该文件:

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

您现在还可以在无服务器框架中使用远程异步值。看

这意味着您可以从s3或远程数据库等调用值

例如:

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=()=>{
//异步代码
返回承诺。解决('SomeSecretKey');
}

我的回答是正确的,但我引用的文件不正确


我在文档中没有看到这一点,但是将文件传递到
环境将包括yaml文件,并且上面的结构可以工作。

从JSON文件设置Lambda环境变量(使用AWS CLI)


aws lambda更新函数配置--配置文件mfa--函数名测试api--cli输入jsonfile://dev.json

这是您如何将环境按不同阶段分开的方法:

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.*
VARIABLE1: value1
VARIABLE2: value2
.env.test.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.*
VARIABLE1: value1
VARIABLE2: value2

部署期间,将部署通过
--stage=prod
或跳过
测试项目。然后,在JS代码中,您可以使用
process.ENV.VARIABLE1

访问环境变量,文档是不完整的,尽管可以按照您所描述的那样“完成”,但这比需要的更详细。将值直接传递到yaml中的环境条目确实有效,我只是在文件指向的位置出现了一个错误,这显然不会导致yaml中的错误。此外,您可以将
${self:custom.${opt:stage,'test'}.project}
替换为
${self:custom.${self provider.stage}.project}
,我尝试了您的方法,效果很好。但是问题是我遇到了这样一个错误,
无法在字符串“${file….etc”文件路径上创建属性“PORT”
知道吗?