Мы предоставляем нашим клиентам тестовую версию нашего программного обеспечения, используя шаблон облачной информации для ускорения AWS AMI. Недавно я добавил в этот шаблон пользовательский ресурс, который генерирует пробный лицензионный ключ для использования во время тест-драйва и сохраняет один из выводов облачной информации. Лицензия генерируется путем запуска лямбда-файла ZIP, хранящегося на S3. Сначала это работало в узле 4.10, затем в узле 6.10, но теперь, когда я перешел на узел 8.10, шаг ожидания ответа от parsedUrl заканчивается до того, как он получит ответ. Поскольку нет ответа на облачную информацию, создание, если этот ресурс ожидает 60 минут, сигнализирует команду удаления стека.
Я считаю, что проблема связана с асинхронной природой nodejs и моим непониманием того, как преобразовать код.
exports.handler = (event, context) => {
return genKey("./lic_wrp.sh", [arg1]).then(function(resp) {
responseStatus = "SUCCESS";
responseData["trialkey"] = resp;
console.log ('Here is the response', responseData);
sendResponse(event, context, responseStatus, responseData);
}
);
Этот фрагмент был исходной рабочей версией node6.10.
Я изменился на:
exports.handler = async (event,context) => {
и
try {
var resp = await helpers.genKey("./lic_wrp.sh", [arg1]);
responseStatus = "SUCCESS";
responseData["trialkey"] = resp;
console.log ('Here is the response', responseData);
try {
const rest2 = await sendResponse(event, context, responseStatus, responseData)
return rest2;
} catch (e){
console.log(e);
}
} catch (e){
console.log(e);
}
Код sendResponse остался прежним, и я использовал пример с сайта AWS:
function sendResponse(event, context, responseStatus, responseData) {
var responseBody = JSON.stringify({
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
PhysicalResourceId: context.logStreamName,
Status: responseStatus,
Reason: "See the details in CloudWatch Log " + context.logStreamName,
Data: responseData
});
console.log("RESPONSE BODY:\n", responseBody);
var https = require("https");
var url = require("url");
var parsedUrl = url.parse(event.ResponseURL);
var options = {
hostname: parsedUrl.hostname,
port: 443,
path: parsedUrl.path,
method: "PUT",
headers: {
"content-type": "",
"content-length": responseBody.length
}
};
console.log("SENDING RESPONSE...\n");
var request = https.request(options, function(response) {
console.log("STATUS: " + response.statusCode);
console.log("HEADERS: " + JSON.stringify(response.headers));
// Tell AWS Lambda that the function execution is done
context.done();
});
request.on("error", function(error) {
console.log("sendResponse Error:\n", error);
// Tell AWS Lambda that the function execution is done
context.done(error);
});
request.write(responseBody);
request.end();
}
В cloudwatch я вижу ответ, тело остается в порядке.
2019-05-21T05:02:50.450Z ba8542ed-66cf-4ada-9ae6-fd4f1920faee RESPONSE BODY:
{
"StackId": "arn:aws:cloudformation:ap-southeast-2:267176467350:stack/laatest52/9c35f740-7b85-11e9-9ba3-0217b90f9ac8",
"RequestId": "1eafeb08-fadc-4bc5-a476-19330599ad6d",
"LogicalResourceId": "LicenseKey",
"PhysicalResourceId": "2019/05/21/[$LATEST]e2cc667849d44285b452af5fa31084b2",
"Status": "SUCCESS",
"Reason": "See the details in CloudWatch Log 2019/05/21/[$LATEST]e2cc667849d44285b452af5fa31084b2",
"Data": {
"trialkey": "xxxx-xxxx-xxxx-xxxx-xxxx" -- Our key gen is working
}
}
Тогда я вижу отправку ответа.
Но тогда следующая строка:
END RequestId: ba8542ed-66cf-4ada-9ae6-fd4f1920faee
В предыдущей версии это работало нормально.
Мы видим тело ответа, затем отправляем ответ:
2018-11-16T18:03:06.435Z dd879acf-e9c9-11e8-afaf-bfffb4a386b6 STATUS: 200
И ресурс создан.