【问题标题】:Set environment variables from external file in serverless.yml从 serverless.yml 中的外部文件设置环境变量
【发布时间】:2017-10-10 01:23:04
【问题描述】:

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

我有一个外部文件,其中包含对我从应用程序中的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

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

【问题讨论】:

    标签: environment-variables yaml serverless-framework


    【解决方案1】:

    来自docs

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

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

    以后你可以使用这个新变量来访问文件变量。

    secret: file.dev.SECRET
    

    或者你可以直接使用文件:

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

    【讨论】:

    • 文档不完整,尽管它“可以”按照您的描述完成,但比需要的更冗长。将值直接传递给 yaml 中的环境条目确实有效,我只是在文件指向的位置出错,这显然不会导致 yaml 中的错误。
    【解决方案2】:

    您现在还可以在无服务器框架中使用远程异步值。见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');
    }
    

    【讨论】:

      【解决方案3】:

      这是您可以按不同阶段分隔环境的方法:

      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 变量。

      【讨论】:

      • 你也可以用${self:custom.${self:provider.stage}.project}替换${self:custom.${opt:stage, 'test'}.project}
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我的这个是正确的,但是我错误地引用了文件。

        我在文档中没有看到这一点,但是将文件传递给 environment 将包含文件 yaml 文件,并且上述结构确实有效。

        【讨论】:

        • 我尝试了你的方法,它有效。但问题是我收到这样的错误Cannot create property 'PORT' on string '${file....etc file path 知道吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 2014-12-17
        • 2013-10-20
        • 2021-05-16
        • 2022-07-20
        • 1970-01-01
        相关资源
        最近更新 更多