Доступ к ядру AWS iot с помощью lambda

#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 ядра Интернета вещей в общедоступном доступе.