2017-03-03 17 views
0

一時的な資格情報を使用してSTSの一時的な資格情報を使用してAWS IoTへの接続を開始する際に問題が発生しています。AWS IoT MQS over WebSocket over STS一時的な資格情報

ポリシーで証明書を使用している組み込みデバイスに既に正常に接続しています。 しかし、私はブラウザを介して、事前に署名されたURLを使用して接続しようとすると、私はつまずくブロックを襲った。

以下は、要求(図示せず)を最初に認証し、次いで、assumeRoleを介してSTS資格情報を使用してURLを構築するラムダ関数のコードスニペットです。

私の生成したURLをPahoのjavascriptクライアントと一緒に使って、ブラウザで "101 Switching Protocols"という応答を受け取ったところで成功しました。しかし、WebSocketに切り替えるのではなく、接続が終了します。

私に何か助けや指導があれば、大変感謝します。

const iot = new AWS.Iot(); 
const sts = new AWS.STS({region: 'eu-west-1'}); 
const params = { 
    DurationSeconds: 3600, 
    ExternalId: displayId, 
    Policy: JSON.stringify(
     { 
      "Version": "2012-10-17", 
      "Statement": [ 
       { 
        "Effect": "Allow", 
        "Action": [ 
         "iot:*" 
        ], 
        "Resource": [ 
         "*" 
        ] 
       }, 
       /*{ 
        "Effect": "Allow", 
        "Action": [ 
         "iot:Connect" 
        ], 
        "Resource": [ 
         "arn:aws:iot:eu-west-1:ACCID:client/" + display._id 
        ] 
       }, 
       { 
        "Effect": "Allow", 
        "Action": [ 
         "iot:Receive" 
        ], 
        "Resource": [ 
         "*" 
        ] 
       }*/ 
      ] 
     } 
    ), 
    RoleArn: "arn:aws:iam::ACCID:role/iot_websocket_url_role", 
    RoleSessionName: displayId + '-' + Date.now() 
}; 

sts.assumeRole(params, function(err, stsData) { 
    if (err) { 
     fail(err, db); 
     return; 
    } 
    console.log(stsData); 

    const AWS_IOT_ENDPOINT_HOST = 'REDACTED.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}); 
}); 

編集:それは助けている場合、私はちょうど101コードを返す要求を選択した後、クロムデバッガで「フレーム」ウィンドウ内にチェック。それは単一フレームを示します: "バイナリフレーム(Opcode 2、マスク)"。

このオペコードは、MQTT制御コード2の「CONNACK」を参照していますか?私はMQTTの専門家ではありません(まだ!)。

答えて

0

私はSTSのドキュメントを読んで私の間違いを認識しました。

この操作にポリシーを渡すと、操作によって返される一時的なセキュリティ資格情報には、想定されている役割のアクセスポリシーと、渡すポリシー。

指定されたRoleARNは、STS assumeRoleを介して要求しているアクションも許可する必要があります。

つまりRoleAnはiot:*を許可することができます。役割を引き受けると、たとえばiot:Connectや特定のリソースなどにアクセス権を絞り込むことができます。

関連する問題