From 80b6050c258f8504b04d59c5db67ddadc3403721 Mon Sep 17 00:00:00 2001 From: Mark Steele Date: Tue, 17 Apr 2018 16:41:11 -0400 Subject: Initial import --- lib/secrets.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 lib/secrets.js (limited to 'lib') diff --git a/lib/secrets.js b/lib/secrets.js new file mode 100644 index 0000000..9559a47 --- /dev/null +++ b/lib/secrets.js @@ -0,0 +1,62 @@ +/* eslint-disable import/no-extraneous-dependencies */ +/* eslint-disable class-methods-use-this */ +const AWS = require('aws-sdk'); + +const MAX_SSM_PARAMETERS_PER_REQUEST = 10; + +class Secrets { + constructor(secretList) { + this.secretList = secretList; + Object.keys(secretList).forEach((secret) => { + this[secret] = secretList[secret]; + }); + } + + flattenParameters(params) { + const flat = {}; + params.forEach((param) => { + flat[param.Name.replace(/^.+\/(.+)$/, '$1')] = param.Value; + }); + return flat; + } + + init() { + if (this.initPromise === undefined) { + this.initPromise = new Promise((resolve, reject) => { + const shouldLoadSecretsFromSsm = !process.env.IS_OFFLINE || process.env.IS_TEST; + if (shouldLoadSecretsFromSsm) { + this.loadSecrets().then(resolve, reject); + } else { + resolve(); + } + }); + } + return this.initPromise; + } + + loadSecrets() { + const ssm = new AWS.SSM(); + const secretNames = Object.keys(this.secretList).map(secret => process.env[secret]); + + // Create an array of promises of SSM getparameters requests. + // Max 10 per call. + const promises = []; + while (secretNames.length > 0) { + const subSet = secretNames.splice(0, MAX_SSM_PARAMETERS_PER_REQUEST); + promises.push(ssm.getParameters({ Names: subSet, WithDecryption: true }).promise()); + } + return Promise.all(promises) + .then((secrets) => { + const settingsArray = []; + secrets.forEach((secretSet) => { + settingsArray.push(...secretSet.Parameters); + }); + const settings = this.flattenParameters(settingsArray); + Object.keys(settings).forEach((setting) => { + this[setting] = settings[setting]; + }); + }); + } +} + +module.exports = Secrets; -- cgit v1.2.3