From 43539223229a6ad0e2ffd25c0d70e280269e5fe2 Mon Sep 17 00:00:00 2001 From: Yan Cui Date: Thu, 23 Aug 2018 19:20:35 +0100 Subject: [PATCH] backported SSM caching fix from 0.16.2 (#225) * backported SSM caching fix from 0.16.2 --- lerna.json | 2 +- package-lock.json | 2 +- package.json | 2 +- packages/cache/package.json | 2 +- packages/core/package.json | 2 +- .../package.json | 2 +- packages/error-logger/package.json | 2 +- .../http-content-negotiation/package.json | 2 +- packages/http-cors/package.json | 2 +- packages/http-error-handler/package.json | 2 +- packages/http-event-normalizer/package.json | 2 +- packages/http-header-normalizer/package.json | 2 +- packages/http-json-body-parser/package.json | 2 +- packages/http-partial-response/package.json | 2 +- .../http-urlencode-body-parser/package.json | 2 +- packages/input-output-logger/package.json | 2 +- packages/s3-key-normalizer/package.json | 2 +- packages/ssm/__tests__/index.js | 35 ++++++++++++------- packages/ssm/index.js | 16 +++++++-- packages/ssm/package.json | 2 +- packages/validator/package.json | 2 +- packages/warmup/package.json | 2 +- 22 files changed, 55 insertions(+), 36 deletions(-) diff --git a/lerna.json b/lerna.json index 97b96cf09..5a2f8b7ca 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "packages": [ "packages/*" ], - "version": "1.0.0-alpha.13" + "version": "1.0.0-alpha.14" } diff --git a/package-lock.json b/package-lock.json index bf03dc5c9..3daecafe8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "middy-monorepo", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5a8993118..2333e52d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "middy-monorepo", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "🛵 The stylish Node.js middleware engine for AWS Lambda", "engines": { "node": ">=6.10" diff --git a/packages/cache/package.json b/packages/cache/package.json index 2a1ca35a5..aeb89cb39 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@middy/cache", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Cache middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/core/package.json b/packages/core/package.json index 6a851e9fa..2c1ab6e25 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@middy/core", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "🛵 The stylish Node.js middleware engine for AWS Lambda (core package)", "engines": { "node": ">=6.10" diff --git a/packages/do-not-wait-for-empty-event-loop/package.json b/packages/do-not-wait-for-empty-event-loop/package.json index a4d8874ac..70ec72e57 100644 --- a/packages/do-not-wait-for-empty-event-loop/package.json +++ b/packages/do-not-wait-for-empty-event-loop/package.json @@ -1,6 +1,6 @@ { "name": "@middy/do-not-wait-for-empty-event-loop", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Middleware for the middy framework that allows to easily disable the wait for empty event loop in a Lambda function", "engines": { "node": ">=6.10" diff --git a/packages/error-logger/package.json b/packages/error-logger/package.json index 9d8955888..47bdcaeea 100644 --- a/packages/error-logger/package.json +++ b/packages/error-logger/package.json @@ -1,6 +1,6 @@ { "name": "@middy/error-logger", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Input and output logger middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-content-negotiation/package.json b/packages/http-content-negotiation/package.json index 13969b2bb..d103fc803 100644 --- a/packages/http-content-negotiation/package.json +++ b/packages/http-content-negotiation/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-content-negotiation", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Http content negotiation middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-cors/package.json b/packages/http-cors/package.json index c353b5d15..9ef0336e7 100644 --- a/packages/http-cors/package.json +++ b/packages/http-cors/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-cors", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "CORS (Cross-Origin Resource Sharing) middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-error-handler/package.json b/packages/http-error-handler/package.json index 6d32260b8..783fdcdf4 100644 --- a/packages/http-error-handler/package.json +++ b/packages/http-error-handler/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-error-handler", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Http error handler middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-event-normalizer/package.json b/packages/http-event-normalizer/package.json index 8a5ae767c..176a60498 100644 --- a/packages/http-event-normalizer/package.json +++ b/packages/http-event-normalizer/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-event-normalizer", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Http event normalizer middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-header-normalizer/package.json b/packages/http-header-normalizer/package.json index 2f3b6e395..c2387fb31 100644 --- a/packages/http-header-normalizer/package.json +++ b/packages/http-header-normalizer/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-header-normalizer", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Http header normalizer middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-json-body-parser/package.json b/packages/http-json-body-parser/package.json index d13f8bde6..6cd00dbf0 100644 --- a/packages/http-json-body-parser/package.json +++ b/packages/http-json-body-parser/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-json-body-parser", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Http JSON body parser middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-partial-response/package.json b/packages/http-partial-response/package.json index 64a650a7e..bb7881a81 100644 --- a/packages/http-partial-response/package.json +++ b/packages/http-partial-response/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-partial-response", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Http partial response middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/http-urlencode-body-parser/package.json b/packages/http-urlencode-body-parser/package.json index 0e39b7c9a..d04b3ec73 100644 --- a/packages/http-urlencode-body-parser/package.json +++ b/packages/http-urlencode-body-parser/package.json @@ -1,6 +1,6 @@ { "name": "@middy/http-urlencode-body-parser", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Urlencode body parser middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/input-output-logger/package.json b/packages/input-output-logger/package.json index 04d13cdfe..14d75ec1d 100644 --- a/packages/input-output-logger/package.json +++ b/packages/input-output-logger/package.json @@ -1,6 +1,6 @@ { "name": "@middy/input-output-logger", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Input and output logger middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/s3-key-normalizer/package.json b/packages/s3-key-normalizer/package.json index e8992219a..3d89db3c3 100644 --- a/packages/s3-key-normalizer/package.json +++ b/packages/s3-key-normalizer/package.json @@ -1,6 +1,6 @@ { "name": "@middy/s3-key-normalizer", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "S3 key normalizer middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/ssm/__tests__/index.js b/packages/ssm/__tests__/index.js index 4de083a36..d96531dd6 100644 --- a/packages/ssm/__tests__/index.js +++ b/packages/ssm/__tests__/index.js @@ -20,7 +20,7 @@ describe('🔒 SSM Middleware', () => { function testScenario ({ssmMockResponse, ssmMockResponses, middlewareOptions, callbacks, done, delay = 0}) { (ssmMockResponses || [ssmMockResponse]).forEach(ssmMockResponse => { - getParametersMock.mockReturnValueOnce({ + getParametersMock.mockReturnValue({ promise: () => Promise.resolve(ssmMockResponse) }) @@ -86,16 +86,18 @@ describe('🔒 SSM Middleware', () => { }, middlewareOptions: { names: { - KEY_NAME: '/dev/service_name/key-value' + KEY_NAME: '/dev/service_name/key_name' }, cache: true }, callbacks: [ () => { + expect(process.env.KEY_NAME).toEqual('key-value') expect(getParametersMock).toBeCalled() - getParametersMock.mockReset() + getParametersMock.mockClear() }, () => { + expect(process.env.KEY_NAME).toEqual('key-value') expect(getParametersMock).not.toBeCalled() } ], @@ -120,11 +122,13 @@ describe('🔒 SSM Middleware', () => { setToContext: true }, callbacks: [ - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).toBeCalledWith({'Names': ['/dev/service_name/secure_param'], 'WithDecryption': true}) - getParametersMock.mockReset() + getParametersMock.mockClear() }, - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).not.toBeCalled() } ], @@ -146,7 +150,8 @@ describe('🔒 SSM Middleware', () => { paramsLoaded: false }, callbacks: [ - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).toBeCalledWith({'Names': ['/dev/service_name/secure_param'], 'WithDecryption': true}) } ], @@ -169,11 +174,13 @@ describe('🔒 SSM Middleware', () => { paramsLoaded: false }, callbacks: [ - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).toBeCalledWith({'Names': ['/dev/service_name/secure_param'], 'WithDecryption': true}) - getParametersMock.mockReset() + getParametersMock.mockClear() }, - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).toBeCalledWith({'Names': ['/dev/service_name/secure_param'], 'WithDecryption': true}) } ], @@ -197,11 +204,13 @@ describe('🔒 SSM Middleware', () => { paramsLoaded: false }, callbacks: [ - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).toBeCalledWith({'Names': ['/dev/service_name/secure_param'], 'WithDecryption': true}) - getParametersMock.mockReset() + getParametersMock.mockClear() }, - () => { + (_, {context}) => { + expect(context.secureValue).toEqual('something-secure') expect(getParametersMock).not.toBeCalled() } ], diff --git a/packages/ssm/index.js b/packages/ssm/index.js index 8cb3f3948..159cc356c 100644 --- a/packages/ssm/index.js +++ b/packages/ssm/index.js @@ -13,6 +13,7 @@ module.exports = opts => { cache: false, cacheExpiryInMillis: undefined, paramsLoaded: false, + paramsCache: undefined, paramsLoadedAt: new Date(0) } @@ -20,7 +21,15 @@ module.exports = opts => { return { before: (handler, next) => { - if (!shouldFetchFromParamStore(options)) return next() + if (!shouldFetchFromParamStore(options)) { + if (options.paramsCache) { + const targetParamsObject = getTargetObjectToAssign(handler, options) + options.paramsCache.forEach(object => { + Object.assign(targetParamsObject, object) + }) + } + return next() + } ssmInstance = ssmInstance || getSSMInstance(options.awsSdkOptions) @@ -39,13 +48,13 @@ module.exports = opts => { const ssmParamNames = getSSMParamValues(options.names) if (ssmParamNames.length) { - ssmPromises.push( + const ssmPromise = ssmInstance .getParameters({ Names: ssmParamNames, WithDecryption: true }) .promise() .then(handleInvalidParams) .then(ssmResponse => getParamsToAssignByName(options.names, ssmResponse)) - ) + ssmPromises.push(ssmPromise) } return Promise.all(ssmPromises).then(objectsToMap => { @@ -54,6 +63,7 @@ module.exports = opts => { Object.assign(targetParamsObject, object) }) options.paramsLoaded = true + options.paramsCache = objectsToMap options.paramsLoadedAt = new Date() }) } diff --git a/packages/ssm/package.json b/packages/ssm/package.json index 985585cde..a592b8389 100644 --- a/packages/ssm/package.json +++ b/packages/ssm/package.json @@ -1,6 +1,6 @@ { "name": "@middy/ssm", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "SSM (EC2 Systems Manager) parameters middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/validator/package.json b/packages/validator/package.json index 479ec03a3..96a260364 100644 --- a/packages/validator/package.json +++ b/packages/validator/package.json @@ -1,6 +1,6 @@ { "name": "@middy/validator", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Validator middleware for the middy framework", "engines": { "node": ">=6.10" diff --git a/packages/warmup/package.json b/packages/warmup/package.json index 0c48cb955..47e4348c7 100644 --- a/packages/warmup/package.json +++ b/packages/warmup/package.json @@ -1,6 +1,6 @@ { "name": "@middy/warmup", - "version": "1.0.0-alpha.13", + "version": "1.0.0-alpha.14", "description": "Warmup (cold start mitigation) middleware for the middy framework", "engines": { "node": ">=6.10"