amazon-web-services - 如何在 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
根据环境设置条件?
解决方案
方法 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');
}
}
尽管几个月前有人问过这个问题,但我觉得我必须在这里回复,因为没有一个答案与正确答案相差甚远,我真的为作者或任何来到这里的人感到难过。