我对使用无服务器框架是陌生的,我想检查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}/*"
Config.dev.json:
{
"items_updates": "dev-items-updates"
}
Config.prod.json:
{
"items_updates": "prod-items-updates"
}
所以,我想知道是否有一种方法可以打印以下变量
${self:provider.stage}
和${file(./config.${self:provider.stage}.json):items_updates}
在进行部署时。是否有在无服务器框架中使用其他环境的最佳实践?
谢谢!
答案 0 :(得分:1)
如果您想加入 Serverless 生命周期事件并进行处理,一种典型的方法是使用write a plugin。
我发现Serverless插件开发的学习曲线相当温和,因此建议向没有这样做的任何Serverless用户编写一个。
但是,有时插件过大,或者由于其他原因不受欢迎。
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文件中放置多个资源。