我正在使用AWS Lambda。我正试图在异步函数中解密密钥&然后向另一个URL发出POST请求,这取决于从第一次调用中获取密钥。
module.exports = function (payload) {
return new Promise(function(resolve, reject) {
var headers = config.Headers;
decrypt(headers.Authorization)
.then(function (auth_token) {
headers.Authorization = 'Basic ' + auth_token;
console.log('dispatch got the key from kms');
return makePostCall(headers, payload);
})
.then(function (changeNumber){
console.log(changeNumber);
return resolve(changeNumber);
})
.catch (function (error) {
console.error('Error during dispatch: ' + error);
return reject(error);
});
});
};
decrypt
& makePostCall
调用{}返回reject
或resolve
。在本地运行正常,但在Lambda上运行时,只运行一次成功,这让我相信问题是异步调用makePostCall
函数。我得到的错误(来自catch
)是:
Error during dispatch: null
我需要首先运行解密 - >获取密钥 - >然后MakePostCall。
编辑: makePostCall看起来像这样:
function makePostCall(headers, payload) {
return new Promise(function (resolve, reject) {
const url = config.serviceNowEndpoint + config.serviceNowChangeUri;
request.post({
url: url,
method: 'POST',
headers: headers,
json: payload
}, function (error, response, body) {
if (!error) {
return resolve(body.change_request.number);
}
else {
return reject(new Error('Returned with status code: ' + response.statusCode));
}
});
});
}
更多编辑:根据 @Jaromanda X 的建议,将代码修改为:
module.exports = function (payload) {
var headers = config.Headers;
return decrypt(headers.Authorization)
.then(function (auth_token) {
headers.Authorization = 'Basic ' + auth_token;
console.log('dispatch got the key from kms');
return makePostCall(headers, payload);
})
.catch (function (error) {
console.error('Error during dispatch: ' + error);
return error;
});
};
问题仍然存在。在本地运行正常,但在Lambda上运行
编辑添加解密代码:
const AWS = require('aws-sdk');
const config = require('../config/config');
module.exports = function(token) {
return new Promise(function (resolve, reject) {
const kms = new AWS.KMS({ region: config.aws_region.region});
const params = {
CiphertextBlob: new Buffer(token, 'base64')
};
kms.decrypt(params, function (err, data) {
if (!err) {
console.log('decrypted successfully');
return resolve(data.Plaintext.toString());
} else {
return reject(`${err.message}`);
}
});
});
};
答案 0 :(得分:1)
这是一个AWS lambda错误。有关此问题,请参阅issue at Bluebird's repo和basic reproducing code。
这个问题实际上与bluebird无关,而是与lambda部署的异步代码处理和调度有关。 https://github.com/nervous-systems/cljs-lambda/issues/62。这是另一个重现错误的问题:https://github.com/nervous-systems/cljs-lambda/issues/62。
用户提出了一个常见问题:
天哪啊。以防万一其他人落在这里并犯了我的错误:确保您没有意外地使用localhost端点而不是实际的AWS区域特定端点部署AWS.config.update(...)。这可能会出现与上述相似的症状(例如,如果您使用的唯一异步函数是访问DynamoDB文档客户端),但原因完全不同。