Skip to content

Custom variables

Plugins can register custom variables sources, for example ${foo:some-variable}.

Custom sources can be registered via configurationVariablesSources as an object with a resolve function:

'use strict';
class MyPlugin {
constructor() {
this.configurationVariablesSources = {
foo: {
async resolve({ address }) {
// `address` contains the name of the variable to resolve:
// In `${foo:some-variable}`, address will contain `some-variable`.
// Resolver is expected to return an object with the value in the `value` property:
return {
//
value: `Resolving variable ${address}`,
};
},
},
};
}
}
module.exports = MyPlugin;

The variable source defined above (registered via a plugin) can be used as follows:

service: test
# ...
custom:
value1: ${foo:bar}
plugins:
- ./my-plugin

The configuration will be resolved into the following:

service: test
# ...
custom:
value1: Resolving variable bar
plugins:
- ./my-plugin

Variable parameters

Variable sources can support advanced use cases via parameters:

service: test
# ...
custom:
value1: ${foo(one, two):bar}

Parameters can be retrieved in the params argument:

class MyPlugin {
constructor() {
this.configurationVariablesSources = {
foo: {
async resolve({ address, params }) {
return {
// In the example below, ${foo(one, two):bar} will
// resolve to "one,two"
value: (params || []).join(','),
};
},
},
};
}
}

Resolving variables, configuration values and options

It is possible to retrieve other variables, configuration values and CLI options in the variable resolver:

class MyPlugin {
constructor() {
this.configurationVariablesSources = {
foo: {
async resolve({ resolveVariable, options }) {
// `options` is CLI options
// `resolveVariable` resolves other variables (for example here: `${sls:stage}`)
const stage = await resolveVariable('sls:stage');
// To retrieve a configuration value from serverless.yml, use the `self:xxx` variable source, for example:
// await resolveVariable('self:provider.region')
return {
value: `The stage is ${stage}`,
};
},
},
};
}
}