diff --git a/client/index.js b/client/index.js index 83287fc..3a5a727 100644 --- a/client/index.js +++ b/client/index.js @@ -29,9 +29,9 @@ function init (config) { function load (options) { init() const mergedOptions = Object.assign({}, secrets.options, options) - const environmentSecrets = Object.assign({}, secrets.environments.$global, secrets.environments[process.env._HANDLER.split('.')[1]]) - const parameterNames = _.uniq(_.values(environmentSecrets)) const provider = getStorageProvider(mergedOptions) + const environmentSecrets = Object.assign({}, secrets.environments.$global, secrets.environments[provider.getFunctionName()]) + const parameterNames = _.uniq(_.values(environmentSecrets)) return provider.getSecret(parameterNames).then(data => { const missingParameters = parameterNames.filter(expected => !_.keys(data).some(received => expected === received)) Object.assign(process.env, _.mapValues(environmentSecrets, key => data[key])) diff --git a/lib/providers/aws.js b/lib/providers/aws.js index 35de9ec..e2dca57 100644 --- a/lib/providers/aws.js +++ b/lib/providers/aws.js @@ -70,10 +70,15 @@ module.exports = function (options) { }) } + function getFunctionName() { + return process.env.AWS_LAMBDA_FUNCTION_NAME + } + return { getSecret, setSecret, deleteSecret, - listSecrets + listSecrets, + getFunctionName } } diff --git a/plugin/index.js b/plugin/index.js index 6f0b10f..b99ba4d 100644 --- a/plugin/index.js +++ b/plugin/index.js @@ -111,6 +111,7 @@ class ServerlessSecrets { 'secrets:list-remote:list-remote': this.listRemoteSecretNames.bind(this), 'secrets:validate:validate': this.validateSecrets.bind(this), 'before:package:setupProviderConfiguration': this.setIamPermissions.bind(this), + 'before:package:initialize': this.setEnvironmentConfig.bind(this), 'before:package:createDeploymentArtifacts': this.packageSecrets.bind(this), 'after:package:createDeploymentArtifacts': this.cleanupPackageSecrets.bind(this), 'before:deploy:function:packageFunction': this.packageSecrets.bind(this), @@ -215,7 +216,7 @@ class ServerlessSecrets { } generateConfig () { - this.serverless.cli.log('Generating Serverless Secrets Config') + this.serverless.cli.log('Generating Serverless Secrets Config options') if (!this.serverless.service.provider.name) { throw new Error('No provider name configured in serverless.yml') } @@ -235,11 +236,21 @@ class ServerlessSecrets { } ) - // variables + return { + options + } + } + + setEnvironmentConfig() { + this.config.environments = this.generateEnvironmentConfig() + } + + generateEnvironmentConfig () { + this.serverless.cli.log('Generating Serverless Secrets Config environments') const functions = this.serverless.service.functions const environments = Object.keys(functions) .reduce((environments, key) => { - const functionName = functions[key].handler.split('.')[1] + const functionName = functions[key].name || [this.serverless.service.service, this.serverless.processedInput.options.stage, key].join('-') if (functions[key].environmentSecrets) { environments[functionName] = functions[key].environmentSecrets } @@ -248,10 +259,7 @@ class ServerlessSecrets { environments.$global = this.serverless.service.provider.environmentSecrets || {} - return { - options, - environments - } + return environments } writeConfigFile () { @@ -265,7 +273,7 @@ class ServerlessSecrets { const functions = this.serverless.service.functions Object.keys(functions).forEach(functionName => { if (!functions[functionName].environment) functions[functionName].environment = {} - Object.assign(functions[functionName].environment, this.config.environments.$global, this.config.environments[functionName]) + Object.assign(functions[functionName].environment, this.config.environments.$global, this.config.environments[functions[functionName].name]) }) } @@ -291,7 +299,6 @@ class ServerlessSecrets { this.serverless.cli.log('Validating secrets') const provider = this.serverless.service.provider const functions = this.serverless.service.functions - // need to validate that all secrets exist in provider const storageProvider = this.getStorageProvider() const missingSecretsPromise = storageProvider.listSecrets().then(secrets => {