如何在 serverless.yml 中为 lambda 使用条件配置?

How can I use conditional configuration in serverless.yml for lambda?

我需要通过 serverless.yml 配置 lambda 以针对不同的环境使用不同的配置并发。下面是我的 lambda 配置:

 myLambda:
   handler: src/lambdas
   name: myLambda
   provisionedConcurrency: ${self:custom.pc}

...

custom:
  pc: ${env:PC}

值 PC 从环境变量加载。它适用于大于 0 的值,但我无法在一个环境中设置值 0。我想做的是在 dev 环境中禁用配置并发。

我已通读此文档https://forum.serverless.com/t/conditional-serverless-yml-based-on-stage/1763/3,但它似乎对我的情况没有帮助。

如何根据环境设置 provisionedConcurrency 条件?

对于真正棘手的问题,我发现转至 Cloudformation 脚本并使用 Cloudformation 内函数很有用。

对于这种情况,如果您知道可以使用的所有环境 Fn::FindInMap

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html

或者如果只是生产需要 0,那么您可以在 Cloudformation 模板中使用条件 Fn::If 和布尔值 Condition 测试来测试环境是否等于生产,使用 0,否则使用来自 SLS 的模板化值。

潜在的 SLS:

resources:
  Conditions:
    UseZero: !Equals ["production", ${provider.stage}]
  Resources:
    myLambda:
      ProvisionedConcurrency: !If [UseZero, 0, ${self:custom.pc}]

如果需要,您也可以明确删除 ProvisionedConcurrency 属性:

resources:
  Conditions:
    UseZero: !Equals ["production", ${provider.stage}]
  Resources:
    myLambda:
      ProvisionedConcurrency: !If [UseZero, AWS::NoValue, ${self:custom.pc}]

编辑:您仍然可以使用 SLS 进行部署;它只是编译成 Cloudformation JSON 模板,您可以使用 SLS resources 字段显式修改它。

Serverless Framework 提供了一个非常有用的仪表板工具,具有称为参数的功能。本质上,它让您做的是将您的服务连接到它,然后您可以为不同的阶段设置不同的值,然后在您的 serverless.yml 中使用这些值,语法如 ${param:VARAIBLE_NANE_HERE} 并被替换在部署时为您当前部署的任何阶段提供正确的值。超级好用。仪表板中还有许多其他功能,例如监控和故障排除。

您可以在此处的官方文档中找到有关参数的更多信息:https://www.serverless.com/framework/docs/guides/parameters/

以及如何在此处开始使用仪表板:https://www.serverless.com/framework/docs/guides/dashboard#enabling-the-dashboard-on-existing-serverless-framework-services

仅在 deploy/package 期间为开发环境使用空值变量,SLS 将跳过此 属性:

provisionedConcurrency: ${self:custom.variables.provisionedConcurrency}

方法 1:通过默认值的基于阶段的变量

这是一个使用级联值变量的相当简单的技巧。第一个值是您想要的值,第二个值是默认值或后备值。也称为级联变量。

// serverless.yml
provider:
  stage: "dev"

custom:
  provisionedConcurrency:
    live: 100
    staging: 50
    other: 10

 myLambda:
   handler: src/lambdas
   name: myLambda
   provisionedConcurrency: ${self:custom.provisionedConcurrency.${self:provider.stage}, self:custom.provisionedConcurrency.other}

上面的舞台设置为开发将默认为“其他”值 10,但如果您通过 serverless deploy --stage live 设置舞台,那么它将使用实时值 100。

详情请看这里:https://www.serverless.com/framework/docs/providers/aws/guide/variables#syntax

方法 2:通过 Javascript

的异步值

您可以使用 js 包含并将条件逻辑放在那里。它被称为“异步价值支持”。基本上,这允许您将逻辑放入您包含的 javascript 文件中,并且它可以 return 不同的值,具体取决于各种事情(例如,您使用的是哪个 AWS 帐户,或者是否设置了某些变量, 管他呢)。基本上,它允许你这样做...

provisionedConcurrency: ${file(./detect_env.js):get_provisioned_concurrency}

如果您在此名为 detect_env.js 的文件夹中创建一个 javascript 文件,并且其内容类似于...

module.exports.get_provisioned_concurrency = () => {
  if ("put logic to detect which env you are deploying to, eg for live") {
    return Promise.resolve('100');
  } else {
    // Otherwise fallback to 10
    return Promise.resolve('10');
  }
}

有关详细信息,请参阅:https://www.serverless.com/framework/docs/providers/aws/guide/variables#with-a-new-variables-resolver

我觉得我必须在这里回复,即使几个月前有人问过这个问题,因为 none 的答案甚至离正确答案还差得很远,我真的为作者或来到这里的任何人感到难过。