如何在 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
或者如果只是生产需要 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');
}
}
我觉得我必须在这里回复,即使几个月前有人问过这个问题,因为 none 的答案甚至离正确答案还差得很远,我真的为作者或来到这里的任何人感到难过。
我需要通过 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
或者如果只是生产需要 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');
}
}
我觉得我必须在这里回复,即使几个月前有人问过这个问题,因为 none 的答案甚至离正确答案还差得很远,我真的为作者或来到这里的任何人感到难过。