我在AWS中使用lambda函数来完成一些工作,并且我需要该函数从AWS SSM资源中获取一些数据才能完成工作。但是,我一直在努力让代码等待对getParameter
的调用才能等到回调完成后再继续。
我尝试用两种不同的方式来构造代码。
似乎都没有办法使执行暂停。
使用基于“结构参考2”的当前实现,我不确定自己做错了什么。
const aws = require('aws-sdk');
const crypto = require('crypto');
const ssm = new aws.SSM();
exports.handler = async (event, context, callback) => {
console.log(event.headers);
var webhook = JSON.parse(event.body);
var key = "";
var parameterRequest = ssm.getParameter( {
Name: "param1",
WithDecryption: true
}, function(err, data) {
if (err)
{
console.log(err);
}
else
{
key=data.Parameter.Value;
console.log(data);
}
});
await parameterRequest;
var hash = crypto.createHmac('sha1', key).update(JSON.stringify(webhook)).digest('hex');
console.log("HASH: sha1=" + hash);
console.log("Key:" + key);
}
const response = {
"statusCode": 200,
"statusDescription": "200 OK"
};
return callback(null, response);
为什么console.log("HASH: sha1=" + hash);
和console.log("Key:" + key);
在console.log(data);
之前执行?
更新7/2/2019
在没有尝试捕获的情况下应用了等待和承诺:
const aws = require('aws-sdk');
const crypto = require('crypto');
const ssm = new aws.SSM();
exports.handler = async (event, context, callback) => {
console.log(event.headers);
var webhook = JSON.parse(event.body);
var key = "";
var parameterRequest = await ssm.getParameter( {
Name: "param1",
WithDecryption: true
}, function(err, data) {
if (err)
{
console.log(err);
}
else
{
key=data.Parameter.Value;
console.log(data);
}
}).promise();
var hash = crypto.createHmac('sha1', key).update(JSON.stringify(webhook)).digest('hex');
console.log("HASH: sha1=" + hash);
console.log("Key:" + key);
}
const response = {
"statusCode": 200,
"statusDescription": "200 OK"
};
return callback(null, response);
答案 0 :(得分:3)
SSM.getParameter
不直接返回Promise
,而是返回AWS.Request
。您可以使用AWS.Request.promise()
将请求用作承诺。
try {
const data = await ssm.getParameter({
Name: "param1",
WithDecryption: true
}).promise();
console.log(data);
const key = data.Parameter.Value;
} catch (err) {
console.log(err);
}