J'ai créé un modèle de formation lambda et cloud qui donne à un lambda l'accès au magasin de paramètres et au gestionnaire de secrets. Lorsque je teste la lambda, j'ai les fonctions suivantes en dehors de la fonction export.handler :
function getParameterFromStore(param){
let promise = new Promise(function(resolve, reject){
console.log('++ ' + param.Path);
servmgr.getParametersByPath(param, function(err, data){
if(err){
reject(console.log('Error getting parameter: ' + err, err.stack));
} else {
resolve(data);
}
});
});
let parameterResult = promise.then(function(result){
console.log('---- result: '+ JSON.stringify(result));
return result;
});
return parameterResult;
};
servmgr
est instancié en tant que var servmgr = new AWS.SSM();
Lorsque j'appelle cette fonction à partir de la fonction export.handler, je le fais comme suit :
myFirstParam = { Path : '/myPath/Service/servicesEndpoint'};
let endpointResult = getParameterFromStore(myFirstParam);
Dans la lambda, la fonction récupère le paramètre défini à l'extérieur de la fonction export.handler mais enveloppé dans une promesse.
Lorsque j'exécute/teste cette lambda, l'objet retourné est toujours indéfini... Je récupère Parameters[] mais aucune valeur.
2019-02-20T21:42:41.340Z 2684fe88-d552-4560-a477-6761f2de6717 ++ /myPath/Service/serviceEndpoint
2019-02-20T21:42:41.452Z 2684fe88-d552-4560-a477-6761f2de6717 ---- result: {"Parameters":[]}
Comment renvoyer les valeurs des paramètres à une lambda au moment de l'exécution ?
mise à jour
Sur la base de la suggestion/réponse de Thales, j'ai simplifié le lambda en le limitant à ceci :
const getParameterFromStoreAsync = (param) => {
return new Promise((resolve, reject) => {
servmgr.getParametersByPath(param, (err, data) => {
if(err){
reject(console.log('Error getting parameter: ' + err, err.stack));
}
return resolve(data);
});
});
};
exports.handler = async(event, ctx, callback) => {
console.log('INFO[lambda]: Event: [' + JSON.stringify(event, null, 2) + ']');
console.log('this is the event' + JSON.stringify(event));
sfdcEndPointParam = { Path : '/PartnerBanking/Service/SfdcEndpoint'};
let myendpoint = await getParameterFromStoreAsync(sfdcEndPointParam);
console.log('### endpoint path: ' + JSON.stringify(myendpoint));
done = ()=>{}
callback(null, done());
};
Dans mes tests, je vois toujours un tableau vide renvoyé :
### endpoint path: {"Parameters":[]}
J'ai également déplacé la fonction dans le callback en tant que
exports.handler = (event,ctx, callback){
done = async()=>{
console.log('this is the event' + JSON.stringify(event));
sfdcEndPointParam = { Path : '/PartnerBanking/Service/SfdcEndpoint'};
let myendpoint = await getParameterFromStoreAsync(sfdcEndPointParam);
console.log('### endpoint path: ' + JSON.stringify(myendpoint));}
}
callback(null, done());
Même résultat ... tableau vide. Y a-t-il d'autres choses à essayer ?