如何从lambda发布到iot流

时间:2018-02-25 20:55:43

标签: aws-lambda aws-sdk aws-iot

当我尝试调用iotData发布函数时,我的lambda函数中有一个超时。代码如下。它总是没有错误地超时。此函数从sam本地命令行运行。我想这是lambda的权限错误。奇怪的是我已经为IoT,Kinesis和SNS授予了这个lambda函数的权限,但没有任何工作。

'use strict'; 
console.log('Loading function'); 

require('dotenv').config();
const {Pool} = require('pg');
const pool = new Pool();
const AWS = require('aws-sdk');
console.log("finished loading");


/**  * Provide an event that contains the following keys:  
 * *  *   - resource: API Gateway resource for event  
 * *   - path: path of the HTTPS request to the microservices API call  
 * *   - httpMethod: HTTP method of the HTTPS request from microservices API call  
 * *   - headers: HTTP headers for the HTTPS request from microservices API call  
 * *   - queryStringParameters: query parameters of the HTTPS request from microservices API call  
 * *   - pathParameters: path parameters of the HTTPS request from microservices     API call  
* *   - stageVariables: API Gateway stage variables, if applicable  
 * *   - body: body of the HTTPS request from the microservices API call  
 * */ 

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

console.log("starting");
let _response = ""; 
context.callbackWaitsForEmptyEventLoop = false;

if(event.httpMethod==="POST" && event.resource==="/pings"){
    var body = JSON.parse(event.body);
    console.log("here2");
    pool.query("SELECT name from pings where test = decode($1,'hex');",[body.bid], (err,res)=>{
        if(err){
            console.error(err.stack);
            _response = buildOutput(500, {
                message:"error in pg"
            });         
            callback(_response, null);
        }
        console.log("here3");
        var iotdata = new AWS.IotData({endpoint:'XXXXXXX.iot.us-east-1.amazonaws.com'});
        const publishParams = {
            topic: body.topic,
            payload: Buffer.from(JSON.stringify({
                message: "Welcome to "+res.rows[0].name+" house"
            }), 'utf8'),
            qos: 0
        }
        console.log("here4");
        iotdata.publish(publishParams, function(err, data) {
            if(err){
                console.error(err.stack);
                _response = buildOutput(500, {
                    message:"error in pg"
                });      
                callback(_response,null);
            }
            _response = buildOutput(200, {message: "success"});             
            callback(null, _response);
        });
    });
} else {
    _response = buildOutput(500, {
        message:"path not found"
    });      
    callback(_response,null);
}
};
/* Utility function to build HTTP response for the microservices output */ 
function buildOutput(statusCode, data) {  
let _response = {         
    statusCode: statusCode,
    headers: {
        "Access-Control-Allow-Origin": "*"
    },
    body: JSON.stringify(data)
}; 

return _response; 
}

政策

    {
        "Sid": "",
        "Effect": "Allow",
        "Action": [
            "iot:*"
        ],
        "Resource": "*"
    },

更新 我试图临时给lambda函数admin访问权限,甚至没有工作。

1 个答案:

答案 0 :(得分:0)

这是您可以直接从lambda函数发布MQTT主题的方法。 使用Node.js 10.x

中编写的代码
var AWS = require('aws-sdk');
const IOT_ENDPOINT = "yourIoTentPoint.iot.region.amazonaws.com"

var iotdata = new AWS.IotData({endpoint:IOT_ENDPOINT});

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

var params = {
    topic: 'my/topic',
    payload: 'This is my menssage from Lambda function.',
    qos: 1
    };

iotdata.publish(params, function(err, data){
    if(err){
        callback(err, null);
    }
    else{
        callback(null, {"published_message": params.payload, "topic": params.topic});
    }
  });
};

此外,您还可以通过在AWS Console上通过IoT Core> Test订阅主题 my / topic 来查看发送的消息。

enter image description here