2017-03-24 1 views
1

웹 소켓을 통해 MQTT를 사용하여 AWS IoT에 성공적으로 연결할 수 있습니다. 그러나 게시 또는 가입시 연결이 종료됩니다. AWS에서 정책/권한 기반 문제 여야한다고 생각하지만 올바른 권한이 있다고 확신합니다. 가 여기 내 설정이다 : 나는 STS assumeRole를 사용하여 서명 된 URL을 생성하는 람다 함수를웹 소켓에서 MQTT를 사용하여 AWS IoT에서 Pub 또는 Sub를 수행 할 수 없음

(정책 권한은 엄격한 될 것입니다하지만 테스트에 대한 모든 자원에 대한 모든 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}); 

}); 

};

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

}

내 프론트 엔드 코드에 대한 고분자 프로젝트에서 MQTT 요소를 사용하고 있습니다 : 여기에 제공된

RoleArn는 다음과 같은 정책을 가지고 있습니다. Mosquitto 메시지 브로커를 사용하여 Pub/Sub가 올바르게 작동 함을 확인했습니다.

AWS IoT에서 CloudWatch로 디버깅을 사용하도록 설정했습니다. 로그는 다음과 같습니다.

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 

따라서이 문제는 권한 부여 중 하나임이 분명합니다. 하지만 내 역할 + assumRole 함수의 정책은 매우 관대하며 Pub & AWS IoT에 메시지 하위를 사용 가능하게해야합니다.

이 문제에 대한 정보는 언제나 감사하겠습니다.

편집 : 나는 raised this issue on AWS Forums도 가지고 있습니다.

+0

이 문제를 해결했다고 가정합니다. 해결책이 있습니까? – gusto2

답변

0

IoT 연결에 STS를 사용할 수 없습니다. 웹 소켓에서 MQTT를 사용하는 유일한 방법은 Cognito 인증 ID를 사용하는 것입니다.

+0

허위입니다. 예를 들어 [this guide] (https://serverless.com/blog/serverless-notifications-on-aws/)는 STS를 사용합니다. – Solo

관련 문제