web-dev-qa-db-fra.com

Récupérer le paramètre AWS ssm en bloc

Comment puis-je récupérer des paramètres d'AWS Systems Manager (magasin de paramètres) en bloc (ou plusieurs paramètres) à la fois? En utilisant aws-sdk, voici le code Node.js que j'ai écrit pour récupérer le paramètre SSM du magasin de paramètres:

      const ssm = new (require('aws-sdk/clients/ssm'))()

      const getSSMKey = async params => {
          const {Parameter: {Value: APIKey}} = await ssm.getParameter(params).promise()
          return APIKey
    }

    const [param1, param2, param3] = await Promise.all([
      getSSMKey({ Name: '/data/param/PARAM1', WithDecryption: true }),
      getSSMKey({ Name: '/data/param/PARAM2', WithDecryption: true }),
      getSSMKey({ Name: '/data/param/PARAM3', WithDecryption: true })
    ])
    console.log(param1, param2, param3)

Mais avec ce code, j'envoie 3 requêtes pour obtenir 3 paramètres ce qui est inefficace en cas de grand nombre de paramètres. Existe-t-il un moyen de récupérer plusieurs paramètres dans une demande. si ssm.getParameters () est la méthode pour le faire, veuillez donner un exemple (en particulier le paramètre de cette méthode). J'ai essayé mais je ne reçois rien.

6
ahadcse

Selon le document AWS , GetParameter obtient la valeur d'un paramètre, tandis que GetParameters obtient la valeur de plusieurs.

Leurs usages sont également très similaires. Lorsque vous utilisez GetParameters pour obtenir plusieurs valeurs, transmettez plusieurs noms sous forme de liste pour Names, au lieu de passer un seul nom sous forme de chaîne pour Name.

Exemple de code, pour obtenir les paramètres nommés "foo" et "bar", dans la région "us-west-1":

const AWS = require('aws-sdk');
AWS.config.update({ region: "us-west-1" });

const SSM = require('aws-sdk/clients/ssm');
const ssm = new SSM()
const query = {
    "Names": ["foo", "bar"],
    "WithDecryption": true
}
let param = ssm.getParameters(query, (err, data) => {
    console.log('error = %o', err);
    console.log('raw data = %o', data);
})
2
user1032613

Vous avez essentiellement deux options pour obtenir des paramètres en bloc.

L'une est la méthode fournie par @ user1032613, mais l'autre consiste à utiliser la fonction intégrée getParametersByPath ().

Un exemple de code Lambda dans le nœud avec les trois méthodes peut être vu ci-dessous. Chaque méthode peut prendre différents paramètres, par exemple avec le chemin que vous pouvez créer des filtres, etc. pour obtenir les valeurs exactes dont vous avez besoin, voir la documentation .

'use strict';
const AWS = require('aws-sdk');
const SSM = new AWS.SSM();

exports.handler = async (event) => {
    //Example get single item
    const singleParam = { Name: 'myParam' };
    const getSingleParam = await SSM.getParameter(singleParam).promise();

    //Example: Get Multiple values
    const multiParams = {
        Names: [ 'myParam1', 'myParam2', 'myParam3' ],
        WithDecryption: true
    };

    const getMultiParams = await SSM(multiParams).promise();

    //Example: Get all values in a path
    const pathParams = { Path: '/myPath/', WithDecryption: true };
    const getPathParams = await SSM.getParametersByPath(pathParams).promise();

    return 'Success';
};

N'oubliez pas que vous pouvez également utiliser des variables d'environnement. Par exemple, vous pouvez écrire singleParam comme ceci:

const singleParam = { Name: process.env.PARAM }

De cette façon, vous pouvez avoir du code qui extrait le code de DEV, PROD, etc. selon l'étape.

0
Simon

Enfin ça a marché pour moi. Voici le code:

        const ssmConfig = async () => {
          const data = await ssm.getParameters({ Names: ['/data/param/PARAM1', '/data/param/PARAM2', '/bronto/rest//data/param/PARAM3'],
WithDecryption: true }).promise()
          const config = {}
          for (const i of data.Parameters) {
            if (i.Name === '/data/param/PARAM1') {
              config.param1 = i.Value
            }
            if (i.Name === '/data/param/PARAM2') {
              config.rest.clientId param2 = i.Value
            }
            if (i.Name === '/data/param/PARAM3') {
              config.param3 = i.Value
            }
          }
          return config
        }
0
ahadcse

C'est ce que j'ai fait pour récupérer tous les paramètres d'un chemin spécifique.

**your SSM function  client :**
'use strict';
const SSM = require('aws-sdk/clients/ssm');
let ssmclient;
module.exports.init = () => {
    const region = process.env.REGION === undefined ? 'us-east-1' : process.env.REGION ;
    ssmclient = new SSM({region: region});
}
module.exports.getParameters = async (path) => {
    try {
        let params = {
            Path: path,
            WithDecryption: true
        };
        let allParameters = [];
        let data =  await ssmclient.getParametersByPath(params).promise();
        allParameters.Push.apply(allParameters, data.Parameters);
        while(data.NextToken) {
            params.NextToken = data.NextToken;
            data =  await ssmclient.getParametersByPath(params).promise();
            allParameters.Push.apply(allParameters, data.Parameters);
        }
        return allParameters;
    } catch (err) {
        return Promise.reject(err);
    }
}
calling this client:

const ssm = require("yourssmclinet");
ssm.init();
// you call only once to retrieve everything which falls under /data/param
const parameters = await getParameters("/data/param");
//from here you can fetch parameters['what ever needed'].
0