gpt4 book ai didi

amazon-web-services - 如何使用 node.js 和 aws-sdk 从 lambda 访问 aws 参数存储

转载 作者:行者123 更新时间:2023-12-04 08:10:32 25 4
gpt4 key购买 nike

我创建了一个 lambda 和云形成模板,它授予 lambda 访问参数存储和 secret 管理器的权限。当我测试 lambda 时,我在 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 实例化为 var servmgr = new AWS.SSM();
当我从 export.handler 函数调用这个函数时,我这样做:
myFirstParam =  { Path : '/myPath/Service/servicesEndpoint'};

let endpointResult = getParameterFromStore(myFirstParam);

在 lambda 中,我让函数检索包装在 promise 中的 export.handler 函数 bt 之外定义的参数。

当我运行/测试这个 lambda 时,返回的对象总是未定义的......我得到了参数 [] 但没有值。
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":[]}

如何在运行时将参数值返回给 lambda?

更新

根据 Thales 的建议/答案,我将 lambda 简化为:
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());
};

我仍然看到在我的测试中返回了一个空数组:
### endpoint path: {"Parameters":[]}

我也将函数移动到回调中
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());

相同的结果......空数组。还有什么要尝试的吗?

最佳答案

这是因为您的 getParameterFromStore在您之前返回 then()代码被执行,因此 parameterResultundefined .如果您不想过多更改代码,我将返回您创建的 Promise,如下所示:

function getParameterFromStore(param){
return 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);
}
});
});

};

最后,在您函数的客户端上,您可以获得如下结果:
const myFirstParam =  { Path : '/myPath/Service/servicesEndpoint'}
getParameterFromStore(myFirstParam).then(console.log)

但是,在 NodeJS 中编码时,我强烈建议您使用 async/await相反,你将能够逃离 Promise Hell(在 Promise 之后改变 Promise 以“同步”实现某些东西)

使用 async/await 时,您可以将代码设计为同步的。这是您示例的重构版本,使用 async/await 以及箭头函数:
const getParameterFromStore = param => {
return new Promise((resolve, reject) => {
console.log('++ ' + param.Path);
servmgr.getParametersByPath(param, (err, data) => {
if (err) {
console.log('Error getting parameter: ' + err, err.stack)
return reject(err);
}
return resolve(data);
});
})
}

exports.handler = async (event) => {
const endpointResult = await getParameterFromStore(event.someAttributeFromTheEventThatYouWantToUse)

console.log(endpointResult)
};

编辑 :在 OP 解决了第一个问题之后,我自己创建了一个工作示例。结果证明 OP 调用 API 的方式不正确。

这是完整的工作示例:
'use strict';

const AWS = require('aws-sdk')

AWS.config.update({
region: 'us-east-1'
})

const parameterStore = new AWS.SSM()

const getParam = param => {
return new Promise((res, rej) => {
parameterStore.getParameter({
Name: param
}, (err, data) => {
if (err) {
return rej(err)
}
return res(data)
})
})
}

module.exports.get = async (event, context) => {
const param = await getParam('MyTestParameter')
console.log(param);
return {
statusCode: 200,
body: JSON.stringify(param)
};
};

介意 Name必须作为对 ServiceManager.getAttribute 方法的 API 调用的一部分提供的属性。

这个属性在官方 docs中有说明

我自己运行了它,这是 CloudWatch Logs 中的输出:

enter image description here

如您所见,该值已成功返回。

希望这可以帮助!

关于amazon-web-services - 如何使用 node.js 和 aws-sdk 从 lambda 访问 aws 参数存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54798083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com