#aws-lambda #amazon-vpc #aws-iot
#aws-lambda #amazon-vpc #aws-iot
Вопрос:
Я хочу создать что-то или удалить что-то в ядре AWS iot с помощью лямбда-функции, но я не знаю, почему моя лямбда-функция ничего не делает, когда я использую AWS iot sdk, это проблема с сетью? Должен ли я настроить vpc или что-то в этом роде?
const AWS = require('aws-sdk');
AWS.config.region = "YYYY";
var iotdata = new AWS.IotData({endpoint: endpoint});
var iot = new AWS.Iot();
exports.handler = async(event) => {
iot.listThings().on('success', function(response) {
var things = response.data.things;
console.log("test")
var myThings = [];
for(var i = 0; i < things.length; i ) {
if (things[i].thingName.includes("myThing")) {
myThings[i]=things[i].thingName;
}
}
})
iot.createThing(thingParams).on('success', function(response) {
//Thing Created!
}).on('error', function(response) {
console.log(response);
}).send();
};
Ответ:
null
Идентификатор запроса:
"ccccc-fffff-eeee-rrrr-rrrrr"
Журналы функций:
START RequestId: ccccc-fffff-eeee-rrrr-rrrrr Version: $LATEST
END RequestId: ccccc-fffff-eeee-rrrr-rrrrr
REPORT RequestId: ccccc-fffff-eeee-rrrr-rrrrr: 29.75 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 88 MB
Комментарии:
1. * AWS.config.region = «ГГГГ»; выглядит неправильно, это то, что у вас есть в вашем реальном коде?
2. нет, я настраиваю фактическое название региона.
Ответ №1:
Похоже, это связано с тем, что вы используете обратный вызов метода и promise вместе, попробуйте использовать только подход promise. Что происходит в вашем коде, что вызов lambda завершается перед вызовами on('success')
Заменить:
exports.handler = async(event) => {
iot.listThings().on('success', function(response) {
var things = response.data.things;
console.log("test")
var myThings = [];
for(var i = 0; i < things.length; i ) {
if (things[i].thingName.includes("myThing")) {
myThings[i]=things[i].thingName;
}
}
})
};
С:
exports.handler = (event) => new Promise( (resolve,reject) => {
iot.listThings().on('success', function(response) {
var things = response.data.things;
console.log("test")
var myThings = [];
for(var i = 0; i < things.length; i ) {
if (things[i].thingName.includes("myThing")) {
myThings[i]=things[i].thingName;
}
}
resolve("Done")
})
}
Или с:
exports.handler = (event, context, callback) => {
iot.listThings().on('success', function(response) {
var things = response.data.things;
console.log("test")
var myThings = [];
for(var i = 0; i < things.length; i ) {
if (things[i].thingName.includes("myThing")) {
myThings[i]=things[i].thingName;
}
}
callback("Done")
})
}
Кстати, раскрытие информации в Lumigo, компании, в которой я работал, есть подробный пост в блоге:
https://lumigo.io/blog/node-js-lambda-execution-leaks-a-practical-guide/?highlight=execution leak
Комментарии:
1. Спасибо за ваш ответ, я пробую их оба, но в моем lambda ничего не изменилось. в iot.listThings() ничего не выполняется, даже нет консоли. журнал печатается, и мне интересно, почему? должен ли я настроить сеть или VPC.
Ответ №2:
Я пытаюсь решить свою проблему другим способом, используя iot rest api, может ли кто-нибудь помочь в методе аутентификации этих API. УДАЛЕНИЕ Curl -X https://MY_REGION.console.aws.amazon.com/iot/api/thing/test
{
"status": {
"code": "userNotLoggedIn",
"message": ""
}
}
Ответ №3:
Для вашего первоначального вопроса — в вашей частной подсети, где работает lambda, должен быть настроен шлюз NAT для исходящего трафика.
Это необходимо, поскольку вы взаимодействуете с API ядра Интернета вещей в общедоступном доступе.