首页 > 解决方案 > 如何在 serverless.yml 中为 lambda 使用条件配置?

问题描述

我需要配置一个 lambda viaserverless.yml来为不同的环境使用不同的配置并发。下面是我的 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根据环境设置条件?

标签: amazon-web-servicesaws-lambdaserverless-framework

解决方案


方法 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}

上面设置为 dev 的阶段将默认为 10 的“其他”值,但如果您通过设置阶段serverless deploy --stage live,它将使用实时值 100。

有关更多详细信息,请参见此处:https ://www.serverless.com/framework/docs/providers/aws/guide/variables#syntax

方法 2:通过 Javascript 的异步值

您可以使用 js 包含并将您的条件逻辑放在那里。它被称为“异步值支持”。基本上,这允许您将逻辑放入您包含的 javascript 文件中,并且它可以根据各种情况返回不同的值(例如,您使用的 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

尽管几个月前有人问过这个问题,但我觉得我必须在这里回复,因为没有一个答案与正确答案相差甚远,我真的为作者或任何来到这里的人感到难过。


推荐阅读