【问题标题】:Check env variables in serverless.yml file (Serverless Framework)检查 serverless.yml 文件中的环境变量(无服务器框架)
【发布时间】:2018-07-18 06:51:32
【问题描述】:

我是使用无服务器框架的新手,我想检查 serverless.yml 中的环境变量是否根据我所处的阶段而变化。这是我在 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} 进行部署时。是否有使用不同环境和无服务器框架的最佳实践?

提前致谢!

【问题讨论】:

    标签: node.js serverless-framework


    【解决方案1】:

    插件?

    如果您想绑定 无服务器 生命周期事件并做一些事情,一种典型的方法是 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 文件中。

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2017-10-10
      • 2019-08-27
      • 2018-04-25
      相关资源
      最近更新 更多