Есть несколько возможных проблем, но наиболее поразительным для меня является тот факт, что вы неправильно смешиваете стили программирования.
Вы объявили обработчик как асинхронную функцию, что нормально. Но внутри асинхронной функции вы смешиваете ожидаемый вызов с классическим вызовом функции в стиле продолжения, которого вы не ожидаете должным образом.
Что происходит, так это то, что ваша Lambda выполняет первую часть (вызов динамо), а затем среда выполнения завершает выполнение до фактического завершения вашего второго вызова функции в стиле продолжения.
Одним из решений является завершение вашего запроса https в обещании и ожидание этого в теле обработчика Lambda:
// Dynamo DB Params
const {promisify} = require('util');
const AWS = require('aws-sdk');
const dynamoDB = new AWS.DynamoDB.DocumentClient();
const dynamoDBGetAsync = promisify(dynamoDB.get).bind(dynamoDB );
const https = require('https');
exports.handler = async function(event,context) {
let probID = JSON.stringify(event.ID);
probID = probID.replace(/"/g, '');
let params = {
TableName : '<dummy_table>',
Key:{
'Server':<serverid>,
'Service':'process2'
}
};
//fetching the details from Dynamo DB
let dataResult= await dynamoDBGetAsync(params);
const message = 'Sample Message';
let jsonResult = await functionCall(dataResult);
let obj = JSON.parse(jsonResult);
// presumably you want to return something here (not sure if obj or something else)
return obj;
}
function functionCall(data) {
// Options and headers for the HTTP request
const options = {
host: 'dummy.execute-api.us-east-1.amazonaws.com',
port: 443,
path: '/dev/test',
method: 'POST',
headers: {
'Accept':'*/*',
'cache-control':'no-cache',
'Content-Type': 'application/json'
}
};
const body= "{\"msg\": "+ data + "\"}";
console.log('BODY.....:'+body);
// make this function awaitable by returning a promise
return new Promise((resolve, reject) => {
let req = https.request(options, (res) => {
console.log('IN HTTPS REQUEST.....');
let responseString = '';
console.log("statusCode:" + res.statusCode);
res.setEncoding('UTF-8');
// Collect response data as it comes back.
res.on('data', function(data) {
responseString += data;
});
res.on('end', function() {
// complete the promise successfully
resolve(responseString);
});
});
req.on('error', function(e) {
console.error('HTTP error: ' + e.message);
// complete the promise with error (will throw if awaited)
reject('Request completed with error(s).');
});
req.write(body);
req.end();
});
}
Кстати - вам не нужно обещать для работы с DynamoDB с использованием async / await. Клиент DynamoDB имеет встроенную поддержку обещаний, которые вы можете ожидать. Просто позвоните по номеру .promise()
и дождитесь этого. Например, вы можете просто написать:
let dataResult = await dynamoDB.get(params).promise();