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.
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);
})
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.
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
}
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'].