我是使用无服务器框架的新手,我想检查 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}/*"

配置.dev.json:
{
  "items_updates": "dev-items-updates"
}

配置.prod.json:
{
  "items_updates": "prod-items-updates"
}

所以,我想知道是否有办法打印以下变量
${self:provider.stage}${file(./config.${self:provider.stage}.json):items_updates} 部署发生时。是否有在无服务器框架中使用不同 env 的最佳实践?

提前致谢 !

最佳答案

插入?
如果您想与 Serverless 生命周期事件联系起来并做一些事情,一种典型的方法是 write a plugin
我发现无服务器插件开发的学习曲线非常温和,并建议向任何没有这样做的无服务器用户编写一个。
然而,有时插件是矫枉过正的,或者由于其他原因而不受欢迎。
解决方法
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 文件中。

    关于node.js - 检查 serverless.yml 文件中的 env 变量(无服务器框架),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50991250/

    10-10 18:59