AWS IoT Core es el servicio de Amazon Web Services para conectar dispositivos a la nube. En la práctica es un broker MQTT administrado con todo lo que un proyecto serio necesita alrededor: identidad por dispositivo, permisos finos, estado guardado aunque el dispositivo esté apagado y reglas para enviar los datos a otros servicios.
En esta guía te explico sus piezas, cómo encajan y qué cuesta, con ejemplos prácticos con ESP32.
Para qué sirve
Imagina que tienes un ESP32 en casa y quieres controlarlo desde el celular, estés donde estés. Necesitas:
- un punto en internet al que el ESP32 se conecte y se mantenga conectado;
- una forma de que solo tu ESP32 pueda conectarse como tal;
- una forma de enviarle órdenes y saber si las cumplió;
- que, si estaba apagado, al volver sepa qué se le pidió.
AWS IoT Core resuelve las cuatro sin que mantengas ningún servidor.
Las piezas principales
| Pieza | Qué hace |
|---|---|
| Device gateway y broker de mensajes | Recibe las conexiones de los dispositivos (MQTT, MQTT sobre WebSocket o HTTPS) y reparte los mensajes por tópicos |
| Things (registro) | La representación de cada dispositivo en la nube |
| Certificados X.509 | La identidad de cada dispositivo: así se autentica, sin usuario ni contraseña |
| Políticas de IoT | Qué puede hacer cada certificado: conectarse con qué nombre, publicar y suscribirse a qué tópicos |
| Device Shadow | Un documento JSON por dispositivo con el estado deseado y el estado reportado |
| Reglas | Consultas tipo SQL sobre los mensajes para enviarlos a Lambda, DynamoDB, S3 y otros servicios |
| Jobs | Tareas para flotas de dispositivos, como actualizaciones de firmware |
| Device Defender | Auditoría de configuración y detección de comportamientos anómalos |
Cómo se conecta un dispositivo
Un ESP32 se conecta por MQTT sobre TLS (puerto 8883) al endpoint de tu cuenta. En lugar de usuario y contraseña, presenta su certificado X.509 y su llave privada. AWS comprueba el certificado y aplica la política adjunta.
Una buena política solo permite lo mínimo: conectarse con su propio nombre y usar los tópicos de su propio Shadow. Nada de "Resource": "*", que permitiría a quien robe el certificado publicar en cualquier tópico de tu cuenta.
El paso a paso completo, con la política mínima y el código para Arduino, está en la parte 3 de la serie de domótica.
Los navegadores y las apps se conectan de otra forma: por MQTT sobre WebSocket con una URL firmada con SigV4, el esquema de firma de AWS. Las credenciales suelen venir de Cognito, o de una Lambda que firma la URL; lo explico en la parte 10.
El Device Shadow: el estado que sobrevive
El Device Shadow es la pieza que más trabajo ahorra. Es un documento JSON que AWS guarda por cada dispositivo:
{
"state": {
"desired": { "led": "on" },
"reported": { "led": "off" }
}
}
desired: lo que la app, un script o un asistente de voz quieren que pase.reported: lo que el dispositivo confirma que pasó.
Cuando no coinciden, AWS publica un delta en un tópico reservado; el dispositivo lo recibe, actúa y reporta. Si estaba desconectado, al volver pide el documento completo y se pone al día. Con tópicos propios, un mensaje enviado mientras el dispositivo estaba apagado simplemente se perdería.
Los Shadows con nombre permiten separar documentos, por ejemplo el estado de las luces y la configuración (parte 5).
Reglas: llevar los datos a otros servicios
Una regla es una consulta tipo SQL sobre los mensajes que llegan:
SELECT temperatura, humedad, timestamp() AS ts
FROM 'casa/+/sensores'
WHERE temperatura > 30
Y una acción que se ejecuta con cada resultado: invocar una Lambda, guardar en DynamoDB, escribir en S3, enviar a una cola, etc. Sirve para guardar históricos, generar alertas o integrar con otros sistemas sin código en el dispositivo.
Con qué se combina en un proyecto real
AWS IoT Core rara vez va solo. Lo habitual es combinarlo con:
- Amazon Cognito para el login de los usuarios (parte 11);
- DynamoDB para dispositivos, configuración y lecturas (parte 7);
- Lambda para APIs, por ejemplo una de control por voz (parte 8);
- Políticas de IoT con variables para que cada dispositivo solo acceda a lo suyo (parte 13).
Cuánto cuesta
AWS IoT Core cobra por uso, en varias dimensiones:
| Concepto | Referencia (us-east-1) |
|---|---|
| Conexión | ~0,08 USD por millón de minutos conectados |
| Mensajes | ~1 USD por millón de mensajes, medidos en bloques de 5 KB |
| Device Shadow y registro | ~1,25 USD por millón de operaciones |
| Reglas | Por regla ejecutada y por acción |
Un dispositivo conectado todo el mes son unos 43.200 minutos: menos de medio centavo de dólar. Para un proyecto doméstico el costo es casi nulo; cómo estimarlo para tu proyecto, también para miles de casas, está en la parte 22. Los precios cambian: revisa la página oficial antes de decidir.
Límites que conviene conocer
- Device Shadow: 8 KB por documento.
- Mensajes MQTT: hasta 128 KB.
- Solicitudes al Shadow: existe un límite de solicitudes por segundo por Thing y otro por cuenta, ampliable a petición. Un hogar normal no se acerca.
- Conexión por client ID: si dos conexiones usan el mismo client ID, AWS desconecta la anterior.
Alternativas
- Un broker propio (Mosquitto, EMQX) en un servidor o un Raspberry Pi: más control y sin costo por mensaje, pero tú gestionas el servidor, la seguridad y la disponibilidad.
- Azure IoT Hub: el equivalente de Microsoft.
- Home Assistant con MQTT local: ideal si solo quieres domótica en tu casa, sin depender de la nube.
Google retiró su servicio equivalente, Cloud IoT Core, en 2023.
Preguntas frecuentes
¿Necesito AWS IoT Core para controlar un ESP32 por internet?
No es la única forma, pero sí una de las más seguras y sin mantenimiento: identidad por dispositivo, permisos finos y estado guardado sin servidores propios.
¿Qué pasa si el dispositivo pierde la conexión?
El Shadow conserva el estado deseado. Al reconectarse, el dispositivo pide el documento y se pone al día. Conviene que lo pida siempre al conectar, en lugar de depender de recibir un delta.
¿Puedo usar PubSubClient con AWS IoT Core?
Mucha gente lo hace. En mi caso, con un ESP32-S3, las publicaciones se perdían aunque la librería reportara éxito, y la librería MQTT de 256dpi lo resolvió.
¿Por qué AWS cierra la conexión de mi dispositivo?
Casi siempre es la política: el dispositivo se conecta con un client ID no permitido, o publica o se suscribe a un tópico que no tiene autorizado. Suscríbete a $aws/events/presence/# en el cliente de prueba de la consola para ver cuándo y por qué se desconecta (parte 5).
Todos los artículos sobre AWS IoT y serverless
- Conectar un ESP32 a AWS IoT Core paso a paso
- Device Shadow en AWS IoT: estado deseado y reportado con un ESP32
- DynamoDB para IoT: cómo modelar dispositivos y lecturas de sensores
- API serverless para controlar un ESP32 con AWS Lambda
- Reglas de AWS IoT: guardar datos y enviar alertas sin servidores
- Saber si un ESP32 está conectado: eventos de ciclo de vida en AWS IoT