繁体   English   中英

使用 AWS Lambda 创建 IoT 策略

[英]Create IoT Policy with AWS Lambda

我正在尝试在 AWS Lambda 中创建 IoT 策略。 我目前的 Lambda Function 看起来像这样:

 "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); } };

The lambda function just returns null and does not even get into the callback function of iot.createPolicy(). 我也尝试过没有尝试和捕捉。 同样的问题。 没有正确的错误。 我正在使用此文档: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Iot.html#createPolicy-property

我认为原因是您的 function 在有机会运行您的iot部分之前返回。 这是因为异步处理程序

如果您的代码执行异步任务,请返回 promise以确保它完成运行。 当您解决或拒绝 promise 时,Lambda 将响应或错误发送给调用者。

为了克服这个问题,您可以使用const promise = new Promise(...) ,如文档中所示。

我修改了代码以使用Promise模式(见下文)。 我不能保证它完全有效,但您的 function 现在应该能够执行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
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM