【发布时间】:2020-03-14 09:08:27
【问题描述】:
我正在尝试连接到已部署的 AWS IoT 堆栈
const AWS = require('aws-sdk');
const iotData = new AWS.IotData({ endpoint: MYENDPOINT });
exports.handler = async (event) => {
try {
const request = event;
console.log(request);
const params = {
topic: common.topicOut,
payload: 'MYPAYLOAD'
}
console.log("endpoint:",iotData.endpoint,"params:",params);
iotData.publish(params, (err,res) => {
if (err) throw err;
return { statusCode: 200, body: res };
})
} catch (e) {
console.error(e);
return { statusCode: 400, body: 'error, see lambda console' };
}
};
通常一切都“编译”(没有错误),但后来我没有收到任何回应。缩小问题范围,我发现我正在尝试使用 https REST 端点,但 MYENDPOINT 仅支持 wss
我知道https://aws.amazon.com/es/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/,但那是为了让 lambdas 作为 wscat 客户端的“服务器”。我也读过somediscouragingpostshere,但我更愿意仔细检查你们中是否有人已经找到了使用 AWS-Lambda 的解决方案
如果没有,我将开始使用this workaround,但我无法控制 wss 端点,所以我必须自己制作一个并建议对方在他们这边为我做更改(而且我根本无法控制)
非常感谢您的经历(即使它们是关于“不要走这条路”的提示)。
更新: 我有一个基于控制台的测试客户端,它能够通过 awsIot.device 连接到端点并提供 keyPath、certPath、caPath 和 clientId。
可能是因为权限问题,我收到了静默错误吗?当我尝试在没有证书的情况下使用 awsIot.device 时,它会以 Error: No "keyPath" or "privateKey" option supplied. 失败,所以我无法检查是否在控制台上我会收到相同的(静默)错误
UPDATE2:关注https://docs.aws.amazon.com/iot/latest/developerguide/http.html 我可以
$ curl --tlsv1.2 --cacert ./certificates/Amazon_Root_CA_1.pem --cert ./certificates/MYCRT --key ./certificates/MYKEY -X POST -d"PAYLOAD" "https://XXX.iot.REGION.amazonaws.com:8443/topics/MYTOPIC?qos=0"
它有效。因此,我比以前更加确信,如果我能够将证书添加到请求中,这将起作用
UPDATE3:我目前没有为此使用任何 AWS,只是创建了一个模仿上述 curl 调用的 https 请求
【问题讨论】:
标签: javascript amazon-web-services websocket aws-lambda aws-iot