【问题标题】:AMQJS0008I Socket closed while using AWS IOT Publish/SubscribeAMQJS0008I 使用 AWS IOT 发布/订阅时套接字关闭
【发布时间】:2019-02-25 20:01:26
【问题描述】:

首先,我尝试使用 AWS Amplify 库来使用 IOT 模块为我的无服务器应用程序创建 AWS IOT 聊天(我按照文档中给出的步骤操作),但它不起作用并出现“Socket Already Closed”错误。

然后我尝试了 aws-iot-device-sdk 并按照 AWS 文档和代码 sn-ps 这样做,但同样的错误。

我按照以下步骤操作:

  1. 我已将“iot:*”权限授予我的 Cognito 池。
  2. 我创建了一项策略并将我的 Cognito 用户身份附加到该策略。
  3. 然后我尝试使用SDK和放大库连接它,连接成功,但是当我尝试发布/订阅一个主题时,它抛出了同样的错误。

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-iot aws-amplify aws-serverless


    【解决方案1】:

    我不确定您的问题可能出在哪里,但是当我第一次开始使用 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": [
                    "*"
                ]
            }
        ]
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2021-11-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2021-03-25
      • 2021-02-17
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多