AMQJS0008I Сокет закрыт при использовании AWS IOT Публикация / подписка - PullRequest
0 голосов
/ 21 сентября 2018

Сначала я попытался использовать библиотеку AWS Amplify, чтобы использовать модуль IOT для создания AWS IOT Chat для моего безсерверного приложения (я выполнил действия, описанные в документации), но это не сработало и выдало ошибку «Socket Already Closed».

Затем я попробовал aws-iot-device-sdk и следовал документации AWS и фрагментам кода, чтобы сделать это, но та же ошибка.

Я выполнил следующие шаги:

  1. Я дал права "iot: *" для моего пула Cognito.
  2. Я создал одну политику и прикрепил мой CognitoИдентификация пользователя в этой политике.
  3. Затем я попытался подключить его с помощью SDK и библиотеки усиления, и он был успешно подключен, но затем, когда я попытался опубликовать / подписаться на тему, он выдал ту же ошибку.

1 Ответ

0 голосов
/ 01 октября 2018

Я не совсем уверен, где может быть ваша проблема, но я боролся с той же проблемой, когда впервые начал использовать Amplify PubSub.Для меня это был вопрос политики.Таким образом, может помочь одна из следующих вещей:

Подключите документ своей политики вещей к идентификатору пользователя для объединенного пула (а не к идентификатору из пула пользователей).Мой документ политики выглядит следующим образом:

 {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect",
        "iot:AttachPrincipalPolicy",
        "iot:Publish",
        "iot:Subscribe",
        "iot:Receive",
        "iot:GetThingShadow",
        "iot:UpdateThingShadow",
        "iot:DeleteThingShadow"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

Чтобы прикрепить / обновить политику для всех моих пользователей (не так много), я использую функцию Lambda для этого:

var AWS = require("aws-sdk");
const cognito = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});
var cognitoidentity = new AWS.CognitoIdentity();
var iot = new AWS.Iot({apiVersion: '2015-05-28'});

exports.handler = (event, context, callback) => {
    var params = {
      IdentityPoolId: 'eu-central-1:xxxxxxxx-xxxx-xxxx-xxx-xxxxxxxx', /* change this */
      MaxResults: 50,
    };
    cognitoidentity.listIdentities(params, function(err, data) {
        if (err) console.log(err, err.stack);
        else {
            addPolicies(data.Identities);
        }
    });
    function addPolicies(users) {
        for (let i = 0; i<users.length;i++) {
            var params2 = {
              policyName: 'myIOTPolicy',
              principal: users[i].IdentityId
            };
            iot.attachPrincipalPolicy(params2, function(err, data) {
              if (err) console.log(err, err.stack);
              else     console.log(data);
            });
        }
    }
  callback(null, event);
};

Для моей аутентифицированной роли в пуле удостоверений к этой роли прикреплена следующая политика:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AttachPrincipalPolicy",
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive",
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",
                "iot:DeleteThingShadow"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

Надеюсь, это поможет

...