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