]>
Commit | Line | Data |
---|---|---|
80b6050c MS |
1 | /* eslint-disable import/no-extraneous-dependencies */ |
2 | /* eslint-disable class-methods-use-this */ | |
3 | const AWS = require('aws-sdk'); | |
4 | ||
5 | const MAX_SSM_PARAMETERS_PER_REQUEST = 10; | |
6 | ||
7 | class Secrets { | |
8 | constructor(secretList) { | |
9 | this.secretList = secretList; | |
10 | Object.keys(secretList).forEach((secret) => { | |
11 | this[secret] = secretList[secret]; | |
12 | }); | |
13 | } | |
14 | ||
15 | flattenParameters(params) { | |
16 | const flat = {}; | |
17 | params.forEach((param) => { | |
18 | flat[param.Name.replace(/^.+\/(.+)$/, '$1')] = param.Value; | |
19 | }); | |
20 | return flat; | |
21 | } | |
22 | ||
23 | init() { | |
24 | if (this.initPromise === undefined) { | |
25 | this.initPromise = new Promise((resolve, reject) => { | |
26 | const shouldLoadSecretsFromSsm = !process.env.IS_OFFLINE || process.env.IS_TEST; | |
27 | if (shouldLoadSecretsFromSsm) { | |
28 | this.loadSecrets().then(resolve, reject); | |
29 | } else { | |
30 | resolve(); | |
31 | } | |
32 | }); | |
33 | } | |
34 | return this.initPromise; | |
35 | } | |
36 | ||
37 | loadSecrets() { | |
38 | const ssm = new AWS.SSM(); | |
39 | const secretNames = Object.keys(this.secretList).map(secret => process.env[secret]); | |
40 | ||
41 | // Create an array of promises of SSM getparameters requests. | |
42 | // Max 10 per call. | |
43 | const promises = []; | |
44 | while (secretNames.length > 0) { | |
45 | const subSet = secretNames.splice(0, MAX_SSM_PARAMETERS_PER_REQUEST); | |
46 | promises.push(ssm.getParameters({ Names: subSet, WithDecryption: true }).promise()); | |
47 | } | |
48 | return Promise.all(promises) | |
49 | .then((secrets) => { | |
50 | const settingsArray = []; | |
51 | secrets.forEach((secretSet) => { | |
52 | settingsArray.push(...secretSet.Parameters); | |
53 | }); | |
54 | const settings = this.flattenParameters(settingsArray); | |
55 | Object.keys(settings).forEach((setting) => { | |
56 | this[setting] = settings[setting]; | |
57 | }); | |
58 | }); | |
59 | } | |
60 | } | |
61 | ||
62 | module.exports = Secrets; |