Я новичок в использовании бессерверной структуры, и я хотел бы проверить, что переменные env внутри serverless.yml меняются в зависимости от стадии, на которой я нахожусь. Вот что у меня в 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} во время развертывания. И есть ли лучшая практика использования разных env с бессерверной структурой?
Заранее спасибо !





Если вы хотите привязаться к событиям жизненного цикла Бессерверный и что-то делать, одним из типичных подходов будет написать плагин.
Я обнаружил, что процесс обучения бессерверной разработке плагинов довольно мягкий, и рекомендовал бы написать его любому бессерверному пользователю, который этого не сделал.
Однако иногда плагин является избыточным или нежелательным по другим причинам.
Одна очень удобная (но часто упускаемая из виду) функция Serverless заключается в том, что она может разрешить переменные из файлы javascript.
Обратите внимание на экспортируемую функцию с этой подписью:
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.