AWS IoT - AMQJS0008I Socket closed - AUTHORIZATION_FAILURE
Я пытаюсь настроить AWS IoT для использования с AWS Amplify. Я всегда вижу ошибку: "Разъем AMQJS0008I закрыт", а CloudWatch сообщает " AUTHORIZATION_FAILURE". Это то, что я настроил
- Политика I AM для аутентифицированного пула идентификаторов Cognito
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"cognito-identity:*",
"mobileanalytics:PutEvents",
"cognito-sync:*",
"iot:Connect",
"iot:Publish",
"iot:Subscribe",
"iot:Receive",
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DeleteThingShadow",
"iot:AttachPolicy",
"iot:AttachPrincipalPolicy"
],
"Resource": "*"
}
]
}
- Политика Интернета вещей для Cognito Identity
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:ap-south-1:XXXXXXX:client/${iot:ClientId}"
},
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Receive"
],
"Resource": "arn:aws:iot:ap-south-1:XXXXXXX:topic/*"
},
{
"Effect": "Allow",
"Action": [
"iot:UpdateThingShadow",
"iot:GetThingShadow",
"iot:DeleteThingShadow"
],
"Resource": "arn:aws:iot:ap-south-1:XXXXXXX:thing/*"
},
{
"Effect": "Allow",
"Action": [
"iot:AttachPrincipalPolicy”,
"iot:AttachPolicy"
],
"Resource": [
"*"
]
}
]
}
- Прикрепленное индивидуальное когнитивное удостоверение с помощью AWS CLI
aws iot attach-policy --policy-name "hub-iot-policy" --target "ap-south-1:XXXX-USER_COGNITO_IDENTITY
- Подключение и подписка с помощью AWS Amplify с использованием пакетов
“@aws-amplify/api": "^3.1.7",
"@aws-amplify/auth": "^3.2.4",
"@aws-amplify/core": "^3.2.4",
"@aws-amplify/pubsub": "^3.0.8”,
код
PubSub.addPluggable(new AWSIoTProvider({
aws_pubsub_region: config.pubsub.REGION,
aws_pubsub_endpoint: `wss://${config.pubsub.MQTT_ID}.iot.${config.pubsub.REGION}.amazonaws.com/mqtt`,
}));
PubSub.subscribe('hub31-iot-thing').subscribe({
next: data => console.log('Message received', data),
error: error => console.error(error),
close: () => console.log('Done'),
});
}
- Консоль JS выдает ошибку как
{provider: AWSIoTProvider, error: {…}}error: {invocationContext: undefined, errorCode: 8, errorMessage: "AMQJS0008I Socket closed."} поставщик: AWSIoTProvider {_config: {…}, _clientsQueue: ClientsQueue, _topicObservers: Map(1), _clientIdObservers: Map(1)}
- Cloudwatch выдает ошибку как AUTHORIZATION_FAILURE
{
"timestamp": "2020-04-21 00:13:24.953",
"logLevel": "ERROR",
"traceId": “308de5a7-XXXX-d2d5-XXXX-7e24b6d6e0e6",
"accountId": “XXXXXXXX",
"status": "Failure",
"eventType": "Connect",
"protocol": "MQTT",
"clientId": “f5e1abef-XXXX-44af-XXXX-4a327b45481c",
"principalId": “XXXXX:CognitoIdentityCredentials",
"sourceIp": “XXXX",
"sourcePort": 59101,
"reason": "AUTHORIZATION_FAILURE",
"details": "Authorization Failure"
}
1 ответ
Получил ту же ошибку, и вот как я ее решил.
1. Политика Cognito как
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iot:Receive",
"cognito-identity:*",
"iot:Subscribe",
"iot:AttachPolicy",
"iot:AttachPrincipalPolicy",
"iot:Connect",
"mobileanalytics:PutEvents",
"iot:GetThingShadow",
"iot:DeleteThingShadow",
"iot:UpdateThingShadow",
"iot:Publish",
"cognito-sync:*"
],
"Resource": "*"
}
]
}
Также обратите внимание, что AttachPrincipalPolicy устарел, но для большей безопасности я включил его
2. Политика Интернета вещей как
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
3. Прикрепите политику Интернета вещей к индивидуальной идентификационной информации с помощью лямбда-выражения или интерфейса командной строки AWS. Используя CLI, эта команда выглядит так:
aws iot attach-policy --policy-name "iot-policy" --target "ap-south-1:XXXX-USER-COGNITO-IDENTITY”
Снова обратите внимание, что AttachPrincipalPolicy устарел, используйте AttachPolicy
Использование лямбда:
export const main = async (event, context, callback) => {
const principal = event.requestContext.identity.cognitoIdentityId;
const policyName = 'iot-policy';
const iot = new AWS.Iot();
await iot.attachPrincipalPolicy({ principal, policyName }).promise();
callback(null, "success");
};
4. Проверка Если ваш интерфейс настроен правильно, вы сможете решить errorCode: 8, errorMessage: AMQJS0008I Ошибка закрытия сокета.
5. Точная настройка сейчас Точно настройте iot-политику в соответствии с вашими требованиями и сразу проверьте, работают ли изменения.