У меня есть лямбда-функция, работающая с API Gateway. Когда он получает webhook, мне нужно отправить ответ 200 ok XML обратно, а также добавить атрибуты тела запроса в SQS. Сначала он не отправил сообщение в SQS надежно. Я исправил это, добавив await и promise () к функции sendMessage. Процесс отправки сообщения выполняется несколько раз внутри одного и того же запроса. Я вижу 2 или более журналов успеха для sendMessage для одного и того же идентификатора запроса в журналах наблюдения за облаком.
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const parser = require('xml-js');
exports.submit = async (event, context) => {
let json = parser.xml2js(event.body, {compact: true});
let header = json["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns0:PartnerAsyncResponseInput"]["ns0:header"];
let body = json["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns0:PartnerAsyncResponseInput"]["ns0:body"];
let input = body["ns0:input"];
let subscriber = input["ns0:subscriber"];
let status = subscriber["ns0:result"]["ns0:status"]["_text"];
let ref_id = input["ns0:partnerTransactionID"]["_text"];
let date = header['ns0:tranDateTime']["_text"];
let count = body['ns0:inputCount']["_text"];
let partner = header['ns0:partnerID']["_text"];
console.log('Ref ID : ' + ref_id);
let sqs_data = {
status: status,
ref_id: ref_id
}
if(subscriber["ns0:MSISDN"])
sqs_data.msisdn = subscriber["ns0:MSISDN"]["_text"];
if(subscriber["ns0:ICCID"])
sqs_data.iccid = subscriber["ns0:ICCID"]["_text"];
if(subscriber["ns0:IMSI"])
sqs_data.imsi = subscriber["ns0:IMSI"]["_text"];
if(subscriber["ns0:accountID"])
sqs_data.accountId = subscriber["ns0:accountID"]["_text"];
if(status != 'SUCCESS')
sqs_data.msg = subscriber["ns0:result"]["ns0:resultMsg"]["_text"];
let params = {
MessageBody : JSON.stringify(sqs_data),
QueueUrl: "https://sqs.us-east-1.amazonaws.com/xxxxxxxxxxxx/MY-SQS",
DelaySeconds: 10
};
await sqs.sendMessage(params, function (err, data) {
if (err) {
console.log("Error", JSON.stringify(err));
} else {
console.log("Success", data);
}
}).promise();
let response_tmo = '<PartnerAsyncResponseOutput xmlns="http://T-Mobile/Wholesale/xml" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
response_tmo += '<header><partnerID>'+partner+'</partnerID><tranDateTime>'+date+'</tranDateTime></header>';
response_tmo += '<body>';
response_tmo += '<output>';
response_tmo += '<partnerTransactionID>'+ref_id+'</partnerTransactionID><subscriber><result><status>200</status></result></subscriber>';
response_tmo += '</output>';
response_tmo += '<outputCount>'+count+'</outputCount></body>';
response_tmo += '</PartnerAsyncResponseOutput>';
return {
statusCode: 200,
body: response_tmo,
headers: {
"Content-Type": "application/xml"
}
};
};```