AWS Lambda Node.js - получить вывод из асинхронного вызова (ec2.describeImages) - PullRequest
0 голосов
/ 18 декабря 2018

Я не могу получить данные от ec2.describeImages.

У меня есть функция, которая оборачивает вызов ec2.describeImages:

async function GetLatestAMI (event, context, latestAMI) {
console.log("REQUEST RECEIVED:\n" + JSON.stringify(event));

var responseStatus = "FAILED";
var responseData = {};
var osBaseName = osNameToPattern[event.ResourceProperties.OSName];

console.log("OS: " + event.ResourceProperties.OSName + " -> " + osBaseName);

//var ec2 = new aws.EC2({region: event.ResourceProperties.Region});
var describeImagesParams = {
    Filters: [{ Name: "name", Values: [osBaseName]}],
    Owners: ["amazon"]
};

console.log( "Calling describeImages...");

// Get the available AMIs for the specified Windows version.
await ec2.describeImages(describeImagesParams, function(err, describeImagesResult) {
    if (err) {
        responseData = {Error: "DescribeImages call failed"};
        console.log(responseData.Error + ":\n", err);
    }
    else {
        console.log( "Got a response back from the server");

        var images = describeImagesResult.Images;

        console.log( "Got " + images.length + " images back" );

        // Sort the images by descending creation date order so the
        // most recent image is first in the array.
        images.sort(function(x,y){
            return x.CreationDate < y.CreationDate;
        });

        for (var imageIndex = 0; imageIndex < images.length; imageIndex++) {
            responseStatus = "SUCCESS";
            responseData["Id"] = images[imageIndex].ImageId;
            latestAMI = responseData["Id"];
            responseData["Name"] = images[imageIndex].Name;
            console.log( "Found: " + images[imageIndex].Name + ", " + images[imageIndex].ImageId);
            context.done(null, "success");
            //break;
            return latestAMI;
        }
    }
}).promise();}

Я вызываю эту функцию в обработчике Lambda:

exports.handler = async function(event, context, callback) { 

console.log("Hello!")

var latestAMI = "";
var testResult = await GetLatestAMI(event, context, latestAMI);
console.log("Test result: " +  latestAMI);
console.log("Test result: " +  testResult);
}

Я не могу получить какой-либо вывод из GetLatestAMI ().Я попытался использовать предложение return внутри функции, как вы можете видеть, и даже передать переменную в качестве аргумента и безуспешно отредактировать значение этого значения внутри функции.

Вот вывод из консоли:

Response:
"success"

Request ID:
"8f2dbba4-02d1-11e9-a504-83ed96cb467a"

Function Logs:
START RequestId: 8f2dbba4-02d1-11e9-a504-83ed96cb467a Version: $LATEST
2018-12-18T14:31:08.858Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    Hello!
2018-12-18T14:31:08.873Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    REQUEST RECEIVED:
{"ResourceProperties":{"OSName":"Windows Server 2016 (64-bit)"}}
2018-12-18T14:31:08.873Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    OS: Windows Server 2016 (64-bit) -> Windows_Server-2016-English-Full-Base-*
2018-12-18T14:31:08.873Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    Calling describeImages...
2018-12-18T14:31:10.556Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    Got a response back from the server
2018-12-18T14:31:10.573Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    Got 7 images back
2018-12-18T14:31:10.593Z    8f2dbba4-02d1-11e9-a504-83ed96cb467a    Found: Windows_Server-2016-English-Full-Base-2018.12.12, ami-06a27ce600d784c71
END RequestId: 8f2dbba4-02d1-11e9-a504-83ed96cb467a
REPORT RequestId: 8f2dbba4-02d1-11e9-a504-83ed96cb467a  Duration: 1776.51 ms    Billed Duration: 1800 ms    Memory Size: 128 MB Max Memory Used: 39 MB  

Возможно, я что-то недопонимаю или что-то упустил.Надеюсь, это будет очевидно для тех, кто имеет опыт работы с AWS Lambda и Node.js!

1 Ответ

0 голосов
/ 18 декабря 2018

Я написал ниже лямбду, чтобы вы перечислили экземпляры ec2.И проверил в nodejs8.10.Это работает, как ожидалось.Некоторые проблемы, с которыми сталкивается ваш код.

a) оператор возврата внутри цикла.
b) context.done (null, "success");сделано не в том месте, что внутри цикла
в) Вы нигде не выполняете свои обещания.

Надеюсь, приведенный ниже код даст вам представление.

const AWS = require('aws-sdk');
module.exports.api = async (event, context, callback) => {
	var response = await getInstances();
	return {
		statusCode: '200',
		body: JSON.stringify({response}),
		headers: {'Content-Type': 'application/json'}
	}
}

async function getInstances() {
	var ec2 = new AWS.EC2();
	return new Promise(function (resolve, reject) {
		ec2.describeInstances(function (err, data) {
			if (err) reject(err);
			else resolve(data);
		});
	});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...