一時的な資格情報を使用して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の専門家ではありません(まだ!)。