2017-03-24 2 views
1

Je peux me connecter avec succès à AWS IoT en utilisant MQTT sur Websockets. Mais lors de la publication ou de l'abonnement, la connexion est interrompue. Je suppose qu'il doit s'agir d'un problème basé sur les stratégies/permissions avec AWS, mais je suis convaincu que j'ai les permissions correctes. Voici ma configuration:Can not Pub ou Sub sur AWS IoT à l'aide de MQTT sur Websockets

J'ai une fonction lambda qui crée une URL signé en utilisant STS assumeRole (autorisations dans la politique seront plus strictes mais j'ont permis l'accès à toutes les fonctions IOT sur toutes les ressources pour les tests):

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

}); 

};

Le RoleArn fourni ici a la politique suivante:

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

}

J'utilise des éléments de MQTT dans un projet polymère pour mon code frontend. J'ai validé que cela fonctionne correctement en utilisant Mosquitto courtier de messages et Pub/Sub fonctionne bien avec elle. J'ai activé le débogage sur AWS IoT dans CloudWatch. Voici le journal:

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 

Il est donc clair que le problème est celui de l'autorisation. Mais les politiques dans mon rôle + la fonction de supposerRole sont clairement très permissives et devraient permettre Pub & Sous des messages à AWS IoT.

J'apprécierais toute information à ce sujet.

Modifier: J'ai aussi raised this issue on AWS Forums.

+0

Je suppose que vous avez résolu ce problème, avez-vous une solution? – gusto2

Répondre

0

Il n'est pas possible d'utiliser STS pour une connexion IoT. La seule façon d'utiliser MQTT sur websockets est d'utiliser une identité Cognito authentifiée.

+0

Ceci est faux, par exemple [ce guide] (https://serverless.com/blog/serverless-notifications-on-aws/) utilise STS. – Solo