【问题标题】:Cannot Pub or Sub on AWS IoT using MQTT over Websockets无法在 AWS IoT 上使用 MQTT over Websockets 发布或订阅
【发布时间】:2017-08-17 16:22:50
【问题描述】:

我可以使用 MQTT over Websockets 成功连接到 AWS IoT。但是在发布或订阅时,连接被终止。我认为这一定是 AWS 的基于策略/权限的问题,但我相信我拥有正确的权限。 这是我的设置:

我有一个 lambda 函数,它使用 STS 假设角色创建一个签名的 url(策略中的权限会更严格,但我允许访问所有资源上的所有 iot 函数以进行测试):

const config = require('./config');
const crypto = require('crypto');
const v4 = require('aws-signature-v4');
const async = require('async');
const util = require('util');
const AWS = require('aws-sdk');

exports.handler = function (event, context) {

var fail = function (err) {
    console.error(err);
    context.fail('Oops, something went wrong with your request');
};

const iot = new AWS.Iot();
const sts = new AWS.STS({region: 'eu-west-1'});
var params = {
    DurationSeconds: 3600,
    ExternalId: Date.now().toString(),
    Policy: JSON.stringify(
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "iot:*",
                    ],
                    "Resource": [
                        "*"
                    ]
                }
            ]
        }
    ),
    RoleArn: "arn:aws:iam::ACC_ID:role/iot_websocket_url_role",
    RoleSessionName: 'expo-' + Date.now()
};

sts.assumeRole(params, function(err, stsData) {
    if (err) {
        fail(err);
        return;
    }
    console.log(stsData);

    const AWS_IOT_ENDPOINT_HOST = 'MYENDPOINT.iot.eu-west-1.amazonaws.com';

    var url = v4.createPresignedURL(
        'GET',
        AWS_IOT_ENDPOINT_HOST,
        '/mqtt',
        'iotdata',
        crypto.createHash('sha256').update('', 'utf8').digest('hex'),
        {
            key: stsData.Credentials.AccessKeyId,
            secret: stsData.Credentials.SecretAccessKey,
            protocol: 'wss',
            expires: 3600,
            region: 'eu-west-1'
        }
    );
    url += '&X-Amz-Security-Token=' + encodeURIComponent(stsData.Credentials.SessionToken);
    console.log(url);

    context.succeed({url: url});

});

};

此处提供的 RoleArn 具有以下策略:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt1488299712000",
        "Effect": "Allow",
        "Action": [
            "iot:*"
        ],
        "Resource": [
            "*"
        ]
    }
]

}

我在 Polymer 项目中为我的前端代码使用 mqtt-elements。 我已经通过使用 Mosquitto 消息代理验证了它可以正常工作,并且 Pub/Sub 可以正常工作。

我已在 CloudWatch 中启用 AWS IoT 上的调试。这是日志:

2017-03-24 15:58:07.027 TRACEID:REDACTED PRINCIPALID:REDACTED/REDACTED [INFO] EVENT:MQTT Client Connect MESSAGE:Connect Status: SUCCESS

2017-03-24 15:58:07.027 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTT Client Connect MESSAGE: IpAddress: REDACTED SourcePort: 41430

2017-03-24 15:58:07.059 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTTClient Subscribe TOPICNAME:doorLatch MESSAGE:Subscribe Status: AUTHORIZATION_ERROR

2017-03-24 15:58:07.059 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTTClient Subscribe MESSAGE: IpAddress: REDACTED SourcePort: 41430

2017-03-24 15:58:07.068 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTTClient Subscribe TOPICNAME:doorLatch MESSAGE:Subscribe Status: AUTHORIZATION_ERROR

2017-03-24 15:58:07.068 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTTClient Subscribe MESSAGE: IpAddress: REDACTED SourcePort: 41430

2017-03-24 15:58:07.069 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTT Client Disconnect MESSAGE:Disconnect Status: SUCCESS

2017-03-24 15:58:07.069 TRACEID:REDACTED PRINCIPALID:REDACTED [INFO] EVENT:MQTT Client Disconnect MESSAGE: IpAddress: REDACTED SourcePort: 41430

所以很明显,问题是授权问题之一。但我角色中的策略 + 假设角色功能显然非常宽松,应该能够将消息发布和订阅到 AWS IoT。

如果能提供有关此问题的任何信息,我将不胜感激。

编辑:我也有raised this issue on AWS Forums。

【问题讨论】:

  • 我假设您确实解决了这个问题,您有什么解决方案吗?

标签: amazon-web-services websocket mqtt aws-iot


【解决方案1】:

无法将 STS 用于 IoT 连接。在 websockets 上使用 MQTT 的唯一方法是使用 Cognito 身份验证。

【讨论】:

  • 这是错误的,例如 this guide 使用 STS。
猜你喜欢
  • 2018-06-14
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2017-08-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多