在serverless.yml中设置外部文件的环境变量

时间:2017-05-11 07:04:44

标签: environment-variables yaml serverless-framework

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

我有一个外部文件,其中包含我在我的应用中从node.env检索的环境变量的引用。

根据我的理解,我应该能够设置我的环境变量,例如

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

并通过我的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}}

然后在命令行中,我打电话给

serverless offline --stage dev --port 9000

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

5 个答案:

答案 0 :(得分:4)

现在,您还可以使用无服务器框架的远程异步值。见https://serverless.com/blog/serverless-v1.13.0/

这意味着您可以从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 = () => {
  // async code
  return Promise.resolve('SomeSecretKey');
}

答案 1 :(得分:2)

来自docs

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

INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 26.149s
INFO: Final Memory: 26M/1357M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
Language of file 'hybrid/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVUIWebViewEngine/CDVUIWebViewNavigationDelegate.h' can not be decided as the file matches patterns of both sonar.lang.patterns.c++ : **/*.cxx,**/*.cpp,**/*.cc,**/*.c,**/*.hxx,**/*.hpp,**/*.hh,**/*.h and sonar.lang.patterns.objc : **/*.h,**/*.m
ERROR:
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.
bash-4.1$

稍后您可以使用此新变量来访问文件变量。

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

或者您可以直接使用该文件:

secret: file.dev.SECRET

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我说得对,但我错误地引用了该文件。

我在文档中没有看到这一点,但是将文件传递给environment将包含文件yaml文件,并且上述结构可以正常工作。

答案 4 :(得分:0)

这是按不同阶段分隔环境的方式:

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

在部署期间,通过--stage=prod或跳过,将部署test项目。然后,在您的JS代码中,您可以使用process.env.VARIABLE1访问ENV变量。