检查serverless.yml文件中的环境变量(Serverless Framework)

时间:2018-06-22 15:29:32

标签: node.js serverless-framework

我对使用无服务器框架是陌生的,我想检查serverless.yml中的env变量是否根据我所处的阶段而变化。这是我在serverless.yml中拥有的:

service: items

custom:
  customDomain:
    domainName: api.app.com
    certificateName: '*.api.app.com'
    basePath: ''
    stage: ${self:provider.stage} <=== (Variable to check)
    createRoute53Record: true
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: true
  serverless-iam-roles-per-function:
    defaultInherit: true
.......
provider:
      name: aws
      runtime: nodejs8.10
......
......
process_updates:
    handler: handler.processUpdates
    iamRoleStatements:
      - Effect: "Allow"
        Action:
          - s3:*
        Resource:
          - "arn:aws:s3:::${file(./config.${self:provider.stage}.json):items_updates}/*"

Config.dev.json:

{
  "items_updates": "dev-items-updates"
}

Config.prod.json:

{
  "items_updates": "prod-items-updates"
}

所以,我想知道是否有一种方法可以打印以下变量  ${self:provider.stage}${file(./config.${self:provider.stage}.json):items_updates}在进行部署时。是否有在无服务器框架中使用其他环境的最佳实践?

谢谢!

1 个答案:

答案 0 :(得分:1)

插件?

如果您想加入 Serverless 生命周期事件并进行处理,一种典型的方法是使用write a plugin

我发现Serverless插件开发的学习曲线相当温和,因此建议向没有这样做的任何Serverless用户编写一个。

但是,有时插件过大,或者由于其他原因不受欢迎。

解决方法

Serverless的一个非常方便(但经常被忽略)的功能是它可以resolve variables from javascript files.

请注意带有以下签名的导出函数:

module.exports = (serverless) => { ... }

通过该serverless对象,您可以访问各种内容:

  • 可以在serverless.processedInput.options上找到命令行参数。
  • 您的服务可以在serverless.service上找到。

具体案例

在您的情况下,您可以将${env}-items-updates数据直接放入.js函数中,或让函数读取文件。

为简单起见,我假设您愿意将数据直接填充到函数中。我还将说明仅使用单个items-updates.js文件,而不是每个阶段使用单独的文件。

items-updates.js:

module.exports = (serverless) => {
    const stage = serverless.service.provider.stage;

    serverless.cli.log(`Resolving items-updates for stage ${stage}`);

    switch (stage) {
        case 'dev':
            return {};  // Your dev-items-updates here
        case 'prod':
            return {};  // Your prod-items-updates here
    }
}

然后在您的iamRoleStatements中:

Resource:
  - ${file(./items-updates.js)}

注意:尽管上面的示例显示了默认导出,但我通常确实使用命名的导出,因此我可以在单个js文件中放置多个资源。