From 0755b9804be1829c7c7275dd9f214b54ad167797 Mon Sep 17 00:00:00 2001 From: Alberto Menendez Romero Date: Sat, 23 Sep 2023 00:33:26 -0400 Subject: [PATCH] feature/add support to fetch recursively (#6) * Support recursive option * Enhance documentation --- README.md | 34 +++++++++++++++++++++ lib/interfaces/config-options.interface.ts | 1 + lib/providers/config-parameters.provider.ts | 1 + lib/services/parameter-store.service.ts | 2 ++ package-lock.json | 4 +-- package.json | 2 +- 6 files changed, 41 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b26ec6d..148b00e 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ import { PSConfigModule } from 'nestjs-param-store'; PSConfigModule.register({ ssmParamStorePath: '/production/services/my-service', ssmDecryptParams: true, + ssmRecursive: false, ssmClientOptions: { region: 'us-east-1', }, @@ -48,6 +49,7 @@ import { PSConfigModule } from 'nestjs-param-store'; useFactory: async (config: ConfigService) => ({ ssmParamStorePath: config.get('APP_CONFIG_PATH'), ssmDecryptParams: true, + ssmRecursive: false, ssmClientOptions: { region: config.get('AWS_REGION'), }, @@ -59,6 +61,15 @@ import { PSConfigModule } from 'nestjs-param-store'; export class AppModule {} ``` +## Options + +| Option | Required | Default | Description | +|------------------- |---------- |------------- |------------------------------------------------------------------- | +| ssmParamStorePath | Yes | | The hierarchy for the parameter | +| ssmDecryptParams | No | `false` | Retrieve all parameters in a hierarchy with their value decrypted | +| ssmRecursive | No | `false` | Retrieve all parameters within a hierarchy | +| ssmClientOptions | No | `undefined` | Options to pass to the underlying SSM client | + ## Services This module exposes the following services. @@ -172,3 +183,26 @@ Example of output: } ] ``` + +## Troubleshooting + +### Empty list of parameters returned + +This happens when `recursive` is `false` and the specified path does not resolve the final level in the hierarchy. + +[Reference: GetParametersByPath](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParametersByPath.html#API_GetParametersByPath_RequestSyntax) + +```typescript +import { Module } from '@nestjs/common'; +import { PSConfigModule } from 'nestjs-param-store'; + +@Module({ + imports: [ + PSConfigModule.register({ + ssmParamStorePath: '/production', + ssmRecursive: true, // <-- specify recursively + }), + ], +}) +export class AppModule {} +``` diff --git a/lib/interfaces/config-options.interface.ts b/lib/interfaces/config-options.interface.ts index c9cfef4..bcb063d 100644 --- a/lib/interfaces/config-options.interface.ts +++ b/lib/interfaces/config-options.interface.ts @@ -3,5 +3,6 @@ import { SSMClientConfig } from '@aws-sdk/client-ssm'; export interface PSConfigOptions { ssmParamStorePath: string; ssmDecryptParams?: boolean; + ssmRecursive?: boolean; ssmClientOptions?: SSMClientConfig; } diff --git a/lib/providers/config-parameters.provider.ts b/lib/providers/config-parameters.provider.ts index 3b40731..4b16665 100644 --- a/lib/providers/config-parameters.provider.ts +++ b/lib/providers/config-parameters.provider.ts @@ -12,6 +12,7 @@ export const configParametersProvider: FactoryProvider = { return psService.getParametersByPath( configOptions.ssmParamStorePath, configOptions.ssmDecryptParams ?? false, + configOptions.ssmRecursive ?? false, ); }, inject: [PS_CONFIG_OPTIONS, ParameterStoreService], diff --git a/lib/services/parameter-store.service.ts b/lib/services/parameter-store.service.ts index 7c5f4fd..690b167 100644 --- a/lib/services/parameter-store.service.ts +++ b/lib/services/parameter-store.service.ts @@ -15,6 +15,7 @@ export class ParameterStoreService { public async getParametersByPath( path: string, decrypt = false, + recursive = false, ): Promise { let allParameters: Parameter[] = []; let nextParametersToken: string | undefined; @@ -23,6 +24,7 @@ export class ParameterStoreService { Path: path, WithDecryption: decrypt, NextToken: nextParametersToken, + Recursive: recursive, }); const { Parameters = [], NextToken } = await this.client.send( diff --git a/package-lock.json b/package-lock.json index bd9cc9a..8137105 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nestjs-param-store", - "version": "1.0.0", + "version": "1.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nestjs-param-store", - "version": "1.0.0", + "version": "1.2.0", "license": "MIT", "devDependencies": { "@nestjs/cli": "^9.0.0", diff --git a/package.json b/package.json index 92f0528..6936a7f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nestjs-param-store", - "version": "1.1.0", + "version": "1.2.0", "description": "Configure your NestJS application with AWS Parameter Store", "author": "Alberto Menendez Romero ", "keywords": [