Configuración y solución de problemas de AWS IoT Greengrass con dispositivos cliente - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configuración y solución de problemas de AWS IoT Greengrass con dispositivos cliente

Creado por Marouane Sefiani y Akalanka De Silva (AWS)

Entorno: PoC o piloto

Tecnologías: IoT

Servicios de AWS: AWS IoT Greengrass; AWS IoT Core

Resumen

AWS IoT Greengrass es un servicio en la nube y de tiempo de ejecución de periferia de código abierto que le ayuda a crear, implementar y administrar software de Internet de las Cosas (IoT) en los dispositivos periféricos. Los casos de uso de AWS IoT Greengrass incluyen:

  • Hogares inteligentes en los que se utiliza una puerta de enlace de AWS IoT Greengrass como centro de automatización del hogar

  • Fábricas inteligentes donde AWS IoT Greengrass puede facilitar la incorporación y el procesamiento local de datos desde el taller

AWS IoT Greengrass puede actuar como un punto de conexión MQTT seguro y autenticado para otros dispositivos periféricos (también conocidos como dispositivos cliente) que, de otro modo, normalmente se conectarían directamente a AWS IoT Core. Esta capacidad resulta útil cuando los dispositivos cliente no tienen acceso directo a la red del punto de conexión de AWS IoT Core.

Puede configurar AWS IoT Greengrass para su uso con dispositivos cliente en los siguientes casos de uso:

  • Para que los dispositivos cliente envíen datos a AWS IoT Greengrass

  • Para que AWS IoT Greengrass reenvíe datos a AWS IoT Core

  • Para aprovechar las características avanzadas del motor de reglas de AWS IoT Core

Estas capacidades requieren la instalación y configuración de los siguientes componentes en el dispositivo AWS IoT Greengrass:

  • Intermediario MQTT

  • Puente MQTT

  • Autenticación del dispositivo cliente

  • Detector de IP

Además, los mensajes publicados desde los dispositivos cliente deben estar en formato JSON o en formato Protocol Buffers (protobuf).

Este patrón describe cómo instalar y configurar estos componentes necesarios y proporciona consejos para la solución de problemas y las prácticas recomendadas.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

  • Debe elegir una región de AWS en la que esté disponible AWS IoT Core. Para ver la lista actual de regiones de AWS IoT Core, consulte Servicios de AWS por región.

  • El dispositivo principal debe tener al menos 172 MB de RAM y 512 MB de espacio en disco.

Arquitectura

El siguiente diagrama muestra la arquitectura de soluciones para este patrón.

Arquitectura de soluciones para configurar AWS IoT Greengrass con dispositivos cliente

La arquitectura incluye:

  • Dos dispositivos cliente. Cada dispositivo contiene una clave privada, un certificado de dispositivo y un certificado de la entidad de certificación (CA) raíz. El SDK para dispositivos de AWS IoT, que contiene un cliente MQTT, también está instalado en cada dispositivo cliente.

  • Un dispositivo principal que haya implementado AWS IoT Greengrass con los siguientes componentes:

    • Intermediario MQTT

    • Puente MQTT

    • Autenticación del dispositivo cliente

    • Detector de IP

Esta arquitectura admite los siguientes escenarios:

  • Los dispositivos cliente pueden usar su cliente MQTT para comunicarse entre sí a través del intermediario MQTT del dispositivo principal.

  • Los dispositivos cliente también pueden comunicarse con AWS IoT Core en la nube a través del intermediario MQTT del dispositivo principal y el puente MQTT.

  • AWS IoT Core en la nube puede enviar mensajes a los dispositivos cliente a través del cliente de prueba MQTT y el puento MQTT y el intermediario MQTT del dispositivo principal.

Para obtener más información sobre las comunicaciones entre los dispositivos cliente y el dispositivo principal, consulte la sección información adicional.

Herramientas

Servicios de AWS

  • AWS IoT Greengrass es un servicio en la nube y de tiempo de ejecución de borde de Internet de las Cosas (IoT) de código abierto que le ayuda a crear, implementar y administrar aplicaciones de IoT en los dispositivos.

  • AWS IoT Core proporciona una comunicación bidireccional segura para que los dispositivos conectados a Internet se conecten a la nube de AWS.

  • Los SDK de dispositivos de AWS IoT son un kit de desarrollo de software que contienen bibliotecas de código abierto, guías de desarrolladores con ejemplos y guías de migración para que pueda crear productos o soluciones de IoT innovadores en las plataformas de hardware deseadas.

  • AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos.

Prácticas recomendadas

  • La carga útil de los mensajes de los dispositivos cliente debe estar en formato JSON o Protobuf para aprovechar las características avanzadas del motor de reglas de AWS IoT Core, como la transformación y las acciones condicionales.

  • Configure el puente MQTT para permitir la comunicación bidireccional.

  • Configure e implemente el componente detector de IP en AWS IoT Greengrass para garantizar que las direcciones IP del dispositivo principal se incluyan en el campo del nombre alternativo del asunto (SAN) del certificado de intermediario de MQTT.

Epics

TareaDescripciónHabilidades requeridas

Configurar AWS IoT Greengrass en el dispositivo principal.

Instale el software AWS IoT Greengrass Core siguiendo las instrucciones de la guía para desarrolladores.

AWS IoT Greengrass

Compruebe el estado de la instalación.

Utilice el siguiente comando para comprobar el estado del servicio AWS IoT Greengrass en su dispositivo principal:

sudo systemctl status greengrass.service

El resultado esperado del comando es:

Launched Nucleus successfully
AWS general

Configure una política de IAM y asóciela al rol de servicio de Greengrass.

  1. Cree una política de IAM para permitir las comunicaciones hacia y desde el puente MQTT. A continuación se muestra un ejemplo de política:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" }, { "Sid": "GreengrassActions", "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": "*" } ] }
  2. Asocie la política al rol de servicio de Greengrass. Para obtener el rol de servicio, use el comando:

    aws greengrassv2 get-service-role-for-account --region <region>

    donde <region> se refiere a su región de AWS.

AWS general

Configure e implemente los componentes necesarios en el dispositivo principal de AWS IoT Greengrass.

Configure e implemente los siguientes componentes:

AWS IoT Greengrass

Confirme que el puente MQTT permite la comunicación bidireccional.

Para retransmitir mensajes MQTT entre los dispositivos cliente y AWS IoT Core, configure e implemente el componente puente MQTT y especifique los temas que se van a retransmitir. A continuación se muestra un ejemplo:

{ "mqttTopicMapping": { "ClientDevicesToCloud": { "topic": "dt/#", "source": "LocalMqtt", "target": "IotCore" }, "CloudToClientDevices": { "topic": "cmd/#", "source": "IotCore", "target": "LocalMqtt" } } }
AWS IoT Greengrass

Confirme que el componente de autenticación permite a los dispositivos cliente conectarse y publicar temas o suscribirse a ellos.

La siguiente configuración aws.greengrass.clientdevices.Auth permite que todos los dispositivos cliente se conecten, publiquen mensajes y se suscriban a todos los temas.

{ "deviceGroups": { "formatVersion": "2021-03-05", "definitions": { "MyPermissiveDeviceGroup": { "selectionRule": "thingName: *", "policyName": "MyPermissivePolicy" } }, "policies": { "MyPermissivePolicy": { "AllowAll": { "statementDescription": "Allow client devices to perform all actions.", "operations": [ "*" ], "resources": [ "*" ] } } } } }
AWS IoT Greengrass
TareaDescripciónHabilidades requeridas

Instalar el SDK para dispositivos con AWS IoT.

Instale el SDK para dispositivos con AWS IoT en los dispositivos cliente. Para obtener una lista completa de los idiomas compatibles y los SDK asociados, consulte la documentación de AWS IoT Core.

Por ejemplo, el SDK de dispositivos de AWS IoT para Python se encuentra en GitHub. Para instalar este SDK:

  1. Confirme que Python 3.7 o posterior esté instalado, tal y como se indica en la página de requisitos previos del GitHub repositorio.

  2. Utilice el comando pip para instalar el SDK.

    Para macOS y Linux:

    python3 -m pip install awsiotsdk

    Para Windows:

    python -m pip install awsiotsdk

Como opción, puede instalar el SDK desde el repositorio de origen:

# Create a workspace directory to hold all the SDK files mkdir sdk-workspace cd sdk-workspace # Clone the repository git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git # Install using Pip (use 'python' instead of 'python3' on Windows) python3 -m pip install ./aws-iot-device-sdk-python-v2
AWS IoT general

Cree un objeto.

  1. En la consola de AWS IoT, si aparece un botón Get started (Empezar), elíjalo. De lo contrario, en el panel de navegación, seleccione Security Policies (Políticas de seguridad).

  2. Si aparece el cuadro de diálogo You don’t have any policies yet (Aún no tiene ninguna política), elija Create a policy (Crear una política). De lo contrario, seleccione Create (Crear).

  3. Escriba un nombre para la política de AWS IoT (por ejemplo, ClientDevicePolicy).

  4. En la sección Add statements (Añadir instrucciones), sustituya la política existente por el siguiente código JSON. Sustituya <region> y <account> por su región de AWS y su número de cuenta AWS.

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account:client/*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account:thing/*" } ] }
  5. Seleccione Crear.

  6. En la consola AWS IoT, en el panel de navegación, seleccione Manage (Administrar), Things (Objetos).

  7. Si aparece el cuadro de diálogo You don't have any things yet (Aún no tiene ningún objeto), elija Register a thing (Registrar un objeto). De lo contrario, seleccione Crear.

  8. En la página Creating AWS IoT things (Creación de objetos de AWS IoT), elija Create a single thing (Crear un solo objeto).

  9. En la página Añadir su dispositivo al registro de dispositivos, escriba un nombre para el objeto de IoT (por ejemplo, ClientDevice1) y, a continuación, elija Siguiente.

    Nota: No puede modificar el nombre de un objeto una vez creado. Para cambiar el nombre,, debe crear otro objeto nuevo, asignarle el nuevo nombre y eliminar después el objeto anterior.

  10. En la página Add a certificate for your thing (Añadir un certificado para el objeto), elija Create certificate (Crear certificado).

  11. Elija los enlaces Descargar para descargar el certificado, la clave privada y el certificado de CA raíz.

    Importante: esta es su única oportunidad para descargar su certificado y su clave privada.

  12. Elija Activate (Activar) para activar su certificado. El certificado debe estar activo para que un dispositivo se conecte a AWS IoT.

  13. Elija Attach a policy (Asociar una política).

  14. En Añadir una política para lo tuyo ClientDevicePolicy, selecciona Registrar cosa.

AWS IoT Core

Descargue el certificado de CA del dispositivo principal de Greengrass.

Si espera que el dispositivo principal de Greengrass funcione en entornos fuera de línea, debe poner el certificado de CA principal de Greengrass a disposición del dispositivo cliente para que pueda verificar el certificado del intermediario MQTT (emitido por la CA principal de Greengrass). Por lo tanto, es importante obtener una copia de este certificado. Utilice alguna de los siguientes opciones para descargar el certificado de CA:

  • Si tiene acceso de red al dispositivo AWS IoT Greengrass desde su PC, acceda a https://<device IP>:8883 en su navegador web y consulte el certificado de intermediario MQTT y el certificado de CA. También puede guardar el certificado de CA en el dispositivo cliente.

  • Como opción, puede utilizar la línea de comando OpenSSL:

    openssl s_client -showcerts -connect <device IP>:8883
AWS general

Copiar las credenciales en los dispositivos cliente.

Copiar el certificado de CA principal de Greengrass, el certificado del dispositivo y la clave privada en los dispositivos cliente.

AWS general

Asociar los dispositivos cliente al dispositivo principal.

Asociar los dispositivos cliente a un dispositivo principal para que puedan detectar el dispositivo principal. A continuación, los dispositivos cliente pueden usar la API de descubrimiento de Greengrass para recuperar la información de conectividad y los certificados de sus dispositivos principales asociados. Para obtener más información, consulte Asociación de dispositivos cliente en la documentación de AWS IoT Greengrass.

  1. En la consola de AWS IoT Greengrass, elija Core devices (Dispositivos principales).

  2. Elija el dispositivo principal que desee administrar.

  3. En la página de detalles del dispositivo principal, elija la pestaña Client devices (Dispositivos cliente).

  4. En la sección Associated client devices (Dispositivos cliente asociados), seleccione Associate client devices (Asociar dispositivos cliente).

  5. En el modal Associate client devices with core device (Asociar dispositivos cliente a dispositivos principales), haga lo siguiente para cada dispositivo cliente que desee asociar:

    1. Introduzca el nombre del objeto de AWS IoT que desee asociar como dispositivo cliente.

    2. Elija Add (Añadir).

  6. Elija Associate (Asociar).

Los dispositivos cliente que asoció ahora pueden usar la API de detección de Greengrass para detectar este dispositivo principal.

AWS IoT Greengrass
TareaDescripciónHabilidades requeridas

Enviar datos de un dispositivo cliente a otro dispositivo cliente.

Utilice el cliente MQTT de su dispositivo para publicar un mensaje sobre el tema dt/client1/sensor.

AWS general

Envíe datos desde el dispositivo cliente a AWS IoT Core.

Utilice el cliente MQTT de su dispositivo para publicar un mensaje sobre el tema dt/client1/sensor.

En el cliente de prueba de MQTT, suscríbase al tema sobre el que el dispositivo está enviando mensajes o suscríbase a # para todos los temas (consulte los detalles).

AWS general

Enviar mensajes desde AWS IoT Core a dispositivos cliente.

En la página del cliente de prueba de MQTT, en la pestaña Publish to a topic (Publicar en un tema), en el campo Topic name (Nombre del tema), introduzca el nombre del tema de su mensaje. En este ejemplo, utilice cmd/client1 para el tema.

AWS general

Resolución de problemas

ProblemaSolución

No se pudo verificar el error del certificado del servidor

Este error se produce cuando el cliente MQTT no puede verificar el certificado presentado por el intermediario MQTT durante el protocolo de enlace TLS. La razón más común es que el cliente MQTT no tiene el certificado de CA. Siga estos pasos para asegurarse de que el certificado de CA se proporciona al cliente MQTT.

  1. Si tiene acceso de red al dispositivo AWS IoT Greengrass desde su PC, acceda a https://<device IP>:8883 en una ventana de navegador para consulte el certificado de intermediario MQTT y el certificado de CA. También puede guardar el certificado de CA en el dispositivo cliente.

    Como opción, puede utilizar la línea de comando OpenSSL:

    openssl s_client -showcerts -connect <device IP>:8883
  2. Guardar el contenido de los certificados Moquette CA y Greengrass Core CA en archivos y, a continuación, visualizar el contenido decodificado mediante el comando:

    openssl x509 -in <Name of CA>.pem -text

    El certificado CA de Moquette debe mostrar el campo SAN, como en este ejemplo:

    X509v3 Subject Alternative Name: IP Address:XXX.XXX.XXX.XXX, IP Address:127.0.0.1, DNS:localhost

No se pudo verificar el error del nombre del servidor

Este error se produce cuando el cliente MQTT no puede comprobar que se está conectando al servidor correcto. La razón más común es que la dirección IP del dispositivo Greengrass no aparece en el campo SAN del certificado.

Siga las instrucciones de la solución anterior para obtener el certificado de intermediario MQTT y compruebe que el campo SAN contiene la dirección IP del dispositivo AWS IoT Greengrass, tal y como se explica en la sección Información adicional. Si no es así, confirme que el componente del detector de IP está instalado correctamente y reinicie el dispositivo principal.

No se puede verificar el nombre del servidor solo cuando se conecta desde un dispositivo cliente integrado

Mbed TLS, que es una biblioteca TLS popular que se utiliza en los dispositivos integrados, actualmente solo admite la verificación de nombres DNS en el campo SAN del certificado, como se muestra en el código de la biblioteca Mbed TLS. Como el dispositivo principal no tiene su propio nombre de dominio y depende de la dirección IP, los clientes de TLS que utilizan Mbed TLS no pasarán la verificación del nombre del servidor durante el protocolo de enlace TLS, lo que provocará un fallo de conexión. Recomendamos que añada la verificación de la dirección IP de SAN a la biblioteca Mbed TLS en la función x509_crt_check_san.

Recursos relacionados

Información adicional

Esta sección ofrece información adicional sobre las comunicaciones entre los dispositivos cliente y el dispositivo principal.

El intermediario MQTT escucha en el puerto 8883 del dispositivo principal los intentos de conexión con un cliente TLS. En la siguiente ilustración se muestra un ejemplo de un certificado de servidor de intermediario MQTT.

Ejemplo de certificado de servidor de intermediario MQTT

El certificado de ejemplo muestra los siguientes detalles:

  • El certificado lo emite la CA principal de AWS IoT Greengrass, que es local y específica del dispositivo principal; es decir, actúa como una CA local.

  • El componente de autenticación del cliente rota automáticamente este certificado cada semana, como se muestra en la siguiente ilustración. Puede establecer este intervalo en la configuración del componente de autenticación del cliente.

Rotación del certificado de servidor del intermediario MQTT
  • El nombre alternativo del asunto (SAN) desempeña un papel fundamental en la verificación del nombre del servidor por parte del cliente TLS. Ayuda al cliente TLS a garantizar que se conecta al servidor correcto y ayuda a evitar man-in-the-middle ataques durante la configuración de la sesión TLS. En el certificado de ejemplo, el campo SAN indica que este servidor escucha en localhost (el conector de dominio Unix local) y que la interfaz de red tiene la dirección IP 192.168.1.12.

El cliente TLS utiliza el campo SAN del certificado para comprobar que se está conectando a un servidor legítimo durante la verificación del servidor. Por el contrario, durante un protocolo de enlace TLS típico entre un servidor HTTP y un navegador, el nombre de dominio del campo del nombre común (CN) o del campo SAN se utiliza para comprobar el dominio al que se está conectando realmente el navegador durante el proceso de verificación del servidor. Si el dispositivo principal no tiene un nombre de dominio, la dirección IP incluida en el campo SAN sirve para el mismo propósito. Para obtener más información, consulte la sección Nombre alternativo del asunto de RFC 5280: perfil del certificado de infraestructura de clave pública X.509 de Internet y de la lista de revocación de certificados (CRL).

El componente detector de IP de AWS IoT Greengrass garantiza que se incluyan las direcciones IP correctas en el campo SAN del certificado.

El certificado del ejemplo lo firma el dispositivo AWS IoT Greengrass que actúa como CA local. El cliente TLS (cliente MQTT) no conoce esta CA, por lo que debemos proporcionar un certificado de CA similar al siguiente.

Ejemplo de certificado de CA