웹 소켓을 통해 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도 가지고 있습니다.
이 문제를 해결했다고 가정합니다. 해결책이 있습니까? – gusto2