Создайте политику Интернета вещей с помощью AWS Lambda - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь создать политику Интернета вещей с помощью AWS Lambda. Моя текущая лямбда-функция выглядит так:

"use strict";
const AWS = require("aws-sdk");
AWS.config.update({ region: "eu-central-1" });
var iot = new AWS.Iot();

exports.handler = async (event, context) => {


  var params = {
    policyDocument: `{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:xxxxx:client/sander"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:xxxx:topicfilter/$aws/things/ManuelBohrmaschine/shadow/*",
        "arn:aws:iot:xxxx:topicfilter/$aws/things/HeikoBohrmaschine/shadow/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:xxxx:topic/$aws/things/ManuelBohrmaschine/shadow/*",
        "arn:aws:iot:xxxx:topic/$aws/things/HeikoBohrmaschine/shadow/*"
      ]
    }
  ]
}`,
    policyName: 'sander1231564654654654',
  };
  
  
  try{

    iot.createPolicy(params, function (err, data) {
      if (err) console.log(err, err); // an error occurred
      else {
        console.log("test")
        console.log(data);
        return {
          headers: {
            "Access-Control-Allow-Origin": "*", // Required for CORS support to work
            "Access-Control-Allow-Credentials": true // Required for cookies, authorization headers with HTTPS 
          },
          statusCode: 200,
          body: JSON.stringify(data)
        };

      }         
    });
  }
  catch(e){
    console.log(e);
  }
};

Лямбда-функция просто возвращает null и даже не попадает в функцию обратного вызова iot.createPolicy (). Я тоже попробовал, не пытаясь поймать. Та же проблема. Нет правильной ошибки. Я использую эту документацию: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Iot.html#createPolicy -property

1 Ответ

1 голос
/ 30 мая 2020

Я думаю, причина в том, что ваша функция возвращается до того, как у нее появится возможность запустить ваш раздел iot. Это потому, что asyn c обработчики :

Если ваш код выполняет асинхронную задачу, возвращает обещание , чтобы убедиться, что он завершил работу. Когда вы разрешаете или отклоняете обещание, Lambda отправляет ответ или ошибку вызывающей стороне.

Чтобы преодолеть это, вы можете использовать const promise = new Promise(...), как показано в docs .

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

"use strict";
const AWS = require("aws-sdk");
AWS.config.update({ region: "eu-central-1" });
var iot = new AWS.Iot();

exports.handler = async (event, context) => {

  var params = {
    policyDocument: `{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:xxxxx:client/sander"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:xxxx:topicfilter/$aws/things/ManuelBohrmaschine/shadow/*",
        "arn:aws:iot:xxxx:topicfilter/$aws/things/HeikoBohrmaschine/shadow/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:xxxx:topic/$aws/things/ManuelBohrmaschine/shadow/*",
        "arn:aws:iot:xxxx:topic/$aws/things/HeikoBohrmaschine/shadow/*"
      ]
    }
  ]
}`,
    policyName: 'sander1231564654654654',
  };

  const promise = new Promise(function(resolve, reject) {

  try{

    console.log(params);

    iot.createPolicy(params, function (err, data) {
      if (err) {
          console.log(err, err); // an error occurred
          reject(Error(err));
      }
      else {
        console.log("test")
        console.log(data);
        resolve({
          headers: {
            "Access-Control-Allow-Origin": "*", // Required for CORS support to work
            "Access-Control-Allow-Credentials": true // Required for cookies, authorization headers with HTTPS 
          },
          statusCode: 200,
          body: JSON.stringify(data)
        });

      }         
    });
  }
  catch(e){
    console.log(e);
  }
})
 return promise
};
...