Manual AWS IoT
Manual AWS IoT
Manual AWS IoT
Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's,
in any manner that is likely to cause confusion among customers, or in any manner that disparages or discredits
Amazon. All other trademarks not owned by Amazon are the property of their respective owners, who may or may not
be affiliated with, connected to, or sponsored by Amazon.
AWS IoT Guía del desarrollador
Table of Contents
¿Qué es AWS IoT? ............................................................................................................................ 1
Componentes de AWS IoT .......................................................................................................... 1
Primeros pasos con AWS IoT ...................................................................................................... 3
Acceso a AWS IoT ..................................................................................................................... 3
Servicios relacionados ................................................................................................................. 3
Funcionamiento de AWS IoT ........................................................................................................ 3
Introducción a AWS IoT Core ............................................................................................................... 5
Inicie sesión en la consola de AWS IoT. ........................................................................................ 5
Creación de un objeto ................................................................................................................. 6
Registro de un dispositivo ............................................................................................................ 6
Creación y activación de un certificado de dispositivo .............................................................. 6
Creación de una política de AWS IoT Core ............................................................................ 8
Asociación de una política de AWS IoT Core a un certificado de dispositivo ............................... 10
Asociación de un certificado a un objeto .............................................................................. 11
Configuración del dispositivo ...................................................................................................... 12
Visualización de los mensajes de MQTT de dispositivo con el cliente MQTT de AWS IoT ..................... 12
Configuración y comprobación de reglas ...................................................................................... 14
Creación de un tema de SNS ............................................................................................. 15
Suscripción a un tema de Amazon SNS ............................................................................... 17
Creación de una regla ....................................................................................................... 18
Comprobación de la regla de Amazon SNS .......................................................................... 25
Pasos siguientes ............................................................................................................... 25
Creación y seguimiento de un trabajo de AWS IoT Core ................................................................. 25
Conexión del dispositivo a AWS IoT .................................................................................... 25
Ejecución del trabajo de ejemplo ......................................................................................... 26
Creación de un documento de trabajo ................................................................................. 26
Creación de un trabajo ...................................................................................................... 26
Ejecución del trabajo en un dispositivo ................................................................................. 34
Seguimiento del progreso de un trabajo con eventos de trabajo y de ejecución de trabajos ............ 35
Tutoriales de reglas de AWS IoT ........................................................................................................ 39
Creación de una regla con una acción de DynamoDB .................................................................... 39
Prueba de una regla con una acción de DynamoDB .............................................................. 49
Creación de una regla con una acción de AWS Lambda ................................................................. 50
Crear una función de Lambda ............................................................................................ 51
Comprobación de la función de Lambda .............................................................................. 55
Creación de una regla con una acción de Lambda ................................................................. 57
Prueba de una regla con una acción de Lambda ................................................................... 67
Solución de problemas de una regla con una acción de Lambda .............................................. 68
Creación de una regla de Amazon SNS ....................................................................................... 69
Uso de los SDK de dispositivos de AWS IoT en Raspberry Pi ................................................................. 78
Requisitos previos ..................................................................................................................... 78
Creación de un objeto de AWS IoT para su Raspberry Pi ............................................................... 78
Uso del AWS IoT Device SDK para Embedded C .......................................................................... 79
Instalación del AWS IoT Device SDK para Embedded C. ........................................................ 79
Configuración de aplicación de muestra ............................................................................... 80
Ejecución de las aplicaciones de ejemplo ............................................................................. 81
Uso del SDK de dispositivos de AWS IoT para JavaScript y Node .................................................... 82
Instale la versión más reciente de Node.js. ........................................................................... 82
Instalación de AWS IoT Device SDK para JavaScript ............................................................. 82
Preparación antes de ejecutar las aplicaciones de ejemplo ...................................................... 82
Ejecución de las aplicaciones de ejemplo ............................................................................. 83
Otros tutoriales de AWS IoT ............................................................................................................... 85
Monitorización de la humedad del suelo con AWS IoT y Raspberry Pi ............................................... 85
Requisitos previos ............................................................................................................. 85
iii
AWS IoT Guía del desarrollador
iv
AWS IoT Guía del desarrollador
v
AWS IoT Guía del desarrollador
vi
AWS IoT Guía del desarrollador
vii
AWS IoT Guía del desarrollador
viii
AWS IoT Guía del desarrollador
ix
AWS IoT Guía del desarrollador
x
AWS IoT Guía del desarrollador
Componentes de AWS IoT
Integre Alexa Voice en cualquier dispositivo conectado. AVS para AWS IoT reduce el costo y la
complejidad de la integración de Alexa. Esta función utiliza AWS IoT para transferir las tareas de audio
que hacen un uso intensivo de procesos informáticos y de la memoria del dispositivo a la nube. Debido
a la reducción resultante en el costo de la factura de materiales de ingeniería (eBoM), los fabricantes
de dispositivos ahora pueden incorporar Alexa en dispositivos IoT con recursos limitados de manera
más económica y permitir a los consumidores hablar directamente con Alexa en su hogar, oficina o
habitación del hotel y disfrutar así de una experiencia de sonido ambiente.
AVS para AWS IoT permite la funcionalidad integrada de Alexa en MCU, como la clase ARM Cortex M
con menos de 1 MB de RAM integrada. Para ello, AVS transfiere las tareas de memoria y computación
a un dispositivo virtual de Alexa integrado en la nube. Esto reduce el costo de eBoM hasta en un
50 %. Para obtener más información, consulte Integración Alexa Voice Service (AVS) para AWS
IoT (p. 754).
Servicio de autenticación personalizado
Permite a los dispositivos comunicarse de forma segura y eficaz con AWS IoT.
Servicio de aprovisionamiento de dispositivos
Le permite aprovisionar dispositivos mediante una plantilla que describe los recursos necesarios para
el dispositivo: un objeto, un certificado y una o varias políticas. Un objeto es una entrada en el registro
que contiene atributos que describen un dispositivo. Los dispositivos usan certificados para realizar la
autenticación con AWS IoT. Las políticas determinan qué operaciones pueden realizar los dispositivos
en AWS IoT.
Las plantillas contienen variables que se sustituirán por los valores en un diccionario (mapa).
Puede usar la misma plantilla para aprovisionar varios dispositivos tan solo pasando diferentes
valores para las variables de la plantilla en el diccionario. Para obtener más información, consulte
Aprovisionamiento de dispositivos (p. 535).
1
AWS IoT Guía del desarrollador
Componentes de AWS IoT
Documento JSON utilizado para almacenar y recuperar información del estado actual de un
dispositivo.
Servicio Device Shadow
Los grupos permiten administrar varios dispositivos a la vez clasificándolos en grupos. Los grupos
también pueden contener otros grupos — puede crear una jerarquía de grupos. Cualquier acción que
realice en un grupo principal se aplicará a sus grupos secundarios, así como a todos los dispositivos
incluidos en el grupo principal y en sus grupos secundarios. Los permisos proporcionados a un grupo
se aplicarán a todos los dispositivos del grupo y a todos sus grupos secundarios. Para obtener más
información, consulte Administración de dispositivos con AWS IoT (p. 95).
Servicio de Jobs
Permite definir un conjunto de operaciones remotas que se envían a uno o más dispositivos
conectados a AWS IoT o que se ejecutan en uno o más de esos dispositivos. Por ejemplo, puede
definir un trabajo que indique a un conjunto de dispositivos descargar e instalar actualizaciones de
firmware y aplicaciones, reiniciar, rotar certificados o realizar operaciones remotas de solución de
problemas.
Para crear un trabajo, especifique una descripción de las operaciones remotas que se van a realizar y
una lista de destinos que deben realizarlas. Los destinos pueden ser dispositivos individuales, grupos
o ambos. Para obtener más información, consulte Trabajos (p. 413).
Agente de mensajes
Proporciona un mecanismo seguro para que los dispositivos y las aplicaciones de AWS IoT publiquen
y reciban mensajes entre sí. Puede utilizar el protocolo MQTT directamente o MQTT sobre WebSocket
para publicar y suscribirse. Puede utilizar la interfaz HTTP REST para publicar. Para obtener más
información, consulte Agente de mensajes de AWS IoT (p. 266).
Registry (Registro)
Organiza los recursos asociados a cada dispositivo en la nube de AWS. Es necesario registrar los
dispositivos y asociar hasta tres atributos personalizados a cada uno. También es posible asociar
certificados e ID de cliente MQTT a cada dispositivo para poder administrarlos y solucionar los
problemas que presenten con mayor facilidad. Para obtener más información, consulte Administración
de dispositivos con AWS IoT (p. 95).
Motor de reglas
2
AWS IoT Guía del desarrollador
Primeros pasos con AWS IoT
Para obtener información sobre los límites de AWS IoT, consulte Límites de AWS IoT.
• AWS Command Line Interface(AWS CLI)— Ejecuta comandos para AWS IoT en Windows, macOS
y Linux. Estos comandos le permiten crear y administrar objetos, certificados, reglas y políticas. Para
empezar, consulte AWS Command Line Interface Guía del usuario. Para obtener más información
acerca de los comandos de AWS IoT, consulte iot en la AWS CLI Command Reference.
• AWS IoTAPI— Cree sus aplicaciones IoT mediante solicitudes HTTP o HTTPS. Estas acciones de la
API le permiten crear y administrar objetos, certificados, reglas y políticas mediante programación. Para
obtener más información acerca de las acciones de la API para AWS IoT, consulte las acciones en las
referencias de API de AWS IoT.
• SDK de AWS— Cree sus aplicaciones IoT mediante API específicas de un lenguaje. Estos SDK integran
las API de HTTP/HTTPS y le permiten programar en cualquiera de los lenguajes admitidos. Para obtener
más información, consulte AWSSDK y herramientas de .
• SDK de dispositivos de AWS IoT— Cree aplicaciones que se ejecutan en sus dispositivos para enviar y
recibir mensajes de AWS IoT. Para obtener más información, consulte SDK de AWS IoT.
Servicios relacionados
AWS IoT se integra directamente con los siguientes servicios de AWS:
3
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT
aplicaciones de IoT habituales recopilan y procesan telemetría de dispositivos, o bien permiten que los
usuarios controlen un dispositivo de forma remota.
El estado de cada dispositivo conectado a AWS IoT se almacena en una sombra de dispositivo. El
servicio Device Shadow administra las sombras de los dispositivos mediante la respuesta a las solicitudes
para recuperar o actualizar los datos de estado del dispositivo. El servicio Device Shadow permite que
los dispositivos se comuniquen con las aplicaciones y que las aplicaciones se comuniquen con los
dispositivos.
La comunicación entre su dispositivo y AWS IoT se protege mediante certificados X.509. AWS IoT puede
generar un certificado, o bien usted puede utilizar su propio certificado. En ambos casos, el certificado
debe registrarse y activarse en AWS IoT y, a continuación, copiarse en el dispositivo. Cuando el dispositivo
se comunica con AWS IoT, presenta el certificado a AWS IoT como credencial.
Recomendamos que todos los dispositivos que se conecten con AWS IoT tengan una entrada en el
registro. El registro almacena información sobre un dispositivo y los certificados que este utiliza para
proteger las comunicaciones con AWS IoT.
Puede crear reglas que definan una o varias acciones que deban ejecutarse en función de los datos de
un mensaje. Por ejemplo, puede insertar, actualizar o consultar una tabla de DynamoDB o invocar una
función Lambda. Las reglas usan expresiones para filtrar los mensajes. Cuando una regla coincide con
un mensaje, el motor de reglas desencadena la acción mediante las propiedades seleccionadas. Las
reglas también contienen una función de IAM que concede permiso a AWS IoT sobre los recursos de AWS
utilizados para desempeñar la acción.
4
AWS IoT Guía del desarrollador
Inicie sesión en la consola de AWS IoT.
Para obtener más información acerca de AWS IoT Core, consulte ¿Qué es AWS IoT Core? (p. 1).
Temas
• Inicie sesión en la consola de AWS IoT. (p. 5)
• Creación de un objeto (p. 6)
• Registro de un dispositivo (p. 6)
• Configuración del dispositivo (p. 12)
• Visualización de los mensajes de MQTT de dispositivo con el cliente MQTT de AWS IoT (p. 12)
• Configuración y comprobación de reglas (p. 14)
• Creación y seguimiento de un trabajo de AWS IoT Core (p. 25)
5
AWS IoT Guía del desarrollador
Creación de un objeto
Si es la primera vez que utiliza la consola de AWS IoT, verá la página Welcome to the AWS IoT
Console (Le damos la bienvenida a la consola de ).
Creación de un objeto
Los dispositivos conectados a AWS IoT están representados por objetos en el registro de AWS IoT. Un
objeto representa un dispositivo específico o una entidad lógica. Puede ser un dispositivo físico o un
sensor (por ejemplo, una bombilla o un interruptor en la pared). También puede ser una entidad lógica,
como una instancia de una aplicación o una entidad física que no se conecta con AWS IoT, pero que está
relacionada con otros dispositivos que sí lo están (por ejemplo, un automóvil con sensores de motor o un
panel de control).
Crear un objeto
Registro de un dispositivo
El registro le permite mantener un registro de todos los dispositivos que están registrados a su cuenta de
AWS IoT Core. El proceso de registro del dispositivo incluye estos pasos:
Temas
• Creación y activación de un certificado de dispositivo (p. 6)
• Creación de una política de AWS IoT Core (p. 8)
• Asociación de una política de AWS IoT Core a un certificado de dispositivo (p. 10)
• Asociación de un certificado a un objeto (p. 11)
6
AWS IoT Guía del desarrollador
Creación y activación de un certificado de dispositivo
2. En la página Certificate created (Certificado creado), elija los enlaces Download (Descargar) para
descargar el certificado, la clave privada y la CA raíz para AWS IoT Core. (No es necesario descargar
la clave pública). Guárdelos en su equipo y, a continuación, elija Activate para continuar.
Note
7
AWS IoT Guía del desarrollador
Creación de una política de AWS IoT Core
Tenga en cuenta que los nombres de los archivos descargados pueden ser distintos de los que figuran
en la página El certificado se ha creado. Por ejemplo:
• 2a540e2346-certificate.pem.crt
• 2a540e2346-private.pem.key
• 2a540e2346-public.pem.key
Note
Aunque sea poco probable, los certificados de CA raíz están sujetos a vencimiento y
revocación. Si esto ocurriese, deberá copiar un nuevo certificado de CA raíz en su dispositivo.
3. Seleccione Listo para volver a la página principal de la consola de AWS IoT.
Al trabajar con un dispositivo tendrá que copiar la clave privada y certificado de CA raíz en su dispositivo.
Las instrucciones de esta guía se han escrito partiendo del supuesto de que no está utilizando un
dispositivo y simplemente se está familiarizando con la consola de AWS IoT.
8
AWS IoT Guía del desarrollador
Creación de una política de AWS IoT Core
2. En la página Crear una política, en el campo Nombre, escriba un nombre para la política (por ejemplo,
MyIotPolicy). No utilice información personalmente identificable en sus nombres de política.
9
AWS IoT Guía del desarrollador
Asociación de una política de AWS IoT
Core a un certificado de dispositivo
3. En el cuadro de diálogo Asociar políticas a los certificados, marque la casilla de verificación junto a la
política que ha creado en el paso anterior y, a continuación, seleccione Adjunte.
10
AWS IoT Guía del desarrollador
Asociación de un certificado a un objeto
1. En la casilla del certificado que ha creado, elija ... para abrir un menú desplegable y, a continuación,
elija Attach thing (Asociar objeto).
2. En el cuadro de diálogo Asociar objetos a los certificados, marque la casilla situada junto al objeto que
ha registrado y, a continuación, elija Adjunte.
3. Para verificar que el objeto esté asociado, seleccione la casilla del certificado.
11
AWS IoT Guía del desarrollador
Configuración del dispositivo
4. En el panel de navegación izquierdo de la página Details (Detalles) del certificado, elija Things
(Objetos).
5. Para verificar que la política se haya asociado, en el panel de navegación izquierdo de la página
Details del certificado, elija Policies.
Si no dispone de un dispositivo listo para IoT, puede utilizar el cliente MQTT, los SDK de dispositivos
de AWS IoT o la CLI de AWS. Para obtener más información, consulte la sección Uso de los SDK de
dispositivos de AWS IoT en Raspberry Pi (p. 78). Los tutoriales utilizan un Raspberry Pi, pero pueden
adaptarse de manera sencilla para su uso con otros tipos de equipos.
Los dispositivos publican los mensajes MQTT en temas. Puede utilizar el cliente MQTT de AWS IoT para
suscribirse a estos temas para ver los mensajes.
12
AWS IoT Guía del desarrollador
Visualización de los mensajes de MQTT de
dispositivo con el cliente MQTT de AWS IoT
2. Suscríbase al tema en el que publica su objeto de IoT. Continuando con este ejemplo, en Suscribirse
a un tema, en el campo Tema de suscripción escriba my/topic y, a continuación, elija Suscribirse al
tema.
13
AWS IoT Guía del desarrollador
Configuración y comprobación de reglas
{
"message": "Hello, world",
"clientType": "MQTT client"
}
Elija Publish to topic. Debería ver el mensaje en el cliente MQTT de AWS IoT. (Elija my/topic en la
columna Suscripciones par ver el mensaje).
14
AWS IoT Guía del desarrollador
Creación de un tema de SNS
escribe datos en un bucket de Amazon S3, invoca una función de Lambda o envía un mensaje a un tema
de Amazon SNS). En este paso, crea y configura una regla para enviar los datos recibidos desde un
dispositivo a un tema de Amazon SNS. En concreto, puede:
4. Escriba un nombre de tema y otro de visualización y, a continuación, seleccione Create topic (Crear
tema). No utilice información personalmente identificable en sus nombres de temas de Amazon SNS.
15
AWS IoT Guía del desarrollador
Creación de un tema de SNS
16
AWS IoT Guía del desarrollador
Suscripción a un tema de Amazon SNS
En el campo Punto de conexión, escriba el número de un teléfono móvil habilitado para SMS y, a
continuación, elija Create subscription (Crear suscripción).
Note
17
AWS IoT Guía del desarrollador
Creación de una regla
La consola de Amazon SNS muestra el siguiente mensaje, pero es posible que no reciba un mensaje SMS
de confirmación.
18
AWS IoT Guía del desarrollador
Creación de una regla
o varias políticas de IAM que determinan a qué servicios de AWS puede tener acceso la regla. Puede crear
varias reglas que escuchan un único tema. Del mismo modo, puede crear una única regla que se activa
con varios temas. El motor de reglas de AWS IoT Core procesa constantemente los mensajes publicados
en temas que coinciden con los filtros de temas definidos en las reglas.
En este ejemplo, se crea una regla que utiliza Amazon SNS para enviar una notificación por SMS a un
teléfono móvil.
3. En la página Crear una regla, en el campo Nombre, escriba un nombra para la regla.
Note
19
AWS IoT Guía del desarrollador
Creación de una regla
4. Desplácese hacia abajo hasta Rule query statement (Instrucción de consulta de regla). Seleccione la
última versión en la lista desplegable de Using SQL version. En el campo Instrucción de consulta de
regla, introduzca SELECT * FROM 'my/topic'.
SELECT * especifica que desea enviar todo el mensaje MQTT que ha activado la regla. FROM 'my/
topic' es el filtro de temas. El motor de reglas utiliza el filtro de temas para determinar qué reglas
deben activarse cuando se recibe un mensaje MQTT.
6. En la página Seleccionar una acción, elija Enviar un mensaje como una notificación push SNS y, a
continuación, elija Configurar acción.
20
AWS IoT Guía del desarrollador
Creación de una regla
21
AWS IoT Guía del desarrollador
Creación de una regla
7. En la página Configurar acción, en Destino de SNS, elija Seleccionar para ampliar el tema de SNS. A
continuación, elija Seleccionar junto al tema de Amazon SNS que creó anteriormente. En Formato de
mensaje, elija JSON.
8. Ahora dé permiso a AWS IoT Core para publicar en el tema de Amazon SNS en su nombre cuando se
active la regla. Elija Create a new role. En Nombre de rol de IAM, escriba un nombre para el nuevo rol
y, a continuación, elija Crear un nuevo rol.
9. En Nombre de rol de IAM, elija Actualizar rol para aplicar los permisos al rol recién creado. Elija el rol
y, a continuación, elija Añadir acción.
22
AWS IoT Guía del desarrollador
Creación de una regla
23
AWS IoT Guía del desarrollador
Creación de una regla
24
AWS IoT Guía del desarrollador
Comprobación de la regla de Amazon SNS
Para obtener más información sobre la creación de reglas, consulte Reglas para AWS IoT (p. 285).
{
"default": "Hello, from AWS IoT console",
"message": "Hello, from AWS IoT console"
}
3. Elija Publish to topic. Debería recibir un mensaje de Amazon SNS en su teléfono móvil.
¡Enhorabuena! Ha creado y configurado correctamente una regla que envía los datos recibidos de un
dispositivo a un tema de Amazon SNS.
Pasos siguientes
Para obtener más información sobre las reglas de AWS IoT Core, consulte Tutoriales de reglas de AWS
IoT Core (p. 39) y Reglas de AWS IoT Core (p. 285).
1. Siga las instrucciones de Conexión de Raspberry Pi. Cuando haya terminado, tendrá un objeto de
AWS IoT Core registrado en la cuenta de AWS. También tendrá certificados de seguridad totalmente
configurados en su dispositivo.
25
AWS IoT Guía del desarrollador
Ejecución del trabajo de ejemplo
2. Complete los pasos del tutorial Uso de AWS IoT Device SDK para JavaScript. Cuando haya
terminado, el dispositivo estará conectado a AWS IoT Core, y podrá ejecutar el código de muestra que
viene con el AWS IoT Device SDK para JavaScript.
Ahora, su dispositivo estará listo para utilizar trabajos de AWS IoT Core.
Puede ejecutar este ejemplo utilizando el siguiente comando. Utilice el punto de enlace REST de su
Raspberry Pi como valor del parámetro -H.
Si ha creado un archivo de configuración que contiene el nombre del objeto y el punto de enlace del host
(el punto de enlace REST de su dispositivo), puede usar el siguiente comando.
{
"operation":"customJob",
"otherInfo":"someValue"
}
Para ver más documentos de trabajo de ejemplo, consulte la documentación de la muestra jobs-agent.js.
Creación de un trabajo
Ahora estará listo para crear un trabajo que entregue el documento de trabajo a todos los dispositivos que
especifique. Puede usar la consola de AWS IoT, el SDK de AWS IoT o la CLI de AWS IoT para crear un
trabajo.
El siguiente ejemplo muestra cómo utilizar laCLI de AWS IoT para crear un trabajo.
26
AWS IoT Guía del desarrollador
Creación de un trabajo
Si prefiere utilizar la consola de AWS IoT, siga estos pasos para crear un trabajo.
1. Cargue el documento de trabajo en un bucket de S3. Para obtener información, consulte ¿Cómo
puedo cargar archivos y carpetas en un bucket de S3? en la Guía del usuario de la consola de
Amazon Simple Storage Service.
2. En la consola de AWS IoT, seleccione Manage (Administrar) y después Jobs (Trabajos).
3. Elija Create a job (Crear un trabajo).
27
AWS IoT Guía del desarrollador
Creación de un trabajo
4. En la página Select a job (Seleccionar un trabajo), elija Create custom job (Crear trabajo
personalizado).
28
AWS IoT Guía del desarrollador
Creación de un trabajo
29
AWS IoT Guía del desarrollador
Creación de un trabajo
En Select devices to update (Seleccionar dispositivos que actualizar), seleccione el dispositivo que
haya conectado a AWS IoT.
30
AWS IoT Guía del desarrollador
Creación de un trabajo
31
AWS IoT Guía del desarrollador
Creación de un trabajo
6. Desplácese hasta Add a job file (Añadir un archivo de trabajo) y seleccione el archivo del documento
de trabajo que haya actualizado a Amazon S3. En Job type (Tipo de trabajo), seleccione Your job will
complete after deploying to the selected devices/groups (snapshot) (El trabajo se realizará después
de implementarse en los dispositivos o grupos seleccionados (instantánea)). (La otra opción, Your
job will continue deploying to any devices added to the selected groups (continuous) (El trabajo se
seguirá implementando en los dispositivos añadidos a los grupos seleccionados (continuo)), sirve para
implementar un trabajo en grupos de dispositivos, ya que los dispositivos se añaden a cada grupo).
Deje Job executions rollout configuration (Configuración de despliegue de ejecuciones de trabajo) sin
cambiar. Seleccione Create.
32
AWS IoT Guía del desarrollador
Creación de un trabajo
33
AWS IoT Guía del desarrollador
Ejecución del trabajo en un dispositivo
Para obtener más información sobre cómo crear e implementar trabajos, consulte Trabajos (p. 413).
Al actualizar la página Jobs (Trabajos), podrá ver que su trabajo se ha completado correctamente.
34
AWS IoT Guía del desarrollador
Seguimiento del progreso de un trabajo con
eventos de trabajo y de ejecución de trabajos
Es una forma útil de alertar a los usuarios, los administradores de sistemas u otros miembros de su
sistema de que un trabajo se ha completado o de que la ejecución de un trabajo ha cambiado de estado.
Por ejemplo, puede alertar a un usuario de la actualización del firmware de un dispositivo o informar a un
administrador del sistema de que existe un problema en su flota de dispositivos que se debe investigar y
resolver.
Los eventos de trabajos para el trabajo de este ejemplo se publican en los siguientes temas cuando se ha
completado o cancelado el trabajo.
$aws/events/job/example-job-01/completed
$aws/events/job/example-job-01/canceled
Los eventos de ejecución de trabajos para el trabajo de este ejemplo se envían a los siguientes temas
cuando la ejecución del trabajo alcanza uno de los estados finales posibles.
$aws/events/jobExecution/example-job-01/succeeded
$aws/events/jobExecution/example-job-01/failed
$aws/events/jobExecution/example-job-01/rejected
$aws/events/jobExecution/example-job-01/canceled
$aws/events/jobExecution/example-job-01/removed
35
AWS IoT Guía del desarrollador
Seguimiento del progreso de un trabajo con
eventos de trabajo y de ejecución de trabajos
Cuando la ejecución del trabajo se completa en su dispositivo, AWS IoT Core publica un evento
JobExecution con el estado succeeded. Puede ver este evento en la consola navegando a la página Test
(Probar) de y suscribiéndose al tema $aws/events/jobExecution/example-job-01/succeeded del
cliente MQTT.
Aparecerá el siguiente mensaje cuando la ejecución del trabajo para su dispositivo se haya completado
correctamente.
36
AWS IoT Guía del desarrollador
Seguimiento del progreso de un trabajo con
eventos de trabajo y de ejecución de trabajos
AWS IoT Core también publica un evento job completado. Puede ver este evento suscribiéndose al tema
$aws/events/job/example-job-01/completed en el cliente MQTT.
37
AWS IoT Guía del desarrollador
Seguimiento del progreso de un trabajo con
eventos de trabajo y de ejecución de trabajos
38
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
El escenario de este tutorial es un invernadero con filas de las plantas. Cada planta tiene un sensor de
humedad. En un intervalo predeterminado, el sensor de humedad envía sus datos a AWS IoT. El motor
de reglas de AWS IoT recibe estos datos y los escribe en una tabla de DynamoDB. Puede crear una regla
para escribir datos en DynamoDB y emular los sensores que utilizan el cliente de MQTT de AWS IoT.
Una regla de AWS IoT consta de una instrucción SQL SELECT, un filtro de temas y una acción de
regla. Los dispositivos envían información a AWS IoT publicando mensajes en los temas de MQTT. La
instrucción SQL SELECT le permite extraer datos de un mensaje MQTT de entrada. El filtro de temas de
una regla de AWS IoT especifica uno o varios temas de MQTT. La regla se activa cuando se recibe en
un tema un mensaje MQTT que coincide con el filtro de temas. Las acciones de regla le permiten tomar
la información extraída de un mensaje MQTT y enviarla a otro servicio de AWS. Las acciones de regla se
definen para servicios de AWS como Amazon DynamoDB, AWS Lambda, Amazon SNS y Amazon S3.
Con una regla Lambda puede llamar a otros servicios web de AWS o de terceros. Para obtener una lista
completa de las acciones de las reglas, consulte Acciones de las reglas de AWS IoT (p. 292).
En estos tutoriales se presupone está utilizando el cliente de MQTT de AWS IoT y que está utilizando my/
greenhouse como filtro de temas en las reglas.
También puede utilizar su propio dispositivo, pero deberá saber en qué tema de MQTT publica su
dispositivo para especificarlo como filtro de temas en la regla. Para obtener más información, consulte
Reglas de AWS IoT (p. 285).
39
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
3. En la página Crear una regla, introduzca un nombre y una descripción para la regla.
Note
4. En Instrucción de consulta de regla, elija la versión más reciente desde la lista Uso de la versión de
SQL. Para Rule query statement (Instrucción de consulta de regla), escriba:
("SELECT *" especifica que desea enviar todo el mensaje MQTT que ha desencadenado la regla.
"FROM 'my/greenhouse'" indica el motor de reglas para desencadenar esta regla cuando se
recibe un mensaje MQTT cuyo tema coincide con este filtro de temas). Elija Añadir acción.
40
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
5. En Select an action (Seleccionar una acción), elija Insert a message into a DynamoDB table (Insertar
un mensaje en una tabla de DynamoDB) y, a continuación, elija Configure action (Configurar acción).
41
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
6. En Configure action (Configurar acción), elija Create a new resource (Crear un nuevo recurso).
42
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
43
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
8. En Create DynamoDB table (Crear tabla DynamoDB), escriba un nombre. En Partition key (Clave
de partición), escriba Row. Seleccione Add sort key (Añadir clave de ordenación) y, a continuación,
introduzca PositionInRow en el campo Sort key (Clave de ordenación). Row representa una fila
de plantas en un invernadero. PositionInRow representa la posición de una planta en la fila. Elija
String (Cadena) para las claves de partición y de ordenación y, a continuación, seleccione Create
(Crear). La tabla de DynamoDB tarda unos segundos en crearse. Cierre la pestaña del navegador
donde la consola de Amazon DynamoDB está abierta. Si no cierra la pestaña, su tabla de DynamoDB
no se muestra en la lista desplegable de Table name (Nombre de tabla) en la página Configure action
(Configurar acción) de la consola de AWS IoT.
44
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
9. En Configure action (Configurar acción), elija la nueva tabla de la lista Table name (Nombre de la
tabla). En Partition key value (Valor de clave de partición), escriba ${row}. Esto indica a la regla que
debe tomar el valor del atributo row en el mensaje MQTT y escribirlo en la columna Row (Fila) de la
tabla de DynamoDB. En Sort key value (Valor de clave de ordenación), escriba ${pos}. Esto escribe
el valor del atributo pos en la columna PositionInRow. En Write message data to this column (Escribir
datos del mensaje en esta columna) introduzca Payload. Esto inserta la carga útil del mensaje en
la columna Payload. Deje Operation (Operación) en blanco. Este campo le permite especificar qué
operación (INSERT, UPDATE o DELETE) desea realizar cuando se activa la acción. Elija Crear un
nuevo rol.
10. En Create a new role (Crear un nuevo rol), introduzca un nombre único en Create role (Crear rol).
45
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
46
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
47
AWS IoT Guía del desarrollador
Creación de una regla con una acción de DynamoDB
48
AWS IoT Guía del desarrollador
Prueba de una regla con una acción de DynamoDB
{
"row" : "0",
"pos" : "0",
"moisture" : "75"
}
49
AWS IoT Guía del desarrollador
Creación de una regla con una acción de AWS Lambda
En este tutorial, se utiliza el cliente de MQTT de AWS IoT para enviar un mensaje que desencadena la
regla.
50
AWS IoT Guía del desarrollador
Crear una función de Lambda
2. En la página Create function (Crear función), elija Use a blueprint (Utilizar un proyecto). En el campo
de filtro Blueprints (Proyectos), introduzca hello-world y, a continuación, pulse Intro. Elija el
proyecto hello-world-python y, a continuación, elija Configure (Configurar).
51
AWS IoT Guía del desarrollador
Crear una función de Lambda
4. En Execution Role (Rol de ejecución), elija Create a new role from AWS policy templates (Crear un
rol a partir de las plantillas de políticas de AWS). Escriba un nombre para el rol. En Policy templates
(Plantillas de políticas), elija Amazon SNS publish policy (Política de publicación de Amazon SNS).
Haga clic en fuera del menú desplegable para cerrarlo.
52
AWS IoT Guía del desarrollador
Crear una función de Lambda
53
AWS IoT Guía del desarrollador
Crear una función de Lambda
import json
import boto3
print('Loading function')
# Print the parsed JSON message to the console. You can view this text in the
Monitoring tab in the AWS Lambda console or in the Amazon CloudWatch Logs console.
print('Received event: ', eventText)
print(response)
7. Sustituya el valor de TopicArn por el ARN del tema de Amazon SNS que ha creado en Configuración
y pruebas de reglas.
8. Seleccione Save.
54
AWS IoT Guía del desarrollador
Comprobación de la función de Lambda
2. En Configure test event (Configurar evento de prueba), escriba un nombre para el evento de prueba y
sustituya el mensaje JSON por lo siguiente:
{
"message" : "Hello, world"
}
55
AWS IoT Guía del desarrollador
Comprobación de la función de Lambda
3. En la parte superior derecha de la página de detalles de la función de Lambda, elija Test (Probar) para
probar la función de Lambda con el mensaje que ha especificado en el evento de prueba.
56
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
57
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
58
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
6. En Seleccionar una acción, elija Enviar un mensaje a una función de Lambda y, a continuación, elija
Configurar acción.
59
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
60
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
61
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
10. En la página Crear una regla, en Acción de error, elija Añadir acción.
11. En Definir una acción como una acción de error, seleccione Volver a publicar un mensaje a un tema
de AWS IoT y, a continuación, elija Configurar acción.
62
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
63
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
13. En Elija o cree un rol para conceder acceso a AWS IoT al recurso para que realice esta acción, elija
Crear rol.
14. En Crear un nuevo rol, escriba un nombre para el rol y, a continuación, elija Crear rol.
64
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
65
AWS IoT Guía del desarrollador
Creación de una regla con una acción de Lambda
66
AWS IoT Guía del desarrollador
Prueba de una regla con una acción de Lambda
67
AWS IoT Guía del desarrollador
Solución de problemas de una
regla con una acción de Lambda
La publicación de este mensaje debería activar la regla y llamar a la función de Lambda. La función
de Lambda envía un mensaje de Amazon SNS a un número de teléfono que está suscrito al tema de
Amazon SNS. Si no recibe un mensaje de texto, en el cliente MQTT, compruebe si todos los mensajes se
publicaron lambda/error.
68
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
69
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
En este tutorial, crea una regla que envía el nombre del objeto de AWS IoT que desencadenó la regla a
todos los suscriptores de un tema de Amazon SNS.
70
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
(El filtro de temas que aparece después de "FROM" especifica los temas que dispararán la acción de
la regla cuando se publique un mensaje en ellos. El signo más (+) utilizado en el filtro de temas es un
carácter comodín que coincide con cualquier nombre de objeto. El atributo "topic(3)" después de
"SELECT" añade el nombre del objeto, que es el tercer campo de tema, al contenido del mensaje).
6. En Seleccionar una acción, elija Enviar un mensaje como una notificación push SNS y, a continuación,
elija Configurar acción.
71
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
72
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
9. En la página Configurar acción, para Destino de SNS, elija el tema de SNS que acaba de crear. En
Formato del mensaje, elija RAW. En Elija o cree un rol para conceder acceso a AWS IoT para que
realice esta acción, elija Crear rol.
73
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
74
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
75
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
76
AWS IoT Guía del desarrollador
Creación de una regla de Amazon SNS
Para probarla, añada una suscripción al tema de SNS que ha creado y actualice la sombra de cualquier
objeto de AWS IoT.
Puede utilizar la consola de AWS IoT para buscar un objeto, abrir su página de detalles y cambiar
la sombra del dispositivo. Cuando se notifique el cambio al servicio Device Shadow, este publica un
mensaje en $aws/things/MySNSThing/shadow/update/accepted. Se activará la regla y todos los
suscriptores del tema de SNS recibirán un mensaje con el nombre del objeto.
77
AWS IoT Guía del desarrollador
Requisitos previos
Antes de iniciar este tutorial, complete los pasos de Introducción a AWS IoT Core (p. 5).
Estos tutoriales proporcionan instrucciones paso a paso para conectar Raspberry Pi a la Agente de
mensajes de AWS IoT (p. 266), usando AWS IoT Device SDK para Embedded C y AWS IoT Device SDK
para JavaScript. Después de completar los pasos de estos tutoriales, puede conectarse a la plataforma
de AWS IoT y ejecutar las aplicaciones de ejemplo incluidas con los SDK de AWS IoT para dispositivos y
móviles.
Contenido
• Requisitos previos (p. 78)
• Creación de un objeto de AWS IoT para su Raspberry Pi (p. 78)
• Uso del AWS IoT Device SDK para Embedded C (p. 79)
• Uso del SDK de dispositivos de AWS IoT para JavaScript y Node (p. 82)
Requisitos previos
Necesitará lo siguiente para completar este tutorial:
78
AWS IoT Guía del desarrollador
Uso del AWS IoT Device SDK para Embedded C
79
AWS IoT Guía del desarrollador
Configuración de aplicación de muestra
Example
1. Descargue el AWS IoT Device SDK para Embedded C en Raspberry Pi desde GitHub.
mv ~/Downloads/mbedtls-versionNumber/* ~/aws-iot-device-sdk-embedded-c/external_libs/
mbedTLS
Si tiene instalada la AWS CLI, puede utilizar el comando aws iot describe-endpoint --endpoint-type
iot:Data-ATS para buscar la URL del punto de enlace personal. Si no tiene instalada la AWS CLI,
abra la consola de AWS IoT Core. Desde el panel de navegación, elija Manage (Administrar) y, a
continuación, Things (Cosas). Elija la cosa IoT para su Raspberry Pi y, a continuación, elija Interact
(Interactuar). Su punto de enlace se muestra en la sección HTTPS de la página de detalles de la
cosa.
3. Abra el archivo aws_iot_config.h y, en la sección Get from console, actualice los valores de
los elementos siguientes:
AWS_IOT_MQTT_HOST
AWS_IOT_ROOT_CA_FILENAME
El certificado de CA raíz.
AWS_IOT_CERTIFICATE_FILENAME
Su certificado.
AWS_IOT_PRIVATE_KEY_FILENAME
La clave privada.
Por ejemplo:
make -f Makefile
Su Raspberry Pi ya está conectado a AWS IoT mediante AWS IoT Device SDK para Embedded C.
81
AWS IoT Guía del desarrollador
Uso del SDK de dispositivos de
AWS IoT para JavaScript y Node
1. Para descargar la última versión del repositorio de nodos, abra una ventana de terminal y ejecute el
siguiente comando:
node -v
npm -v
1. En la ventana del terminal, utilice el siguiente comando para clonar el repositorio del SDK de
dispositivos de AWS IoT para JavaScript en su directorio principal (de forma predeterminada, /home/
pi).
npm install
Para ejecutar las aplicaciones de ejemplo del AWS IoT Device SDK para JavaScript, necesita la siguiente
información:
82
AWS IoT Guía del desarrollador
Ejecución de las aplicaciones de ejemplo
La región de AWS
Para encontrar la región que está utilizando, abra la consola de AWS IoT y compruebe la URL. La
región aparece inmediatamente después de https://. Por ejemplo:
https://us-west-2.console.aws.amazon.com/iot/home?region=us-west-2#/
dashboard
Para obtener más información, consulte Puntos de enlace del servicio de AWS IoT.
Un ID de cliente
Una cadena alfanumérica arbitraria que se utiliza para identificar un dispositivo o una aplicación que
se conecta a AWS IoT. Este debería ser el mismo que su nombre de cosa de IoT para este tutorial.
La clave privada
Si ha instalado la AWS CLI en su Raspberry Pi, puede ejecutar el comando describe-endpoint de CLI
para buscar su punto de enlace:
Si no tiene la AWS CLI instalada, abra la consola de AWS IoT. Desde el panel de navegación, elija
Manage (Administrar) y, a continuación, Things (Cosas). Elija la cosa IoT para su Raspberry Pi y, a
continuación, elija Interact (Interactuar). Su punto de enlace se muestra en la sección HTTPS de la
página de detalles de la cosa.
El puerto en el que escucha el agente de mensajes de AWS IoT
Siempre es el 8883.
El nombre del objeto de IoT
83
AWS IoT Guía del desarrollador
Ejecución de las aplicaciones de ejemplo
Asegúrese de que utiliza distintos ID de cliente al ejecutar las dos instancias de device-
example.js. No es posible conectar dos clientes (dispositivos o aplicaciones) a AWS IoT
utilizando el mismo ID de cliente. Se termina la conexión del primer cliente y se establece la
conexión del segundo cliente.
El nombre del objeto únicamente es importante cuando se crea una política específica de un
objeto de IoT. En el tutorial de introducción a AWS IoT, no se crea una política de este tipo, por lo
que puede utilizar el mismo nombre de objeto para las dos instancias.
Su Raspberry Pi ya está conectado a AWS IoT mediante AWS IoT SDK for JavaScript.
Si las dos instancias se ejecuten correctamente, la salida de la instancia que se ejecuta en el modo 1 debe
tener el siguiente aspecto:
84
AWS IoT Guía del desarrollador
Monitorización de la humedad del
suelo con AWS IoT y Raspberry Pi
Cada tutorial incluye una lista de requisitos previos, incluido hardware específico. Siempre que sea posible,
los tutoriales proporcionan alternativas si no tiene todo el hardware necesario.
Contenido
• Requisitos previos (p. 85)
• Configuración de AWS IoT (p. 85)
• Cree la política de AWS IoT. (p. 86)
• Creación de la clave privada, certificado y objeto de AWS IoT (p. 87)
• Cree un tema de Amazon SNS y una suscripción. (p. 88)
• Creación de una regla de AWS IoT para enviar un correo electrónico (p. 88)
• Configuración del dispositivo Raspberry Pi y el sensor de humedad (p. 89)
Requisitos previos
Para completar este tutorial, se necesita lo siguiente:
85
AWS IoT Guía del desarrollador
Configuración de AWS IoT
Un objeto representa un dispositivo físico (en este caso, su Rasberry Pi) e incluye metadatos estáticos
sobre el dispositivo.
• Un certificado de dispositivo.
Todos los dispositivos deben tener un certificado de dispositivo para conectarse a AWS IoT y
autenticarse con el mismo.
• Una política de AWS IoT.
Cada certificado de dispositivo tiene una o varias políticas de AWS IoT asociadas a él. Estas políticas
determinan a qué recursos de AWS IoT puede obtener acceso el dispositivo.
• Un certificado de CA raíz de AWS IoT.
Los dispositivos y otros clientes utilizan un certificado de CA raíz de AWS IoT para autenticar el servidor
de AWS IoT con el que se están comunicando. Para obtener más información, consulte Autenticación
del servidor (p. 124).
• Una regla de AWS IoT.
Una regla incluye una consulta y una o varias acciones de regla. La consulta extrae datos de los
mensajes del dispositivo para determinar si los datos de los mensajes deben procesarse. La acción de
regla especifica qué hacer si los datos coinciden con la consulta.
• Un tema de Amazon SNS y una suscripción a un tema.
La regla escucha los datos de humedad del dispositivo Raspberry Pi. Si el valor está por debajo de
un umbral, envía un mensaje al tema de Amazon SNS. Amazon SNS envía dicho mensaje a todas las
direcciones de correo electrónico suscritas al tema.
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, expanda Secure (Seguridad) y, a continuación, elija Policies (Políticas).
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.
3. Escriba un nombre para la política de AWS IoT (por ejemplo, MoistureSensorPolicy).
4. En la sección Add statements (Añadir instrucciones), sustituya la política existente por el siguiente
JSON. Sustituya <region> y <account> por su región de AWS y número de cuenta de AWS.
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:<region>:<account>:client/RaspberryPi"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": [
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/
update",
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/
delete",
86
AWS IoT Guía del desarrollador
Configuración de AWS IoT
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/get"
]
},
{
"Effect": "Allow",
"Action": "iot:Receive",
"Resource": [
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/
update/accepted",
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/
delete/accepted",
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/get/
accepted",
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/
update/rejected",
"arn:aws:iot:<region>:<account>:topic/$aws/things/RaspberryPi/shadow/
delete/rejected"
]
},
{
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": [
"arn:aws:iot:<region>:<account>:topicfilter/$aws/things/RaspberryPi/shadow/
update/accepted",
"arn:aws:iot:<region>:<account>:topicfilter/$aws/things/RaspberryPi/shadow/
delete/accepted",
"arn:aws:iot:<region>:<account>:topicfilter/$aws/things/RaspberryPi/shadow/
get/accepted",
"arn:aws:iot:<region>:<account>:topicfilter/$aws/things/RaspberryPi/shadow/
update/rejected",
"arn:aws:iot:<region>:<account>:topicfilter/$aws/things/RaspberryPi/shadow/
delete/rejected"
]
},
{
"Effect": "Allow",
"Action": [
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DeleteThingShadow"
],
"Resource": "arn:aws:iot:<region>:<account>:thing/RaspberryPi"
}
]
}
87
AWS IoT Guía del desarrollador
Configuración de AWS IoT
de un objeto, debe crear otro objeto nueva, asignarle el nuevo nombre y eliminar después el objeto
anterior.
5. En la página Añadir un certificado para el objeto, elija Crear certificado.
6. Elija los enlaces Download (Descargar) para descargar el certificado, la clave privada y el certificado
de CA raíz.
Important
Esta es la única vez que puede descargar el certificado y la clave privada.
7. Elija Activate.
8. Elija Asociar una política.
9. En Add a policy for your thing (Añadir una política al objeto), elija MoistureSensorPolicy y, a
continuación, seleccione Register Thing (Registrar objeto).
1. En la consola de AWS IoT, elija Services (Servicios), escriba SNS y, a continuación, seleccione Simple
Notification Service (Servicio de notificación sencillo).
2. En el panel de navegación, elija Topics (Temas) y, a continuación, seleccione Create topic (Crear
tema).
3. Escriba un nombre para el tema (por ejemplo, MoistureSensorTopic).
4. Escriba un nombre de visualización para el tema (por ejemplo, Moisture Sensor Topic). Este es
el nombre que se muestra para el tema en la consola de Amazon SNS.
5. Elija Create new topic (Crear nuevo tema).
6. En la página de detalles del tema de Amazon SNS, elija Create subscription (Crear suscripción).
7. En Protocol (Protocolo), elija Email (Correo electrónico).
8. En Punto de enlace, introduzca su dirección de correo electrónico.
9. Seleccione Create subscription.
10. Abra su cliente de correo electrónico y busque un mensaje con el asunto MoistureSensorTopic.
Abra el correo electrónico y haga clic en el enlace Confirm subscription (Confirmar suscripción).
Important
No recibirá ninguna alerta por correo electrónico de este tema de Amazon SNS hasta que
confirme la suscripción.
88
AWS IoT Guía del desarrollador
Configuración del dispositivo
Raspberry Pi y el sensor de humedad
"reported": {
"moisture" : <moisture-reading>,
"temp" : <temperature-reading>
}
}
Puede crear una consulta que extraiga los datos de humedad y temperatura del mensaje entrante.
También puede crear una acción de Amazon SNS que tome los datos y los envíe a los suscriptores del
tema de Amazon SNS si la lectura de la humedad está por debajo de un valor de umbral.
1. En la consola de AWS IoT, en el panel de navegación, elija Act (Actuar). Si aparece el cuadro de
diálogo You don't have any rules yet (Aún no tiene ninguna regla), elija Create a rule (Crear una regla).
De lo contrario, seleccione Create.
2. En la página Create a rule (Crear una regla), introduzca un nombre para la regla (por ejemplo,
MoistureSensorRule).
3. En Description (Descripción), proporcione una breve descripción de esta regla, (por ejemplo, Sends
an alert when soil moisture level readings are too low).
4. En Rule query statement (Instrucción de consulta de regla), elija SQL versión 2016-03-23 e introduzca
la siguiente instrucción de consulta SQL de AWS IoT:
Esta instrucción activa la acción de la regla cuando la lectura de moisture es menor que 400.
Note
Es posible que tenga que utilizar un valor diferente. Una vez que el código se ejecute en el
dispositivo Raspberry Pi, si toca el sensor, lo coloca en agua o en una maceta, podrá ver los
valores que se obtienen del sensor.
5. En Set one or more actions (Definir una o varias acciones), elija Add action (Añadir acción).
6. En la página Seleccionar una acción, elija Enviar un mensaje como una notificación push SNS.
7. Desplácese hasta la parte inferior de la página y, a continuación, elija Configure action (Configurar
acción).
8. En la página Configure action (Configurar acción), en SNS target (Objetivo de SNS), elija Select
(Seleccionar) y, a continuación, seleccione LowMoistureTopic.
9. En Formato del mensaje, elija RAW.
10. En Choose or create a role to grant AWS IoT access to perform this action (Elija o cree un rol para
conceder acceso a AWS IoT para que realice esta acción), elija Create role (Crear rol). Introduzca un
nombre para el rol (por ejemplo, LowMoistureTopicRole) y, a continuación, elija Create role (Crear
rol).
11. Elija Añadir acción.
12. Elija Create rule.
89
AWS IoT Guía del desarrollador
Configuración del dispositivo
Raspberry Pi y el sensor de humedad
Conecte el cable puente JST al sensor de humedad. El otro lado del puente tiene cuatro cables:
Sujete el dispositivo Raspberry Pi con el enchufe hembra Ethernet a la derecha. En esta orientación hay
dos filas de clavijas GPIO en la parte superior. Conecte los cables del sensor de humedad a la fila inferior
de clavijas en el orden que se indica a continuación. Comenzando por la clavija del extremo izquierdo,
conecte el cable rojo (alimentación), el cable blanco (SDA) y el cable verde (SCL). Omita una clavija y, a
continuación, conecte el cable negro (conexión a tierra). Para obtener más información, consulte Cableado
de equipos Python.
Conecte el cable de alimentación al dispositivo Raspberry Pi y conecte el otro extremo a una toma de
corriente para encenderlo.
Una vez que se inicie el dispositivo Raspberry Pi, habilite la interfaz de I2C.
1. En la esquina superior izquierda del escritorio de Raspbian, haga clic en el icono de Raspberry, elija
Preferences (Preferencias) y, a continuación, elija Raspberry Pi Configuration (Configuración de
Raspberry Pi).
2. En la pestaña Interfaces (Interfaces), en I2C, elija Enable (Habilitar).
3. Seleccione OK.
Las bibliotecas del sensor de humedad Adafruit STEMMA se han escrito para CircuitPython. Para
ejecutarlas en un dispositivo Raspberry Pi, debe instalar la última versión de Python 3.
1. Ejecute los siguientes comandos desde un símbolo del sistema para actualizar el software del
dispositivo Raspberry Pi:
90
AWS IoT Guía del desarrollador
Configuración del dispositivo
Raspberry Pi y el sensor de humedad
Para obtener más información, consulte la sección Installing CircuitPython Libraries on Raspberry Pi.
5. Ejecute el siguiente comando para instalar las bibliotecas de Adafruit Seesaw:
El dispositivo Raspberry Pi ahora tiene todas las bibliotecas necesarias. Cree un archivo denominado
moistureSensor.py y copie el siguiente código Python en el archivo:
import logging
import time
import json
import argparse
import busio
if responseStatus == "accepted":
payloadDict = json.loads(payload)
print("~~~~~~~~~~~~~~~~~~~~~~~")
print("Update request with token: " + token + " accepted!")
print("moisture: " + str(payloadDict["state"]["reported"]["moisture"]))
print("temperature: " + str(payloadDict["state"]["reported"]["temp"]))
print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")
if responseStatus == "rejected":
print("Update request " + token + " rejected!")
if responseStatus == "accepted":
print("~~~~~~~~~~~~~~~~~~~~~~~")
print("Delete request with token: " + token + " accepted!")
print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")
91
AWS IoT Guía del desarrollador
Configuración del dispositivo
Raspberry Pi y el sensor de humedad
if responseStatus == "rejected":
print("Delete request " + token + " rejected!")
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--endpoint", action="store", required=True, dest="host",
help="Your AWS IoT custom endpoint")
parser.add_argument("-r", "--rootCA", action="store", required=True, dest="rootCAPath",
help="Root CA file path")
parser.add_argument("-c", "--cert", action="store", dest="certificatePath",
help="Certificate file path")
parser.add_argument("-k", "--key", action="store", dest="privateKeyPath", help="Private
key file path")
parser.add_argument("-p", "--port", action="store", dest="port", type=int, help="Port
number override")
parser.add_argument("-n", "--thingName", action="store", dest="thingName",
default="Bot", help="Targeted thing name")
parser.add_argument("-id", "--clientId", action="store", dest="clientId",
default="basicShadowUpdater", help="Targeted client id")
args = parser.parse_args()
return args
# Configure logging
# AWSIoTMQTTShadowClient writes data to the log
def configureLogging():
logger = logging.getLogger("AWSIoTPythonSDK.core")
logger.setLevel(logging.DEBUG)
streamHandler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)
logger.addHandler(streamHandler)
# Init AWSIoTMQTTShadowClient
myAWSIoTMQTTShadowClient = None
myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient(args.clientId)
myAWSIoTMQTTShadowClient.configureEndpoint(args.host, args.port)
myAWSIoTMQTTShadowClient.configureCredentials(args.rootCAPath, args.privateKeyPath,
args.certificatePath)
92
AWS IoT Guía del desarrollador
Configuración del dispositivo
Raspberry Pi y el sensor de humedad
# Create a device shadow handler, use this to update and delete shadow document
deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName(args.thingName,
True)
# Update shadow
deviceShadowHandler.shadowUpdate(json.dumps(payload), customShadowCallback_Update, 5)
time.sleep(1)
Guarde el archivo en un lugar donde pueda encontrarlo. Ejecute moistureSensor.py desde la línea de
comandos con los siguientes parámetros:
endpoint
Su punto de enlace de AWS IoT personalizado. Para obtener más información, consulte API RESTful
de sombra de dispositivo (p. 398).
rootCA
93
AWS IoT Guía del desarrollador
Configuración del dispositivo
Raspberry Pi y el sensor de humedad
Pruebe a tocar el sensor, colocarlo en una maceta o ponerlo en un vaso de agua para ver cómo
responde a distintos niveles de humedad. Si es necesario, puede cambiar el valor del umbral en la opción
MoistureSensorRule. Cuando la lectura del sensor de humedad está por debajo del valor especificado
en la instrucción de consulta SQL de la regla, AWS IoT publica un mensaje en el tema de Amazon SNS.
Debería recibir un mensaje de correo electrónico que incluya los datos de humedad y temperatura.
Una vez que haya verificado la recepción de mensajes de correo electrónico de Amazon SNS, pulse
CTRL + C para detener el programa Python. Es poco probable que el programa Python envíe suficientes
mensajes para incurrir en gastos, pero se recomienda detener el programa cuando haya terminado.
94
AWS IoT Guía del desarrollador
Cómo administrar objetos con el registro
{
"version": 3,
"thingName": "MyLightBulb",
"defaultClientId": "MyLightBulb",
"thingTypeName": "LightBulb",
"attributes": {
"model": "123",
"wattage": "75"
}
}
Los objetos se identifican por su nombre. También pueden tener atributos, que son pares nombre-
valor que puede utilizar para almacenar información acerca del objeto, como su número de serie o su
fabricante.
En un caso de uso de dispositivo típico, se utiliza el nombre del objeto como ID de cliente MQTT
predeterminado. Aunque no es obligatorio establecer un mapeo entre el nombre de un objeto del registro y
el uso que hace de los ID de cliente MQTT, los certificados o el estado de sombra, le recomendamos que
elija un nombre de objeto y lo utilice como ID de cliente MQTT, tanto para el registro como para el servicio
Device Shadow. De esta forma, puede organizar su flota de IoT más fácilmente, sin perder la flexibilidad
del modelo de certificado de dispositivo subyacente o las sombras.
No es necesario crear un objeto en el registro para conectar un dispositivo a AWS IoT. Al añadir objetos al
registro, podrá administrar y buscar dispositivos con más facilidad.
Crear objeto
A continuación, se muestra cómo se utiliza el comando CreateThing de AWS IoT en la CLI para crear
un objeto: No se puede modificar el nombre de un objeto una vez creado. Para cambiar el nombre de un
objeto, debe crear otro objeto nueva, asignarle el nuevo nombre y eliminar después el objeto anterior.
95
AWS IoT Guía del desarrollador
Lista de objetos
El comando CreateThing muestra el nombre y el ARN (nombre de recurso de Amazon) del nuevo objeto:
{
"thingArn": "arn:aws:iot:us-east-1:123456789012:thing/MyLightBulb",
"thingName": "MyLightBulb"
"thingId": "12345678abcdefgh12345678ijklmnop12345678"
}
Note
Lista de objetos
Puede utilizar el comando ListThings para enumerar todos los objetos en su cuenta:
Buscar objetos
Puede utilizar el comando DescribeThing para crear una lista de información acerca de un objeto:
96
AWS IoT Guía del desarrollador
Buscar objetos
Puede utilizar el comando ListThings para buscar todos los objetos asociados a un nombre de tipo de
objeto:
{
"things": [
{
"thingTypeName": "LightBulb",
"attributes": {
"model": "123",
"wattage": "75"
},
"version": 1,
"thingName": "MyRGBLight"
},
{
"thingTypeName": "LightBulb",
"attributes": {
"model": "123",
"wattage": "75"
},
"version": 1,
"thingName": "MySecondLightBulb"
}
]
}
Puede utilizar el comando ListThings para buscar todos los objetos que tienen un atributo con un valor
específico:
{
"things": [
{
"thingTypeName": "StopLight",
"attributes": {
"model": "123",
"wattage": "75"
},
"version": 3,
"thingName": "MyLightBulb"
},
{
"thingTypeName": "LightBulb",
"attributes": {
"model": "123",
"wattage": "75"
},
"version": 1,
"thingName": "MyRGBLight"
},
{
"thingTypeName": "LightBulb",
"attributes": {
"model": "123",
"wattage": "75"
},
97
AWS IoT Guía del desarrollador
Actualización de un objeto
"version": 1,
"thingName": "MySecondLightBulb"
}
]
}
Actualización de un objeto
Puede utilizar el comando UpdateThing para actualizar un objeto. Tenga en cuenta que este comando
solo actualiza los atributos del objeto. El nombre de un objeto no se puede modificar. Para cambiar el
nombre de un objeto, debe crear otro objeto nueva, asignarle el nuevo nombre y eliminar después el objeto
anterior.
El comando UpdateThing no genera una salida. Puede utilizar el comando de DescribeThing para ver el
resultado:
Eliminación de un objeto
Puede utilizar el comando DeleteThing para eliminar un objeto:
Este comando se devuelve correctamente sin error si la eliminación se realiza correctamente o especifica
un objeto que no existe.
98
AWS IoT Guía del desarrollador
Tipos de objeto
Tipos de objeto
Los tipos de objeto le permiten almacenar información descriptiva y de configuración común a todos los
objetos asociados al mismo tipo de objeto. Esto simplifica la administración de objetos en el registro. Por
ejemplo, puede definir un tipo de objeto LightBulb (bombilla). Todos los objetos asociados al tipo de objeto
LightBulb comparten un conjunto de atributos: número de serie, fabricante y potencia. Al crear un objeto
de tipo LightBulb (o cambiar el tipo a LightBulb) puede especificar valores para cada uno de los atributos
definidos en este tipo de objeto.
Aunque los tipos de objeto son opcionales, su uso facilita la detección de objetos.
Los tipos de objeto son inmutables. No se puede cambiar el nombre de un tipo de objeto después de que
se haya creado. Puede descartar un tipo de objeto, en cualquier momento, para evitar que se le asocien
nuevos objetos. También puede eliminar tipos de objeto que no tengan objetos asociados.
El comando CreateThingType devuelve una respuesta que contiene el tipo de objeto y su ARN:
{
"thingTypeName": "LightBulb",
"thingTypeId": "df9c2d8c-894d-46a9-8192-9068d01b2886",
"thingTypeArn": "arn:aws:iot:us-west-2:123456789012:thingtype/LightBulb"
}
El comando ListThingTypes devuelve una lista de los tipos de objeto definidos en su cuenta de AWS:
99
AWS IoT Guía del desarrollador
Descripción de un tipo de objeto
"thingTypes": [
{
"thingTypeName": "LightBulb",
"thingTypeProperties": {
"searchableAttributes": [
"wattage",
"model"
],
"thingTypeDescription": "light bulb type"
},
"thingTypeMetadata": {
"deprecated": false,
"creationDate": 1468423800950
}
}
]
}
{
"thingTypeProperties": {
"searchableAttributes": [
"model",
"wattage"
],
"thingTypeDescription": "light bulb type"
},
"thingTypeId": "df9c2d8c-894d-46a9-8192-9068d01b2886",
"thingTypeArn": "arn:aws:iot:us-west-2:123456789012:thingtype/LightBulb",
"thingTypeName": "LightBulb",
"thingTypeMetadata": {
"deprecated": false,
"creationDate": 1544466338.399
}
}
Puede utilizar el comando UpdateThing en cualquier momento para cambiar el tipo de objeto asociado a un
objeto:
También puede utilizar el comando UpdateThing para desvincular un objeto de un tipo de objeto.
100
AWS IoT Guía del desarrollador
Descartar un tipo de objeto
{
"thingTypeName": "StopLight",
"thingTypeProperties": {
"searchableAttributes": [
"wattage",
"numOfLights",
"model"
],
"thingTypeDescription": "traffic light type",
},
"thingTypeMetadata": {
"deprecated": true,
"creationDate": 1468425854308,
"deprecationDate": 1468446026349
}
}
Descartar un tipo de objeto es una operación reversible. Puede anular un descarte utilizando la marca --
undo-deprecate con el comando de la CLI DeprecateThingType:
{
"thingTypeName": "StopLight",
"thingTypeArn": "arn:aws:iot:us-east-1:123456789012:thingtype/StopLight",
"thingTypeId": "12345678abcdefgh12345678ijklmnop12345678"
"thingTypeProperties": {
"searchableAttributes": [
"wattage",
"numOfLights",
"model"
],
"thingTypeDescription": "traffic light type"
},
"thingTypeMetadata": {
"deprecated": false,
"creationDate": 1468425854308,
}
}
101
AWS IoT Guía del desarrollador
Eliminación de un tipo de objeto
Note
Debe esperar cinco minutos después de descartar un tipo de objeto para poder eliminarlo.
102
AWS IoT Guía del desarrollador
Crear un grupo de objetos estático
Asociar políticas a grupos y separarlas de ellos puede mejorar la seguridad de las operaciones de AWS
IoT de una serie de formas significativas. El método por dispositivo de asociar una política a un certificado,
que luego se asocia a un objeto, consume mucho tiempo y dificulta la actualización o cambio rápido de
políticas en una flota de dispositivos. Disponer de una política adjunta al grupo del objeto ahorra pasos
cuando hay que rotar los certificados en un objeto. Además, las políticas se aplican dinámicamente a
objetos cuando cambian la pertenencia a un grupo, por lo que no es necesario volver a crear un conjunto
complejo de permisos cada vez que un dispositivo cambia la pertenencia en un grupo.
El comando CreateThingGroup devuelve una respuesta que contiene el nombre, el ID y el ARN del grupo
de objetos estático:
{
"thingGroupName": "LightBulbs",
"thingGroupId": "abcdefgh12345678ijklmnop12345678qrstuvwx",
"thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/LightBulbs"
}
Note
A continuación, se muestra un ejemplo que especifica el grupo principal de un grupo de objetos estático
durante su creación:
Al igual que antes, el comando CreateThingGroup devuelve una respuesta que contiene el nombre, el ID y
el ARN del grupo de objetos:
{
"thingGroupName": "RedLights",
"thingGroupId": "abcdefgh12345678ijklmnop12345678qrstuvwx",
"thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLights",
}
Important
Tenga en cuenta las siguientes limitaciones cuando cree jerarquías de grupos de objetos:
103
AWS IoT Guía del desarrollador
Descripción de un grupo de objetos
{
"thingGroupName": "RedLights",
"thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLights",
"thingGroupId": "12345678abcdefgh12345678ijklmnop12345678",
"version": 1,
"thingGroupMetadata": {
"creationDate": 1478299948.882
"parentGroupName": "Lights",
"rootToParentThingGroups": [
{
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/ShinyObjects",
"groupName": "ShinyObjects"
},
{
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/LightBulbs",
"groupName": "LightBulbs"
}
]
},
"thingGroupProperties": {
"attributePayload": {
"attributes": {
"brightness": "3400_lumens"
},
},
"thingGroupDescription": "string"
},
}
Puede añadir un objeto a un máximo de 10 grupos. Sin embargo, no puede añadir un objeto a
más de un grupo en la misma jerarquía. (En otras palabras, no puede añadir un objeto a dos
grupos que comparten un grupo principal común).
Si un objeto pertenece al número máximo de grupos de objetos posible y uno o varios de estos
grupos es un grupo de objetos dinámico, puede utilizar la marca overrideDynamicGroups para que
los grupos estáticos tengan prioridad sobre los grupos dinámicos.
104
AWS IoT Guía del desarrollador
Enumerar los objetos en un grupo de objetos
{
"things":[
"TestThingA"
]
}
Con el parámetro --recursive, puede enumerar los objetos que pertenecen a un grupo y también los
que están en alguno de sus grupos secundarios:
{
"things":[
"TestThingA",
"MyLightBulb"
]
}
Note
Esta operación es a largo plazo coherente. En otras palabras, los cambios que se hagan en el
grupo de objetos podrían no reflejarse inmediatamente.
El comando ListThingGroups devuelve una lista de los grupos de objetos definidos en la cuenta de AWS:
{
"thingGroups": [
{
"groupName": "LightBulbs",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/LightBulbs"
},
{
"groupName": "RedLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLights"
},
105
AWS IoT Guía del desarrollador
Enumeración de grupos de objetos
{
"groupName": "RedLEDLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLEDLights"
},
{
"groupName": "RedIncandescentLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/
RedIncandescentLights"
}
{
"groupName": "ReplaceableObjects",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/ReplaceableObjects"
}
]
}
Utilice los filtros opcionales para enumerar los grupos que tienen un grupo determinado como grupo
principal (--parent-group) o los grupos cuyo nombre comienza por un prefijo determinado (--name-
prefix-filter). El parámetro --recursive le permite listar también todos los grupos secundarios, no
los grupos secundarios directos de un grupo de objetos:
En este caso, el comando ListThingGroups devuelve una lista de grupos secundarios directos del grupo de
objetos definido en la cuenta de AWS:
{
"childGroups":[
{
"groupName": "RedLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLights"
}
]
}
Utilice el parámetro --recursive con el comando ListThingGroups para listar todos los grupos
secundarios de un grupo de objetos, no solo un elemento secundario directo:
El comando ListThingGroups devuelve una lista de todos los grupos secundarios de un grupo de objetos:
{
"childGroups":[
{
"groupName": "RedLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLights"
},
{
"groupName": "RedLEDLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLEDLights"
},
{
"groupName": "RedIncandescentLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/
RedIncandescentLights"
}
]
}
106
AWS IoT Guía del desarrollador
Enumerar grupos para un objeto
Note
Esta operación es a largo plazo coherente. En otras palabras, los cambios que se hagan en el
grupo de objetos podrían no reflejarse inmediatamente.
El comando ListThingGroupsForThing devuelve una lista de los grupos de objetos a los que pertenece este
objeto, incluidos los grupos principales:
{
"thingGroups":[
{
"groupName": "LightBulbs",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/LightBulbs"
},
{
"groupName": "RedLights",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RedLights"
},
{
"groupName": "ReplaceableObjects",
"groupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/ReplaceableObjects"
}
]
}
El comando UpdateThingGroup devuelve una respuesta que contiene el número de versión del grupo
después de la actualización:
{
"version": 4
}
Note
107
AWS IoT Guía del desarrollador
Asociar una política a un grupo de objetos estático
Si intenta eliminar un grupo de objetos que tenga grupos secundarios de objetos, aparecerá un
error:
Puede eliminar un grupo que tenga objetos secundarios, pero no se seguirán aplicando los permisos
concedidos a los objetos por la pertenencia del grupo. Antes de eliminar un grupo que tenga una política
adjunta, compruebe detenidamente que la eliminación de esos permisos no hará que los objetos del grupo
no funcionen correctamente. Además, tenga en cuenta que los comandos que muestran a qué grupos
pertenece un objeto (por ejemplo, ListGroupsForThing) podrían seguir mostrando el grupo mientras se
actualizan los registros en la nube.
El parámetro --target puede ser un ARN de grupo de objetos (como más arriba), un ARN del certificado
o una identidad de Amazon Cognito. Para obtener más información acerca de las políticas, los certificados
y la autenticación, consulte Autenticación (p. 123).
108
AWS IoT Guía del desarrollador
Mostrar las políticas asociadas
a un grupo de objetos estático
El parámetro --target puede ser un ARN de grupo de objetos (como más arriba), un ARN del certificado
o una identidad de Amazon Cognito.
Agregue el parámetro --recursive opcional para incluir también todas las políticas asociadas a los
grupos principales del grupo.
{
"policies": [
"MyLightBulbPolicy"
...
]
}
Añada el parámetro --page-size number opcional para especificar el número máximo de resultados
que se va a devolver para cada consulta y el parámetro --marker string en las llamadas siguientes
para recuperar el siguiente conjunto de resultados, si lo hubiera.
El comando ListTargetsForPolicy devuelve una lista de destinos y el token que usar para recuperar más
resultados:
{
"nextMarker": "string",
"targets": [ "string" ... ]
}
109
AWS IoT Guía del desarrollador
Prueba de autorización para acciones de MQTT
--principal "arn:aws:iot:us-east-1:123456789012:cert/
a0c01f5835079de0a7514643d68ef8414ab739a1e94ee4162977b02b12842847"
Utilice el parámetro --principal para especificar el ARN del certificado adjunto al objeto. Si utiliza la
autenticación de identidad de Amazon Cognito, utilice el parámetro --cognito-identity-pool-id y,
opcionalmente, agregue el parámetro --principal para especificar una identidad de Amazon Cognito.
Si especifica solo el --cognito-identity-pool-id, se devuelven las políticas asociadas a ese rol del
grupo de identidades para usuarios sin autenticar. Si usa ambos, se devuelven las políticas asociadas a
ese rol del grupo de identidades para los usuarios autenticados.
El parámetro --thing-name es opcional y puede usarse en lugar del parámetro --principal. Cuando
se utiliza, se devolverán las políticas asociadas a cualquier grupo al que pertenece el objeto y las políticas
asociadas a grupos principales de estos grupos (hasta el grupo raíz en la jerarquía).
{
"effectivePolicies": [
{
"policyArn": "string",
"policyDocument": "string",
"policyName": "string"
}
...
]
}
Utilice el parámetro --principal para especificar el ARN del certificado adjunto al objeto. Si usa la
autenticación de identidad de Amazon Cognito, especifique una identidad de Cognito como --principal
o use el parámetro --cognito-identity-pool-id, o ambos. (Si especifica solo --cognito-
identity-pool-id, se tienen en cuenta las políticas asociadas a ese rol del grupo de identidades para
usuarios sin autenticar. Si usa ambos, se tienen en cuenta las políticas asociadas a ese rol del grupo de
identidades para los usuarios autenticados.
Especifique una o más acciones de MQTT que desee probar mediante la enumeración de conjuntos de
recursos y tipos de acción que siguen al parámetro --auth-infos. El campo actionType debería
contener "PUBLISH", "SUBSCRIBE", "RECEIVE" o "CONNECT". El campo resources debe contener una
lista de ARN de recursos. Para obtener más información, consulte Políticas de AWS IoT Core (p. 152).
Puede probar los efectos de la adición de políticas mediante la especificación de estas con el parámetro
--policy-names-to-add. También puede probar los efectos de la eliminación de políticas mediante
ellas con el parámetro --policy-names-to-skip.
El comando TestAuthorization devuelve detalles acerca de acciones que se permiten o deniegan para
cada conjunto de consultas --auth-infos especificadas:
110
AWS IoT Guía del desarrollador
Grupos de objetos dinámicos
{
"authResults": [
{
"allowed": {
"policies": [
{
"policyArn": "string",
"policyName": "string"
}
]
},
"authDecision": "string",
"authInfo": {
"actionType": "string",
"resources": [ "string" ]
},
"denied": {
"explicitDeny": {
"policies": [
{
"policyArn": "string",
"policyName": "string"
}
]
},
"implicitDeny": {
"policies": [
{
"policyArn": "string",
"policyName": "string"
}
]
}
},
"missingContextValues": [ "string" ]
}
]
}
Puesto que los grupos de objetos dinámicos están vinculados al índice de su flota, debe habilitar el
servicio de indexación de flotas para utilizarlos. Puede obtener una vista previa de los objetos en un
grupo de objetos dinámico antes de crear el grupo con una consulta de búsqueda de indexación de
flotas. Para obtener más información, consulte Servicio de indexación de flota (p. 559) y Sintaxis de la
consulta (p. 575).
Puede especificar un grupo de objetos dinámico como destino para un trabajo. Solo realizan el trabajo los
objetos que cumplen los criterios que definen el grupo de objetos dinámico.
Por ejemplo, supongamos que desea actualizar el firmware en sus dispositivos, pero, para reducir la
posibilidad de que la actualización se interrumpa, solo desea actualizar el firmware en los dispositivos
con duración de la batería superior al 80 %. Puede crear un grupo de objetos dinámico que solo incluya
dispositivos con una duración de la batería por encima del 80 %, y puede utilizar el grupo de objetos
dinámico como destino para el trabajo de actualización del firmware. Recibirán la actualización del
111
AWS IoT Guía del desarrollador
Crear un grupo de objetos dinámico
firmware solo los dispositivos que cumplan con sus criterios de duración de la batería. A medida que
los dispositivos alcancen el 80 % de duración de la batería, estos se van añadiendo al grupo de objetos
dinámico y reciben la actualización del firmware.
Para obtener más información sobre cómo especificar grupos de objetos como destinos de trabajos,
consulte CreateJob (p. 454).
Los grupos de objetos dinámicos se diferencian de los grupos de objetos estáticos como sigue:
• La pertenencia de un objeto no se define de forma explícita. Para crear un grupo de objetos dinámico,
debe definir una cadena de consulta que defina la pertenencia a un grupo.
• Los grupos de objetos dinámicos no pueden formar parte de una jerarquía.
• Los grupos de objetos dinámicos no pueden tener políticas aplicadas.
• Puede utilizar un conjunto diferente de comandos para crear, actualizar y eliminar grupos de objetos
dinámicos. Para el resto de operaciones, para interactuar con grupos de objetos dinámicos se pueden
usar los mismos comandos que se utilizan para interactuar con grupos de objetos estáticos.
• El número de grupos dinámicos que puede tener una sola cuenta es limitado.
Para obtener más información acerca de los grupos de objetos estáticos, consulte Grupos de objetos
estáticos (p. 102).
Por ejemplo, suponga que creamos un grupo dinámico que contiene todas las salas de un almacén cuya
temperatura es superior a 60 grados Fahrenheit. Cuando la temperatura de una sala sea 61 grados o
superior, esta sala se añade al grupo de objetos dinámico RoomTooWarm. Todas las salas del grupo de
objetos dinámico RoomTooWarm tienen encendidos los ventiladores. Cuando la temperatura de una sala
cae a 60 grados o menos, se elimina del grupo de objetos dinámico y se apaga su ventilador.
Note
El comando CreateDynamicThingGroup devuelve una respuesta que contiene el nombre del índice, la
cadena de consulta, la versión de la consulta, el nombre del grupo de objetos, el ID del grupo de objetos y
el ARN del grupo de objetos:
{
"indexName": "AWS_Things",
"queryVersion": "2017-09-30",
"thingGroupName": "RoomTooWarm",
"thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RoomTooWarm",
"queryString": "attributes.temperature>60\n",
"thingGroupId": "abcdefgh12345678ijklmnop12345678qrstuvwx"
}
El grupo de objetos dinámico no se crea de manera instantánea. Reponer un grupo de objetos dinámico
lleva tiempo. Cuando se crea un grupo de objetos dinámico, el estado del grupo se establece en
112
AWS IoT Guía del desarrollador
Describir un grupo de objetos dinámico
BUILDING. Cuando termina el proceso de reposición, el estado cambia a ACTIVE. Para comprobar el
estado del grupo de objetos dinámico, utilice el comando DescribeThingGroup.
{
"status": "ACTIVE",
"indexName": "AWS_Things",
"thingGroupName": "RoomTooWarm",
"thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RoomTooWarm",
"queryString": "attributes.temperature>60\n",
"version": 1,
"thingGroupMetadata": {
"creationDate": 1548716921.289
},
"thingGroupProperties": {},
"queryVersion": "2017-09-30",
"thingGroupId": "84dd9b5b-2b98-4c65-84e4-be0e1ecf4fd8"
}
ACTIVE
Se está creando el grupo de objetos dinámico y se está procesando la pertenencia de los objetos.
REBUILDING
Se está actualizando la pertenencia al grupo de objetos dinámico tras ajustar la consulta de búsqueda
del grupo.
Note
113
AWS IoT Guía del desarrollador
Eliminar un grupo de objetos dinámico
El comando UpdateDynamicThingGroup devuelve una respuesta que contiene el número de versión del
grupo después de la actualización:
{
"version": 2
}
Los comandos que muestran a qué grupos pertenece un objeto (por ejemplo,ListGroupsForThing) podrían
seguir mostrando el grupo mientras se actualizan los registros en la nube.
Limitaciones y conflictos
Los grupos de objetos dinámicos comparten estas limitaciones con los grupos de objetos estáticos:
Si tiene los permisos para consultar el índice de la flota, podrá obtener acceso a los datos de los
objetos en toda la flota.
114
AWS IoT Guía del desarrollador
Limitaciones y conflictos
En el registro de CloudWatch, se crea una entrada de error por cada objeto que no se haya podido agregar
a un grupo de objetos dinámico o que se haya eliminado de un grupo de objetos dinámico para agregarlo
a otro grupo. Cuando un objeto no se puede agregar a un grupo dinámico, también se crea una métrica
AddThingToDynamicThingGroupsFailed (p. 231); sin embargo, una sola métrica puede representar
varias entradas de registro.
Cuando un objeto pasa a ser válido para agregarse a un grupo de objetos dinámico, se tiene en cuenta lo
siguiente:
• ¿Este objeto ya está en el número máximo de grupos posible? (Consulte los límites)
• NO: el objeto se agrega al grupo de objetos dinámico.
• SÍ: ¿el objeto es miembro de algún grupo de objetos dinámico?
• NO: el objeto no se puede agregar al grupo de objetos dinámicos, se registra un error y se genera
una métrica AddThingToDynamicThingGroupsFailed (p. 231).
• SÍ: ¿el grupo de objetos al que se va a unir es anterior a cualquier otro grupo de objetos dinámico
del que el objeto ya sea miembro?
• NO: el objeto no se puede agregar al grupo de objetos dinámicos, se registra un error y se genera
una métrica AddThingToDynamicThingGroupsFailed (p. 231).
• SÍ: elimine el objeto del grupo de objetos dinámicos más reciente del que es miembro, registre
un error y agregue el objeto al grupo de objetos dinámicos. Esto genera un error y una métrica
AddThingToDynamicThingGroupsFailed (p. 231) en el grupo de objetos dinámico del que
se ha eliminado el objeto.
Cuando un objeto de un grupo dinámico ya no satisface la consulta de búsqueda, se elimina del grupo
de objetos dinámicos. Del mismo modo, cuando un objeto se actualiza para satisfacer una consulta de
búsqueda de un grupo de objetos dinámico, se agrega al grupo tal y como se describió anteriormente.
Estas incorporaciones y eliminaciones son normales y no generan entradas en el registro de errores.
Cuando se agrega un objeto a un grupo de objetos estático, debe tenerse en cuenta lo siguiente:
115
AWS IoT Guía del desarrollador
Limitaciones y conflictos
Cuando un objeto se elimina de un grupo de objetos dinámico, se registra un error y se genera un evento.
116
AWS IoT Guía del desarrollador
Conceptos básicos de etiquetas
Para ayudarle a administrar los costos relacionados con los objetos puede crear grupos de
facturación (p. 120) con objetos. A continuación, puede asignar etiquetas con sus metadatos a cada
uno de estos grupos de facturación. En esta sección se explican también los grupos de facturación y los
comandos disponibles para crearlos y administrarlos.
Puede buscar y filtrar sus recursos en función de las etiquetas que añada o aplique. También puede
utilizar etiquetas de grupo de facturación para categorizar y realizar un seguimiento de los costos. También
puede utilizar etiquetas para controlar el acceso a los recursos según se describe en Uso de etiquetas con
políticas de IAM (p. 118).
Para que sea más fácil usarlas, Tag Editor en la consola de administración de AWS proporciona un método
unificado y centralizado para crear y administrar etiquetas. Para obtener más información, consulte Uso de
Tag Editor en el tema sobre uso de la consola de administración de AWS.
También puede trabajar con etiquetas utilizando la CLI de AWS y la API de AWS IoT. Puede asociar
etiquetas a grupos de objetos, tipos de objetos, reglas de temas, trabajos, perfiles de seguridad y
grupos de facturación en el momento de crearlos utilizando el campo Tags (Etiquetas) en los siguientes
comandos:
• CreateBillingGroup
• CreateDynamicThingGroup
• CreateJob
• CreateOTAUpdate
• CreateScheduledAudit
• CreateSecurityProfile
• CreateStream
• CreateThingGroup
• CreateThingType
• CreateTopicRule
117
AWS IoT Guía del desarrollador
Restricciones y limitaciones en las etiquetas
Puede añadir, modificar o eliminar etiquetas para recursos existentes que admitan el uso de etiquetas con
los siguientes comandos:
• TagResource
• ListTagsForResource
• UntagResource
Puede editar las claves y los valores de las etiquetas y también puede eliminar etiquetas de un recurso
en cualquier momento. Puede establecer el valor de una etiqueta como una cadena vacía, pero no puede
asignarle un valor nulo. Si añade una etiqueta con la misma clave que una etiqueta existente en ese
recurso, el nuevo valor sobrescribirá al antiguo. Si elimina un recurso, también se eliminarán todas las
etiquetas que este tenga asociadas.
Note
Las claves de contexto de condición y los valores de una política de IAM se aplican únicamente a
las acciones de AWS IoT en las que un identificador de un recurso que se puede etiquetar es un
parámetro obligatorio. Por ejemplo, no se puede permitir ni denegar el uso de DescribeEndpoint
en función de los valores y las claves de contexto de condición porque en esta solicitud no se
hace referencia a ningún recurso que se pueda etiquetar (grupos de objetos, tipos de objetos,
reglas de temas, trabajos o perfiles de seguridad).
118
AWS IoT Guía del desarrollador
Uso de etiquetas con políticas de IAM
Para obtener más información sobre el uso de etiquetas, consulte Control del acceso mediante etiquetas
en la Guía del usuario de AWS Identity and Access Management. La sección de referencia de políticas
JSON de IAM de esta guía incluye sintaxis, descripciones y ejemplos detallados de los elementos,
variables y lógica de evaluación de las políticas JSON de IAM.
La siguiente política de ejemplo aplica dos restricciones basadas en etiquetas. Un usuario de IAM
restringido por esta política:
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Deny",
"Action" : "iot:*",
"Resource" : "*",
"Condition" : {
"StringEquals" : {
"aws:RequestTag/env" : "prod"
}
}
},
{
"Effect" : "Deny",
"Action" : "iot:*",
"Resource" : "*",
"Condition" : {
"StringEquals" : {
"aws:ResourceTag/env" : "prod"
}
}
},
{
"Effect": "Allow",
"Action": [
"iot:*"
],
"Resource": "*"
}
]
}
También puede especificar varios valores de etiqueta para una determinada clave de etiqueta
encerrándola en una lista, tal y como se muestra a continuación:
"StringEquals" : {
"aws:ResourceTag/env" : ["dev", "test"]
}
Note
Si permite o deniega a los usuarios acceso a recursos en función de etiquetas, debe considerar
denegar explícitamente a los usuarios la posibilidad de agregar estas etiquetas o retirarlas de los
mismos recursos. De lo contrario, es posible que un usuario eluda sus restricciones y obtenga
acceso a un recurso modificando sus etiquetas.
119
AWS IoT Guía del desarrollador
Grupos de facturación
Grupos de facturación
AWS IoT no le permite aplicar directamente etiquetas a objetos individuales, pero sí le permite colocar
objetos en grupos de facturación y aplicarles etiquetas. En AWS IoT, la asignación de datos de costos y
uso basados en etiquetas queda limitada a los grupos de facturación.
Para asociar los datos de uso y costos de forma precisa con los objetos que ha colocado en
grupos de facturación, cada dispositivo o cada aplicación debe:
• Haberse registrado como objeto en AWS IoT. Para obtener más información, consulte
Administración de dispositivos con AWS IoT (p. 95).
• Conéctese al agente de mensajes de AWS IoT a través de MQTT utilizando únicamente el
nombre del objeto como ID de cliente. Para obtener más información, consulte Agente de
mensajes de AWS IoT (p. 266).
• Autenticarse mediante un certificado de cliente asociado al objeto.
Dispone de las dimensiones de precios para los grupos de facturación (en función de la actividad de los
objetos asociados al grupo de facturación):
• Conectividad (en función del nombre del objeto utilizado como ID de cliente para conectarse)
• Mensajes (en función de la entrada de mensajes procedentes de un objeto y la salida de mensajes
destinados a un objeto; solo MQTT)
• Operaciones de sombra (en función del objeto cuyo mensaje activó una actualización de sombra)
• Reglas activadas (en función del objeto cuyo mensaje entrante activó la regla; no se aplica a las reglas
activadas por los eventos del ciclo de vida de MQTT)
120
AWS IoT Guía del desarrollador
Visualización de datos de uso y asignación de costos
• Actualizaciones de índices de objetos (en función del objeto que se haya agregado al índice)
• Acciones remotas (en función del objeto actualizado)
• Informes de Detect (p. 685) (en función del objeto cuya actividad se notifica).
Los datos de costo y uso basados en etiquetas (y notificados para un grupo de facturación) no reflejan las
siguientes actividades:
121
AWS IoT Guía del desarrollador
Seguridad en AWS IoT
Esta documentación le ayuda a comprender cómo aplicar el modelo de responsabilidad compartida cuando
se utiliza AWS IoT. En los siguientes temas, se le mostrará cómo configurar AWS IoT para satisfacer sus
objetivos de seguridad y conformidad. También puede aprender a utilizar otros servicios de AWS que le
ayudan a supervisar y proteger sus recursos de AWS IoT.
Temas
• Seguridad de AWS IoT (p. 122)
• Autenticación (p. 123)
• Administración de certificados de dispositivo (p. 150)
• Autorización (p. 151)
• Protección de los datos en AWS IoT Core (p. 186)
• Administración de identidad y acceso en AWS IoT (p. 189)
• Registro y monitorización (p. 213)
• Validación de conformidad para AWS IoT Core (p. 214)
• Resiliencia de AWS IoT Core (p. 215)
• Seguridad de la infraestructura en AWS IoT (p. 215)
• Análisis y administración de vulnerabilidades en AWS IoT Core (p. 215)
• Prácticas de seguridad recomendadas para AWS IoT Core (p. 216)
• AWS Training and Certification (p. 219)
122
AWS IoT Guía del desarrollador
Autenticación
Autenticación
La autenticación es un mecanismo en el que se verifica la identidad de un cliente o un servidor. La
autenticación del servidor es el proceso en el que los dispositivos u otros clientes aseguran que se
comunican con un punto de enlace de AWS IoT real. La autenticación de cliente es el proceso en el que
los dispositivos u otros clientes se autentican con AWS IoT.
123
AWS IoT Guía del desarrollador
Autenticación del servidor
se generan a través de una entidad de confianza conocida como autoridad de certificación (CA). La CA
administra uno o varios certificados especiales llamados certificados de CA, que utiliza para generar
certificados X.509. Solo la autoridad de certificación tiene acceso a los certificados de CA. Las cadenas de
certificados X.509 se utilizan tanto para la autenticación del servidor por parte de los clientes como para la
autenticación del cliente por parte del servidor.
Cuando sus dispositivos u otros clientes establecen una conexión TLS con un punto de enlace de AWS IoT
Core, AWS IoT Core presenta una cadena de certificados que los dispositivos utilizan para verificar si se
están comunicando con AWS IoT Core y no con otro servidor que suplante a AWS IoT Core . La cadena
que se presenta depende de una combinación del tipo de punto de enlace al que se conecta el dispositivo
y del conjunto de cifrado (p. 187) que el cliente y AWS IoT Core negociaron durante el protocolo TLS.
Los certificados presentados por los puntos de enlace de ATS están firmados por Starfield. Algunas
implementaciones de cliente TLS requieren la validación de la raíz de confianza y requieren que los
certificados de CA de Starfield estén instalados en los almacenes de confianza del cliente.
Warning
<account-specific-prefix>.iot.<your-region>.amazonaws.com
La primera vez que se llama a describe-endpoint, se crea un punto de enlace. Todas las llamadas
posteriores a describe-endpoint devuelven el mismo punto de enlace.
En lo que se refiere a la compatibilidad con versiones anteriores, AWS IoT Core sigue siendo compatible
con los puntos de enlace de Symantec. Para obtener más información, consulte How AWS IoT Core is
Helping Customers Navigate the Upcoming Distrust of Symantec Certificate Authorities. Los dispositivos
124
AWS IoT Guía del desarrollador
Autenticación del servidor
que funcionan en los puntos de enlace de ATS son totalmente interoperables con los dispositivos que
funcionan en los puntos de enlace de Symantec en la misma cuenta y no es necesario volver a registrarlos.
Note
Para ver el punto de enlace iot:Data-ATS en la consola de AWS IoT Core, elija Settings
(Configuración). La consola solo muestra el punto de enlace iot:Data-ATS. De forma
predeterminada, el comando describe-endpoint muestra el punto de enlace iot:Data para
garantizar la compatibilidad con versiones anteriores. Para ver el punto de enlace iot:Data-
ATS, especifique el parámetro --endpointType como en el ejemplo anterior.
• Clave RSA de 2048 bits: Certificado de entidad de certificación raíz G5 principal y público de clase 3 de
VeriSign
Es posible que tenga que hacer clic con el botón derecho en estos enlaces y seleccionar Guardar
enlace como... para guardar estos certificados como archivos.
125
AWS IoT Guía del desarrollador
Autenticación del cliente
Todos estos certificados tienen firma cruzada del Certificado Starfield Root CA. A partir del lanzamiento de
AWS IoT Core en la región de Asia Pacífico (Mumbai) el 9 de mayo de 2018, todas las regiones nuevas de
AWS IoT Core proporcionan exclusivamente certificados de ATS.
• Le recomendamos que utilice el punto final ATS e instale todos los certificados de CA raíz de Amazon
compatibles.
• Si no puede almacenar todos estos certificados en su dispositivo y si sus dispositivos no utilizan la
validación basada en ECC, puede omitir los certificados Amazon Root CA 3 y Amazon Root CA 4 de
ECC. Si sus dispositivos no implementan una validación de certificados basada en RSA, puede omitir
los certificados RSA Amazon Root CA 1 y Amazon Root CA 2. Es posible que tenga que hacer clic con
el botón derecho en estos enlaces y seleccionar Guardar enlace como... para guardar estos certificados
como archivos.
• Si tiene problemas de validación de certificados de servidor al conectarse a su punto de enlace de ATS,
intente agregar el certificado Amazon Root CA correspondiente con firma cruzada a su almacén de
confianza. Es posible que tenga que hacer clic con el botón derecho en estos enlaces y seleccionar
Guardar enlace como... para guardar estos certificados como archivos.
• Amazon Root CA 1 con firma cruzada
• Amazon Root CA 2 con firma cruzada: reservado para futura utilización.
• Amazon Root CA 3 con firma cruzada
• Amazon Root CA 4 con firma cruzada: reservado para futura utilización.
• Si experimenta problemas de validación de certificados de servidor, es posible que el dispositivo deba
confiar explícitamente en la CA raíz. Intente agregar el Certificado Starfield Root CA a su almacén de
confianza.
• Si sigue teniendo problemas después de ejecutar los pasos anteriores, póngase en contacto con AWS
Developer Support.
Note
Los certificados de CA tienen una fecha de vencimiento posterior que no pueden usar para
validar un certificado del servidor. Los certificados de CA podrían tener que reemplazarse antes
de su fecha de vencimiento. Asegúrese de que puede actualizar los certificados de entidad de
certificación raíz en todos sus dispositivos o clientes para asegurarse de que la conectividad se
mantenga y esté al día de las prácticas recomendadas de seguridad.
Note
Cuando se conecte a AWS IoT Core en el código del dispositivo, pase el certificado a la API que
está utilizando para realizar la conexión. La API que use variará según el SDK. Para obtener más
información, consulte los SDK de dispositivo de AWS IoT Core (p. 762).
126
AWS IoT Guía del desarrollador
Autenticación del cliente
Estas identidades se pueden usar con dispositivos, aplicaciones móviles, web o de escritorio. Incluso los
puede utilizar un usuario que escribe comandos de interfaz de línea de comandos (CLI) de AWS IoT. Por lo
general, los dispositivos AWS IoT utilizan certificados X.509, mientras que las aplicaciones móviles utilizan
identidades de Amazon Cognito. Las aplicaciones web y de escritorio usan IAM o identidades federadas.
Los comandos de la AWS CLI utilizan IAM. Para obtener más información acerca de las identidades de
IAM, consulte Administración de identidad y acceso en AWS IoT (p. 189).
Se recomienda que cada dispositivo o cliente reciba un certificado único para permitir acciones de
administración de clientes precisas, incluida la revocación de certificados. Los dispositivos y los
clientes deben ser compatibles con la rotación y la sustitución de certificados para garantizar un buen
funcionamiento cuando los certificados caduquen.
Para obtener información sobre el uso de certificados X.509 para admitir más de unos pocos
dispositivos, consulte Aprovisionamiento de dispositivos (p. 535) para revisar las distintas opciones de
aprovisionamiento y administración de certificados que admite AWS IoT.
En esta sección se describe cómo administrar certificados X.509 en AWS IoT. Puede utilizar la consola de
AWS IoT o la AWS CLI para realizar estas operaciones de certificado:
Para obtener más información sobre los comandos de la AWS CLI que realizan estas operaciones,
consulte la Referencia de la CLI de AWS IoT.
127
AWS IoT Guía del desarrollador
Autenticación del cliente
AWS IoT autentica los certificados utilizando el modo de autenticación de cliente del protocolo TLS. La
compatibilidad con TLS está disponible en numerosos lenguajes de programación y sistemas operativos,
y se utiliza generalmente para cifrar datos. En la autenticación de cliente de TLS, AWS IoT solicita un
certificado X.509 de cliente y valida el estado y la cuenta de AWS del certificado con arreglo a un registro
de certificados. A continuación, desafía al cliente para obtener una prueba de propiedad de la clave privada
que corresponde a la clave pública contenida en el certificado. AWS IoT requiere que los clientes envíen la
extensión de Indicación de nombre de servidor (SNI) al protocolo de Transport Layer Security (TLS). Para
obtener más información sobre la configuración de la extensión SNI, consulte Seguridad de transporte en
AWS IoT (p. 187).
Los certificados X.509 se pueden verificar con una entidad de certificación (CA) de confianza. Puede crear
certificados de cliente que utilicen la entidad de certificación Amazon Root y puede utilizar sus propios
certificados de cliente firmados por otra entidad de certificación. Para obtener más información sobre el uso
de sus propios certificados X.509, consulte Creación de sus propios certificados de cliente (p. 130).
La fecha y hora de caducidad de los certificados firmados por un certificado de entidad de certificación
se establecen en el momento de su creación. Los certificados X.509 generados por AWS IoT caducan a
medianoche UTC del 31 de diciembre de 2049 (2049-12-31T23:59:59Z). Para obtener más información
sobre el uso de la consola de AWS IoT para crear certificados que utilicen la entidad de certificación de
Amazon Root, consulte Crear certificados de cliente de AWS IoT (p. 129).
Los dispositivos que utilizan el registro de varias cuentas deben enviar la extensión Indicación de nombre
de servidor (SNI) al protocolo de Transport Layer Security (TLS) y proporcionar la dirección de punto de
enlace completa en el campo host_name, cuando se conectan a AWS IoT. AWS IoT utiliza la dirección de
punto de enlace en host_name para enrutar la conexión a la cuenta de AWS IoT correcta. Los dispositivos
existentes que no envíen una dirección de punto de enlace válida en host_name seguirán funcionando,
pero no podrán utilizar las características que requiere esta información. Para obtener más información
acerca de la extensión SNI y para aprender a identificar la dirección del punto de enlace del campo
host_name, consulte Seguridad de transporte en AWS IoT (p. 187).
1. No registre la entidad de certificación con la que firmó los certificados del dispositivo con AWS IoT.
2. Registre los certificados de dispositivo sin una entidad de certificación. Consulte Registrar un
certificado de cliente sin una entidad de certificación registrada (CLI) (p. 137).
3. Utilice el host_name correcto en la extensión SNI para TLS cuando el dispositivo se conecte a AWS
IoT. Consulte Seguridad de transporte en AWS IoT (p. 187).
• SHA256WITHRSA
• SHA384WITHRSA
• SHA512WITHRSA
• DSA_WITH_SHA256
• ECDSA-WITH-SHA256
128
AWS IoT Guía del desarrollador
Autenticación del cliente
• ECDSA-WITH-SHA384
• ECDSA-WITH-SHA512
En este tema se describe cómo crear un certificado de cliente firmado por la entidad de certificación
Amazon Root y descargar los archivos de certificado. Después de crear los archivos de certificado de
cliente, debe instalarlos en el cliente.
Puede utilizar la consola de AWS IoT o la AWS CLI para crear un certificado de AWS IoT firmado por la
entidad de certificación Amazon Root.
Si necesita además el archivo de certificado de entidad de certificación de Amazon Root, esta página
también tiene el enlace a la página desde la que puede descargarlo.
5. Ahora se ha creado y registrado un certificado de cliente con AWS IoT. Debe activar el certificado
antes de usarlo en un cliente.
Elija Activate para activar el certificado de cliente ahora. Si no desea activar el certificado ahora,
Activar un certificado de cliente (consola) (p. 139) describe cómo activarlo más adelante.
6. Si desea asociar una política al certificado, elija Attach a policy.
Si no desea asociar una política ahora, elija Done para finalizar. Puede asociar una política más
adelante.
Este comando crea archivos de clave privada, clave pública y certificado X.509 y registra y activa el
certificado con AWS IoT.
129
AWS IoT Guía del desarrollador
Autenticación del cliente
Si no desea activar el certificado al crearlo y registrarlo, este comando crea archivos de clave privada,
clave pública y certificado X.509 y registra el certificado, pero no lo activa. Activar un certificado de cliente
(CLI) (p. 140) describe cómo activar el certificado más adelante.
Para obtener más información acerca del uso de certificados X.509 para admitir más de unos pocos
dispositivos, consulte Aprovisionamiento de dispositivos (p. 535) para revisar las diferentes opciones de
administración y aprovisionamiento de certificados que admite AWS IoT.
Temas
• Administración de sus certificados de entidad de certificación (p. 130)
• Creación de un certificado de cliente mediante el certificado de entidad de certificación (p. 134)
2. Utilice la clave privada del par de claves para generar un certificado de CA.
130
AWS IoT Guía del desarrollador
Autenticación del cliente
-key <root_CA_key_filename> \
-sha256 -days 1024 \
-out <root_CA_pem_filename>
Si desea que los clientes registren automáticamente sus certificados de cliente con AWS IoT la primera vez
que se conectan, la entidad de certificación que firmó los certificados de cliente debe estar registrada con
AWS IoT. De lo contrario, no es necesario registrar el certificado de entidad de certificación que firmó los
certificados de cliente.
Note
Un certificado de entidad de certificación solo se puede registrar mediante una cuenta en una
región.
El certificado de entidad de certificación debe estar activo antes de poder registrar los certificados de
cliente firmados por él.
6. Si desea habilitar este certificado para registrar automáticamente certificados de cliente firmados por
este certificado, seleccione Enable auto-registration of device certificates (Habilitar registro automático
de certificados de dispositivo).
7. Elija Register CA certificate para completar el registro.
131
AWS IoT Guía del desarrollador
Autenticación del cliente
3. Cree una solicitud de firma de certificado (CSR) para el certificado de verificación de clave privada.
Establezca el campo Common Name del certificado en el registrationCode devuelto por get-
registration-code.
5. Registre el certificado de CA en AWS IoT. Pase el nombre de archivo del certificado de entidad
de certificación y el nombre de archivo del certificado de verificación de clave privada al comando
register-ca-certificate:
132
AWS IoT Guía del desarrollador
Autenticación del cliente
Utilice el comando describe-ca-certificate para ver el estado del certificado de entidad de certificación.
Cuando un certificado de entidad de certificación está habilitado para el registro automático de certificados
de cliente, AWS IoT comprueba el certificado de entidad de certificación utilizado para firmar el certificado
de cliente para asegurarse de que la entidad de certificación esté ACTIVE. Si el certificado de entidad de
certificación es INACTIVE, AWS IoT no permite que se registre el certificado de cliente.
Al establecer el certificado de entidad de certificación como INACTIVE, impide que los certificados de
cliente nuevos emitidos por la entidad de certificación se registren automáticamente.
Note
Todos los certificados de dispositivo registrados que haya firmado el certificado de entidad de
certificación en riesgo siguen funcionando hasta que revoque explícitamente cada uno de ellos.
La consola de AWS IoT no proporciona una forma de enumerar los certificados firmados por la
entidad de certificación desactivada. Para obtener una opción de AWS CLI para enumerar esos
certificados, consulte Desactivar un certificado de entidad de certificación (CLI) (p. 133).
133
AWS IoT Guía del desarrollador
Autenticación del cliente
--certificate-id <certificateId> \
--new-status INACTIVE
Utilice el comando list-certificates-by-ca para obtener una lista de todos los certificados de cliente
registrados firmados por la entidad de certificación especificada. Por cada certificado de cliente firmado
por el certificado de entidad de certificación especificado, puede utilizar el comando update-certificate para
revocar el certificado de cliente y evitar que este se use.
Utilice el comando describe-ca-certificate para ver el estado del certificado de entidad de certificación.
Puede utilizar su propia entidad de certificación (CA) para crear certificados de cliente. El certificado de
cliente debe registrarse en AWS IoT para poder utilizarlo. Para obtener información acerca de las opciones
de registro de los certificados de cliente, consulte Registrar un certificado de cliente (p. 135).
134
AWS IoT Guía del desarrollador
Autenticación del cliente
-CA <root_ca_pem_filename> \
-CAkey <root_ca_key_filename> \
-CAcreateserial
-out <device_cert_pem_filename> \
-days 500 -sha256
En este punto, se ha creado el certificado de cliente, pero aún no se ha registrado con AWS IoT. Para
obtener información acerca de cómo y cuándo registrar el certificado de cliente, consulte Registrar un
certificado de cliente (p. 135).
Si desea que sus clientes y dispositivos registren sus certificados de cliente cuando se conectan por
primera vez, debe usar Registro de su certificado de entidad de certificación (p. 131) para firmar el
certificado de cliente con AWS IoT en las regiones en las que desea usarlo. La entidad de certificación de
Amazon Root se registra automáticamente en AWS IoT.
Los certificados de cliente pueden compartirse con las cuentas y regiones de AWS. Los procedimientos de
estos temas deben realizarse en cada cuenta y región en la que desee utilizar el certificado de cliente. El
registro de un certificado de cliente en una cuenta o región no es reconocido automáticamente por otra.
Note
Los clientes que utilizan el protocolo Transport Layer Security (TLS) para conectarse a AWS IoT
deben admitir la extensión de indicación de nombre de servidor (SNI) para TLS. Para obtener más
información, consulte Seguridad de transporte en AWS IoT (p. 187).
Temas
• Registrar manualmente un certificado de cliente (p. 135)
• Registrar un certificado de cliente cuando el cliente se conecta a AWS IoT (Registro justo a
tiempo) (p. 137)
Puede registrar un certificado de cliente manualmente mediante la consola de AWS IoT y la AWS CLI.
Los procedimientos de este tema deben realizarse en cada cuenta y región en la que desee utilizar el
certificado de cliente. Las cuentas y regiones de AWS pueden compartir certificados de cliente, pero solo si
el certificado de cliente está firmado por una entidad de certificación (CA) que NO esté registrada con AWS
IoT. El registro de un certificado de cliente en una cuenta o región no es reconocido automáticamente por
otra.
Antes de realizar este procedimiento, asegúrese de que tiene el archivo.pem del certificado de
cliente y de que el certificado de cliente fue firmado por una entidad de certificación que se ha
registrado con AWS IoT (p. 131).
135
AWS IoT Guía del desarrollador
Autenticación del cliente
Si los certificados de cliente no están firmados por una entidad de certificación registrada con
AWS IoT, consulte Registrar manualmente un certificado de cliente sin una entidad de certificación
registrada (consola) (p. 136).
5. En Register existing device certificates (Registrar certificados de dispositivo existentes), elija Select
certificates y seleccione hasta 10 archivos de certificado que registrar.
6. Después de cerrar el cuadro de diálogo de archivo, seleccione si desea activar o revocar los
certificados de cliente cuando los registre.
Si no activa un certificado cuando se registra, Activar un certificado de cliente (consola) (p. 139)
describe cómo activarlo más adelante.
Después de elegir los archivos de certificado que desea registrar y seleccionar las acciones que desea
realizar después del registro, elija Register certificates.
Antes de realizar este procedimiento, asegúrese de que tiene el archivo .pem del certificado de
cliente.
Si no activa un certificado cuando se registra, Activar un certificado de cliente (consola) (p. 139)
describe cómo activarlo más adelante.
Después de elegir los archivos de certificado que desea registrar y seleccionar las acciones que desea
realizar después del registro, elija Register certificates.
136
AWS IoT Guía del desarrollador
Autenticación del cliente
El certificado de cliente está registrado con AWS IoT, pero no está activo aún. Consulte Activar un
certificado de cliente (CLI) (p. 140) para obtener información sobre cómo activarlo más adelante.
También puede activar el certificado de cliente cuando lo registre utilizando este comando.
Para obtener más información acerca de cómo activar el certificado para que se pueda utilizar para
conectarse a AWS IoT, consulte Activar o desactivar un certificado de cliente (p. 139)
El certificado de cliente está registrado con AWS IoT, pero no está activo aún. Consulte Activar un
certificado de cliente (CLI) (p. 140) para obtener información sobre cómo activarlo más adelante.
También puede activar el certificado de cliente cuando lo registre utilizando este comando.
Para obtener más información acerca de cómo activar el certificado para que se pueda utilizar para
conectarse a AWS IoT, consulte Activar o desactivar un certificado de cliente (p. 139)
Registrar un certificado de cliente cuando el cliente se conecta a AWS IoT (Registro justo a
tiempo)
Puede configurar un certificado de entidad de certificación para habilitar los certificados de cliente con
los que ha firmado para que se registren automáticamente con AWS IoT la primera vez que el cliente se
conecta a AWS IoT.
Para registrar certificados de cliente cuando un cliente se conecta a AWS IoT por primera vez, debe
habilitar el certificado de entidad de certificación para el registro automático y configurar la primera
conexión del cliente para proporcionar los certificados necesarios.
137
AWS IoT Guía del desarrollador
Autenticación del cliente
Note
Si ya ha registrado su certificado de entidad de certificación con AWS IoT, utilice el comando update-
ca-certificate para establecer autoRegistrationStatus del certificado de entidad de certificación en
ENABLE.
Utilice el comando describe-ca-certificate para ver el estado del certificado de entidad de certificación.
Cuando un cliente intenta conectar a AWS IoT por primera vez, como parte del protocolo de enlace TLS,
debe presentar un archivo que contenga el certificado de entidad de certificación registrado y el certificado
de cliente firmado por el certificado de entidad de certificación. Puede combinar los dos archivos utilizando
un comando como el siguiente:
Cuando AWS IoT registra automáticamente un certificado o cuando un cliente presenta un certificado en
estado PENDING_ACTIVATION, AWS IoT publica un mensaje en el tema MQTT siguiente:
138
AWS IoT Guía del desarrollador
Autenticación del cliente
$aws/events/certificates/registered/<caCertificateId>
{
"certificateId": "<certificateId>",
"caCertificateId": "<caCertificateId>",
"timestamp": <timestamp>,
"certificateStatus": "PENDING_ACTIVATION",
"awsAccountId": "<awsAccountId>",
"certificateRegistrationTimestamp": "<certificateRegistrationTimestamp>"
}
Puede crear una regla que escuche este tema y realice algunas acciones. Le recomendamos crear una
regla de Lambda que verifique que el certificado de cliente no se encuentre en una lista de revocación de
certificados (CRL), active el certificado y cree una política y la asocie a este. La política determina a qué
recursos puede tener acceso el cliente. Para obtener más información acerca de cómo crear una regla de
Lambda que escuche el tema $aws/events/certificates/registered/<caCertificateID> y
ejecute estas acciones, consulte Just-in-Time Registration of Client Certificates on AWS IoT.
Si se produce algún error o excepción durante el registro automático de los certificados de cliente, AWS
IoT envía eventos o mensajes a sus registros en CloudWatch Logs. Para obtener más información acerca
de cómo configurar los registros de su cuenta, consulte la documentación de Amazon CloudWatch.
Puede crear y registrar certificados de cliente sin activarlos para que no se puedan usar hasta que desee
usarlos. También puede desactivar los certificados de cliente activos para deshabilitarlos temporalmente.
Por último, puede revocar certificados de cliente para evitar que se utilicen en el futuro.
139
AWS IoT Guía del desarrollador
Autenticación del cliente
Si el comando se realizó correctamente, el estado del certificado será ACTIVE. Ejecute describe-certificate
para ver el estado del certificado.
Si el comando se realizó correctamente, el estado del certificado será INACTIVE. Ejecute describe-
certificate para ver el estado del certificado.
140
AWS IoT Guía del desarrollador
Autenticación del cliente
Si el comando se realizó correctamente, el estado del certificado será REVOKED. Ejecute describe-
certificate para ver el estado del certificado.
Los roles de IAM también permiten a AWS IoT tener acceso a otros recursos de AWS de su cuenta en su
nombre. Por ejemplo, si desea que un dispositivo publique su estado en una tabla de DynamoDB, los roles
de IAM permiten a AWS IoT interactuar con Amazon DynamoDB. Para obtener más información, consulte
Roles de IAM.
En cuanto a las conexiones del agente de mensajes sobre HTTP, AWS IoT autentica a los usuarios,
grupos y roles de IAM mediante el proceso Signature Version 4. Para obtener más información, consulte
Firma de solicitudes de la API de AWS.
Cuando utilice AWS Signature Version 4 con AWS IoT, los clientes deben admitir lo siguiente en su
implementación de TLS:
Para obtener información, consulte Administración de identidad y acceso en AWS IoT (p. 189).
Para utilizar Identidad de Amazon Cognito, defina un grupo de identidades de Amazon Cognito asociado
a un rol de IAM. El rol de IAM está asociado a una política de IAM que concede a las identidades de su
grupo de identidades permiso para acceder a los recursos de AWS, como llamar a los servicios de AWS.
Cuando utiliza identidades autenticadas, además de la política de IAM asociada al grupo de identidades,
puede asociar una política de AWS IoT a una Identidad de Amazon Cognito mediante la API AttachPolicy
141
AWS IoT Guía del desarrollador
Autenticación personalizada
y otorgar permisos detallados a un usuario individual de su aplicación de AWS IoT. De esta forma, puede
asignar permisos para clientes específicos y sus dispositivos. Para obtener más información acerca de la
creación de políticas para identidades de Amazon Cognito, consulte Ejemplos de política de publicación/
suscripción (p. 164).
Autenticación personalizada
AWS IoT le permite definir autorizadores personalizados para que pueda administrar su propia
autenticación y autorización de clientes. Para ello, se utilizan funciones AWS Lambda que envían
credenciales de cliente al servicio de autenticación.
Cuando se establece una conexión HTTP (y, opcionalmente, se actualiza a una conexión WebSocket)
y los encabezados Signature Version 4 no están presentes, la gateway de dispositivos de AWS IoT
comprueba si un autorizador personalizado está configurado para el punto de enlace. Si es así, la gateway
de dispositivos de AWS IoT utiliza el autorizador personalizado para autenticar la conexión y autorizar el
dispositivo. Los autorizadores personalizados pueden implementar varias estrategias de autenticación (por
ejemplo, verificación de JWT, llamada al proveedor de OAuth, etc.) y deben devolver los documentos de la
política que ha usado la puerta de enlace del dispositivo para autorizar las operaciones de MQTT.
Note
Temas
• Autorizadores personalizados (p. 143)
• Configuración de un autorizador personalizado (p. 144)
• Flujo de trabajo del autorizador personalizado (p. 145)
• Autenticación personalizada mejorada (beta) (p. 147)
142
AWS IoT Guía del desarrollador
Autenticación personalizada
Autorizadores personalizados
Los autorizadores personalizados constan de:
Nombre
Un ARN de una función de Lambda que implementa la lógica de autenticación y devuelve las políticas
de autorización.
Clave pública
La clave pública de un par de claves que se utiliza para evitar llamadas no autorizadas a la función de
Lambda del autorizador.
Utilice el siguiente comando para extraer la clave pública del par de claves:
El nombre de clave que se utiliza para extraer tokens de encabezados de conexión WebSocket.
Se le cobra en función del número de solicitudes para sus funciones de Lambda y la duración, el
tiempo necesario para ejecutar el código. Para obtener más información acerca de AWS Lambda,
consulte Precios de AWS Lambda y AWS Lambda Developer Guide.
Esta función toma un token presentado por un cliente o dispositivo, autentica el dispositivo y devuelve la
siguiente información:
isAuthenticated
Un valor booleano que indica si el token se ha autenticado. Si es false, el resto de los campos de
respuesta deben ignorarse.
principalId
Una lista de documentos de políticas con formato JSON que siguen las mismas convenciones que
una política de AWS IoT. La lista incluye como máximo 10 documentos de políticas, cada uno de los
cuales puede tener un máximo de 2048 caracteres.
DisconnectAfterInSecs
La duración máxima (en segundos) de la conexión a la gateway de AWS IoT, después de la cual se
desconecta. El valor mínimo es de 300 segundos y el máximo es de 86 400 segundos.
RefreshAfterInSecs
El periodo entre las actualizaciones de las políticas. Cuando transcurre este periodo, el motor de
políticas de AWS vuelve a evaluar los documentos de políticas y la gateway de dispositivos de AWS
143
AWS IoT Guía del desarrollador
Autenticación personalizada
IoT invoca de nuevo la función de Lambda para permitir cambios en las políticas. El valor mínimo es
de 300 segundos y el máximo es de 86 400 segundos.
Contexto
Información derivada después de validar el token que está disponible en instrucciones de SQL del
motor de reglas de AWS IoT (p. 373) y variables de política de IAM/AWS IoT (p. 155).
Debe conceder permiso al principal del servicio de AWS IoT para invocar la función de Lambda que
implementa la lógica de autenticación/autorización personalizada. Puede hacer esto con el siguiente
comando de la AWS CLI:
function-name
Un identificador de instrucción.
action
El ARN del autorizador personalizado. Especificar este valor garantiza que solo el autorizador
personalizado previsto puede invocar la función de Lambda.
Para obtener más información acerca de la concesión de permiso para llamar a las funciones de Lambda,
consulte Permisos de AWS Lambda.
Puede definir un autorizador predeterminado para que se utilice cuando la información del autorizador no
esté incluida en una solicitud de conexión:
{
"isAuthenticated": true,
"principalId": "xxxxxxxx",
"disconnectAfterInSeconds": 86400,
"refreshAfterInSeconds": 300,
"policyDocuments": [
"{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"...\",\"Effect\":
\"Allow|Deny\",\"Resource\":\"...\"}]}"
],
144
AWS IoT Guía del desarrollador
Autenticación personalizada
"context": {
"username": "johnDoe123",
"city": "Seattle",
"country": "USA"
}
}
El valor de retorno de la función de Lambda debe ser similar a esta respuesta. Puede ser un objeto
JSON serializado o no serializado.
2. Utilice la API create-authorizer para registrar un autorizador personalizado con AWS IoT.
Note
<FIRMA_TOKEN> debe firmarse con la clave privada del par de claves pública-privada
cargado en AWS IoT que se usó en la llamada a create-authorizer. A continuación se
indica un método de creación local de <TOKEN_SIGNATURE> desde una línea de comandos
de UNIX:
Debe recortar todos los caracteres de línea nueva del resultado de este comando antes de
transferir el valor de <FIRMA_TOKEN> a la API test-invoke-authorizer.
Cuando un cliente o dispositivo intenta conectarse a AWS IoT, envía la siguiente información en
encabezados HTTP:
145
AWS IoT Guía del desarrollador
Autenticación personalizada
A continuación se muestra una solicitud HTTP de ejemplo para conectarse a AWS IoT a través del
protocolo WebSocket.
La puerta de enlace del dispositivo de AWS IoT valida la firma digital y, si es válida, llama al autorizador
especificado. A continuación se muestra una carga de ejemplo que AWS IoT envía a la función de Lambda
del autenticador personalizado.
{
"token": "<some-token>"
}
{
"isAuthenticated": true,
"principalId": "xxxxxxxx",
"disconnectAfterInSeconds": 86400,
"refreshAfterInSeconds": 300,
"policyDocuments": [
"{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Action\": \"...\", \"Effect\":
\"Allow|Deny\", \"Resource\": \"...\" } ] }"
]
}
El valor de retorno de la función de Lambda debería ser similar a esta respuesta y puede ser un objeto
JSON serializado o no serializado.
Para ver un ejemplo integral de este flujo de trabajo, consulte How to Use Your Own Identity and Access
Management Systems to Control Access to AWS IoT Resources.
146
AWS IoT Guía del desarrollador
Autenticación personalizada
Esta característica actualmente se encuentra en versión beta pública y solo está disponible en la región
de EE. UU. Este (Norte de Virginia).
Note
Temas
• Creación de un autorizador personalizado para la autenticación personalizada mejorada (p. 147)
• Invocación de un autorizador personalizado con la autenticación personalizada mejorada (p. 148)
Esta característica actualmente se encuentra en versión beta pública y solo está disponible en la región
de EE. UU. Este (Norte de Virginia).
147
AWS IoT Guía del desarrollador
Autenticación personalizada
Después de crear el autorizador personalizado, puede asociarlo a una configuración de dominio existente
como el autorizador predeterminado mediante la API UpdateDomainConfiguration . También puede crear
una configuración utilizando la API CreateDomainConfiguration y especificando el nombre del autorizador
personalizado en el parámetro defaultAuthorizerName.
Esta característica actualmente se encuentra en versión beta pública y solo está disponible en la región
de EE. UU. Este (Norte de Virginia).
En esta sección se explica cómo utilizar la autenticación personalizada mejorada para pasar credenciales
de cliente a su autorizador personalizado mediante encabezados HTTP y cadenas de consulta o nombres
de usuario y contraseñas de MQTT.
Los dispositivos y clientes que utilizan el protocolo de Transport Layer Security (TLS) para conectarse
a AWS IoT deben enviar la extensión TLS de indicación de nombre de servidor (SNI) con un valor que
coincida con el dominio de la configuración de dominio adecuada. Puede especificar un autorizador
personalizado distinto del autorizador predeterminado si el valor de allowAuthorizerOverride
de la configuración de su dominio está establecido en true. Para obtener más información sobre la
configuración de la extensión SNI, consulte Seguridad de transporte en AWS IoT (p. 187).
Para utilizar la autenticación personalizada mejorada en las conexiones MQTT, los clientes también deben
enviar la extensión TLS de negociación de protocolo de capa de aplicación (ALPN) con un valor de mqtt y
conectarse al puerto 443.
Note
Solicitudes HTTPS
Las solicitudes a los autorizadores personalizados pueden pasar tokens utilizando uno de los siguientes
elementos: encabezados HTTP o cadenas de consulta en solicitudes de publicación HTTP o solicitudes
de actualización HTTP para establecer sesiones de MQTT a través de WSS. En el ejemplo siguiente se
utilizan encabezados HTTP para enviar una solicitud de actualización al gateway de dispositivos de AWS
IoT.
148
AWS IoT Guía del desarrollador
Autenticación personalizada
La solicitud no contiene un valor para x-amz-customauthorizer-name, por lo que AWS IoT utiliza
el autorizador predeterminado especificado en la configuración del dominio. El valor de x-amz-
customauthorizer-signature es opcional si la firma está deshabilitada en el autorizador.
El siguiente ejemplo muestra cómo realizar la misma solicitud mediante parámetros de cadena de consulta.
Puede pasar nombres de usuario y contraseñas a sus autorizadores personalizados utilizando los campos
password y username de los mensajes MQTT. Los datos de contraseña están codificados en base64
para admitir valores binarios arbitrarios. El valor de username puede contener opcionalmente una cadena
de consulta que pase valores adicionales (incluido un token, una firma y un nombre de autorizador) al
autorizador.
El siguiente ejemplo contiene una cadena username con parámetros adicionales que especifican un token
y una firma. Puede utilizar este método para autenticar una conexión MQTT utilizando un token portador.
username?x-amz-customauthorizer-name=${<name>}&x-amz-customauthorizer-signature=
${<sign>}&token-name=${<token-value>}
Los datos que AWS IoT envía a la función Lambda del autorizador personalizado dependen de qué
protocolos y parámetros están presentes en la conexión. Para las solicitudes HTTP (publicación y
actualizaciones de WSS), AWS IoT envía todos los encabezados y parámetros de consulta (hasta 8 KB de
datos). Para las actualizaciones de WSS en MQTT Connect, AWS IoT también envía todos los datos de
MQTT.
Si la firma está habilitada y la solicitud contiene un token y una firma, AWS IoT no activará la función
Lambda de su autorizador personalizado a menos que la firma del token se pueda descifrar y coincida con
el token proporcionado en la solicitud. Puede utilizar este método para que otras personas que se conecten
a su dominio no activen excesivamente su función Lambda.
Important
Le recomendamos encarecidamente que utilice la función de verificación de firma que AWS IoT
ofrece.
A continuación, se muestra un ejemplo de carga útil que AWS IoT envía a la función Lambda del
autenticador personalizado. AWS IoT rellena solo los campos que contiene la solicitud.
{
"token" :"<aToken>",
"signatureVerified": <boolean>, // Indicates whether the device gateway has validated
the signature.
"protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect.
149
AWS IoT Guía del desarrollador
Administración de certificados de dispositivo
"protocolData": {
"tls" : {
"serverName": "<serverName>" // The SNI host_name string.
},
"http": {
"headers": {
"#{<name>}": "#{<value>}"
},
"queryString": "?#{<name>}=#{<value>}"
},
"mqtt": {
"username": "<myUserName>",
"password": "<myPassword>", // base64 encoded.
"clientId": "<myClientId>" // Provided only when the device sends it.
}
},
"connectionMetadata": {
"id": <UUID> // The connection ID. You can use this for logging.
},
}
Note
Todos los datos de contraseña están codificados en base64 y su función Lambda necesita
descodificarlos.
Al igual que con la autenticación personalizada normal, el autorizador personalizado debe devolver una
respuesta que indique si ha autorizado la solicitud a AWS IoT. A continuación, se muestra un ejemplo de
una respuesta correcta de un autorizador personalizado.
{
"isAuthenticated":true,
"principalId": "xxxxxxxx",
"disconnectAfterInSeconds": 86400,
"refreshAfterInSeconds": 300,
"policyDocuments": [
"{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Action\": \"...\", \"Effect\":
\"Allow|Deny\", \"Resource\": \"...\" } ] }"
]
}
AWS IoT almacena en caché las políticas asociadas con la entidad principal durante el tiempo especificado
en el valor de refreshAfterInSeconds. Durante este tiempo, las llamadas posteriores se autorizan
sin tener que volver a autenticar el dispositivo. Los errores que se producen durante la autenticación
personalizada dan como resultado un error de autenticación, que detiene la conexión.
150
AWS IoT Guía del desarrollador
Autorización
Autorización
Autorización es el proceso de concesión de permisos a una identidad autenticada. Concede permisos
en AWS IoT Core usando políticas de AWS IoT Core e IAM. En este tema se abordan las políticas de
AWS IoT Core. Para obtener más información acerca de las políticas deIAM, consulte Administración de
identidad y acceso en AWS IoT (p. 189) y Políticas de IAM (p. 193).
Las políticas de AWS IoT Core determinan lo que puede hacer una identidad autenticada. Los dispositivos
y las aplicaciones móviles, web y de escritorio utilizan identidades autenticadas. Una identidad autenticada
puede ser incluso un usuario que ejecute comandos de la CLI de AWS IoT Core. Una identidad puede
ejecutar operaciones de AWS IoT Core solo si cuenta con una política que le conceda permiso para dichas
operaciones.
Tanto las políticas de AWS IoT Core como las de IAM se utilizan con AWS IoT Core para controlar las
operaciones que una identidad (también denominada principal) puede realizar. El tipo de política que utilice
depende del tipo de identidad que esté utilizando para autenticarse en AWS IoT Core.
• La API del plano de control le permite realizar tareas administrativas, como crear o actualizar
certificados, objetos, reglas, etc.
• La API del plano de datos le permite enviar datos a AWS IoT Core y recibir datos de este servicio.
El tipo de política que utilice depende de si utiliza la API del plano de control o la del plano de datos.
En la tabla siguiente se muestran los tipos de identidad, los protocolos que utilizan y los tipos de políticas
que se pueden utilizar para la autorización.
Protocolo y
Tipo de
mecanismo de SDK Tipo de política
identidad
autenticación
MQTT sobre
TLS/TCP,
autenticación SDK de
Certificados Política de
mutua TLS dispositivos de
X.509 AWS IoT Core
(puerto 8883 o AWS IoT Core
† (p. 277)
443) )
Identidad
Políticas de
de Amazon
IAM y AWS IoT
Cognito
MQTT sobre Core
autenticada.
HTTPS/
WebSocket, AWS Mobile Identidad
autenticación SDK de Amazon
Política de IAM
AWS Sigv4 Cognito no
(puerto 443) autenticada
IAM o identidad
Política de IAM
federada
HTTPS, Amazon
AWS CLI Política de IAM
autenticación Cognito, IAM
151
AWS IoT Guía del desarrollador
AWS Training and Certification
Protocolo y
Tipo de
mecanismo de SDK Tipo de política
identidad
autenticación
AWS Signature
o identidad
Versión 4
federada
(puerto 443)
HTTPS,
Sin
autenticación Certificados Política de
compatibilidad
mutua TLS X.509 AWS IoT Core
de SDK
(puerto 8443)
HTTPS sobre
SDK de Política de
autenticación Autorizador
dispositivos de autorizador
personalizada personalizado
AWS IoT Core personalizada
(Puerto 443)
Protocolo y
Tipo de
mecanismo de SDK Tipo de política
identidad
autenticación
HTTPS, Identidad d
autenticación eAmazon Política de IAM
AWS Signature AWS CLI Cognito
Versión 4 IAM o identidad
(puerto 443) Política de IAM
federada
Las políticas de AWS IoT Core están asociadas a certificados X.509 o identidades de Amazon Cognito.
Las políticas de IAM se asocian a un usuario, grupo o rol de IAM. Si utiliza la consola de AWS IoT o la CLI
de AWS IoT Core para asociar la política (a un certificado o a Identidad de Amazon Cognito), utilice una
política de AWS IoT Core. De lo contrario, utilice una política de IAM.
Las autorizaciones basadas en políticas son una herramienta muy eficaz. Le dan un control completo
sobre lo que un dispositivo, usuario o aplicación puede hacer en AWS IoT Core. Por ejemplo, tomemos el
caso de un dispositivo que se conecte con AWS IoT Core mediante un certificado. Puede permitir que el
dispositivo tenga acceso a todos los temas MQTT, o bien puede restringir su acceso a un único tema. O
tomemos, por ejemplo, el caso de un usuario que ejecute comandos de la CLI en una línea de comandos.
Si aplica una política, puede permitirle o denegarle el acceso a cualquier comando o recurso de AWS IoT
Core. También puede controlar el acceso de una aplicación a los recursos de AWS IoT Core.
152
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Las políticas de AWS IoT Core le permiten controlar el acceso al plano de datos de AWS IoT Core. El
plano de datos de AWS IoT Core se compone de operaciones que le permiten conectarse con el agente
de mensajes de AWS IoT Core, enviar y recibir mensajes MQTT y obtener o actualizar la sombra de un
dispositivo.
Una política de AWS IoT Core es un documento JSON que contiene una o varias declaraciones de política.
Cada instrucción contiene:
Temas
• Acciones de política de AWS IoT Core (p. 153)
• Recursos de acción de AWS IoT Core (p. 154)
• Variables de las políticas de AWS IoT Core (p. 155)
• Ejemplos de políticas de AWS IoT (p. 161)
• Autorización con identidades de Amazon Cognito (p. 181)
iot:Connect
Representa el permiso para conectarse con el agente de mensajes de AWS IoT Core. El permiso
iot:Connect se comprueba cada vez que se envía una solicitud CONNECT al agente. El agente de
mensajes no permite que haya dos clientes con el mismo ID de cliente conectados simultáneamente.
Después de que el segundo cliente se conecta, el agente cierra la conexión existente. El permiso
iot:Connect se puede utilizar para garantizar que solo puedan conectarse los clientes autorizados
que utilizan un ID de cliente específico.
iot:Publish
Representa el permiso de publicar en un tema MQTT. Este permiso se comprueba cada vez que
se envía una solicitud PUBLISH al agente. Se puede utilizar para permitir a los clientes publicar en
determinados patrones de tema.
Note
Representa el permiso para recibir un mensaje de AWS IoT Core. El permiso iot:Receive se
comprueba cada vez que se entrega un mensaje a un cliente. Dado que este permiso se comprueba
en cada entrega, se puede utilizar para revocar permisos a clientes que están suscritos en ese
momento a un tema.
iot:Subscribe
Representa el permiso para suscribirse a un filtro de temas. Este permiso se comprueba cada vez que
se envía una solicitud SUBSCRIBE al agente. Se puede utilizar para permitir a los clientes suscribirse
a temas que coinciden con patrones de tema específicos.
153
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Note
iot:DeleteThingShadow
Note
Las acciones de política de ejecución de trabajo se aplican únicamente al punto de enlace HTTP
TLS. Si utiliza el punto de enlace MQTT, debe utilizar las acciones de política MQTT definidas en
este tema.
iot:DescribeJobExecution
Representa el permiso para recuperar una ejecución de trabajo para un objeto determinado. El
permiso iot:DescribeJobExecution se comprueba cada vez que se presenta una solicitud para
obtener la ejecución de un trabajo.
iot:GetPendingJobExecutions
Representa el permiso para recuperar la lista de trabajos que no están en un estado final para un
objeto. El permiso iot:GetPendingJobExecutions se comprueba cada vez que se presenta una
solicitud para recuperar la lista.
iot:UpdateJobExecution
Representa el permiso para obtener e iniciar la próxima ejecución de trabajo pendiente para un objeto,
es decir, para actualizar una ejecución de trabajo con un estado QUEUED a IN_PROGRESS. El
permiso iot:StartNextPendingJobExecution se comprueba cada vez que se presenta una
solicitud para iniciar la siguiente ejecución de trabajo pendiente.
154
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
En la tabla siguiente se muestra el recurso que debe especificarse para cada tipo de acción:
Acción Recurso
• iot:ClientId: el ID de cliente que se utiliza para conectarse con el agente de mensajes de AWS IoT
Core.
• aws:SourceIp: la dirección IP del cliente conectado con el agente de mensajes de AWS IoT Core.
155
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
La siguiente política de AWS IoT Core muestra una política que utiliza variables de política:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Connect"],
"Resource": [
"arn:aws:iot:us-east-1:123451234510:client/${iot:ClientId}"
]
},
{
"Effect": "Allow",
"Action": ["iot:Publish"],
"Resource": [
"arn:aws:iot:us-east-1:123451234510:topic/my/topic/${iot:ClientId}"
]
}
]
}
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/${iot:ClientId}/topic"
]
}
Un cliente puede conectarse usando + como ID de cliente. Esto puede permitir al usuario suscribirse a
cualquier tema que coincida con el filtro de temas my/+/topic. Como protección contra estas deficiencias
de seguridad, utilice la acción de política iot:Connect para controlar los ID de cliente que pueden
conectarse. Por ejemplo, esta política permite conectarse únicamente a los clientes cuyo ID de cliente sea
clientid1:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Connect"],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/clientid1"
]
}
]
}
156
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Tenga en cuenta lo siguiente cuando utilice variables en las políticas de AWS IoT Core.
• iot:Connection.Thing.ThingName
Esta variable se resuelve en el nombre del objeto en el registro de AWS IoT Core para el que se evalúa
la política. AWS IoT Core utiliza el certificado que presenta el dispositivo cuando se autentica para
determinar qué objeto que se va a utilizar para verificar la conexión. Esta variable de política solo está
disponible cuando un dispositivo se conecta utilizando MQTT o MQTT con el protocolo WebSocket.
• iot:Connection.Thing.ThingTypeName
Esta variable se resuelve en el tipo de objeto asociado al objeto para el que se evalúa la política. El
nombre de objeto se establece en el ID de cliente de la conexión MQTT/WebSocket. El nombre de tipo
de objeto se obtiene a partir de una llamada a la API DescribeThing. Esta variable de política solo
está disponible cuando la conexión se establece sobre MQTT o MQTT sobre protocolo WebSocket.
• iot:Connection.Thing.Attributes[attributeName]
Esta variable se resuelve en el valor del atributo especificado asociado al objeto para el que se evalúa
la política. Un objeto puede tener hasta 50 atributos. Cada atributo estará disponible como variable
de política: iot:Connection.Thing.Attributes[attributeName] donde attributeName
es el nombre del atributo. El nombre de objeto se establece en el ID de cliente de la conexión MQTT/
WebSocket. Esta variable de política solo está disponible cuando la conexión se establece sobre MQTT
o MQTT sobre protocolo WebSocket.
• iot:Connection.Thing.IsAttached
Esta variable se resuelve en true si el certificado o la identidad de Amazon Cognito para la que se
evalúa la política está asociada a un objeto de IoT. Puede utilizar esta variable para evitar que un
dispositivo se conecte a AWS IoT Core si presenta un certificado que no está asociado a un objeto de
IoT en el registro de AWS IoT Core.
CertificateId
Atributos de emisor
Las siguientes variables de política de AWS IoT Core le permiten autorizar o denegar permisos en función
de atributos de certificado establecidos por el emisor del certificado.
• iot:Certificate.Issuer.DistinguishedNameQualifier
157
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
• iot:Certificate.Issuer.Country
• iot:Certificate.Issuer.Organization
• iot:Certificate.Issuer.OrganizationalUnit
• iot:Certificate.Issuer.State
• iot:Certificate.Issuer.CommonName
• iot:Certificate.Issuer.SerialNumber
• iot:Certificate.Issuer.Title
• iot:Certificate.Issuer.Surname
• iot:Certificate.Issuer.GivenName
• iot:Certificate.Issuer.Initials
• iot:Certificate.Issuer.Pseudonym
• iot:Certificate.Issuer.GenerationQualifier
Atributos de sujeto
Las siguientes variables de política de AWS IoT Core le permiten conceder o denegar permisos en función
de atributos de sujeto de certificado establecidos por el emisor del certificado.
• iot:Certificate.Subject.DistinguishedNameQualifier
• iot:Certificate.Subject.Country
• iot:Certificate.Subject.Organization
• iot:Certificate.Subject.OrganizationalUnit
• iot:Certificate.Subject.State
• iot:Certificate.Subject.CommonName
• iot:Certificate.Subject.SerialNumber
• iot:Certificate.Subject.Title
• iot:Certificate.Subject.Surname
• iot:Certificate.Subject.GivenName
• iot:Certificate.Subject.Initials
• iot:Certificate.Subject.Pseudonym
• iot:Certificate.Subject.GenerationQualifier
Los certificados X.509 permiten que estos atributos contengan uno o varios valores. De forma
predeterminada, las variables de política de cada atributo de varios valores devuelven el primer valor. Por
ejemplo, el atributo Certificate.Subject.Country podría contener una lista de nombres de países,
pero cuando se evalúa en una política, iot:Certificate.Subject.Country se reemplaza por el
nombre del primer país. Puede solicitar un valor de atributo específico distinto del primero mediante un
índice de base uno. Por ejemplo, iot:Certificate.Subject.Country.1 se sustituye por el nombre
del segundo país en el atributo Certificate.Subject.Country. Si especifica un valor de índice que
no existe (por ejemplo, si pide un tercer valor cuando el atributo solo tiene dos valores asignados), no se
realizará ninguna sustitución y la autorización dará un resultado erróneo. Puede utilizar el sufijo .List en
el nombre de la variable de política para especificar todos los valores del atributo.
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
permite que los clientes con un nombre de objeto registrado en el registro de AWS IoT Core se
conecten, pero limita el derecho a publicar en un tema específico del nombre de objeto a aquellos
clientes con certificados cuyo atributo Certificate.Subject.Organization se haya establecido
en "Example Corp" o en "AnyCompany". Esta restricción se lleva a cabo mediante un campo
158
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Condition" que especifica una condición que ha de cumplirse para permitir la acción anterior.
En este caso, la condición es que el atributo Certificate.Subject.Organization asociado al
certificado incluya uno de los valores de la lista:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:Connect"
],
"Resource":[
"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
]
},
{
"Effect":"Allow",
"Action":[
"iot:Publish"
],
"Resource":[
"arn:aws:iot:us-east-1:123456789012:topic/my/topic/
${iot:Connection.Thing.ThingName}"
],
"Condition":{
"ForAllValues:StringEquals":{
"iot:Certificate.Subject.Organization.List":[
"Example Corp",
"AnyCompany"
]
}
}
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente
política concede permiso para conectarse a AWS IoT Core con los ID de cliente client1, client2
y client3, pero limita el derecho a publicar en un tema específico del id de cliente a aquellos
clientes con certificados cuyo atributo Certificate.Subject.Organization se haya establecido
en "Example Corp" o en "AnyCompany". Esta restricción se lleva a cabo mediante un campo
"Condition" que especifica una condición que ha de cumplirse para permitir la acción anterior.
En este caso, la condición es que el atributo Certificate.Subject.Organization asociado al
certificado incluya uno de los valores de la lista:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:Connect"
],
"Resource":[
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
},
{
159
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Effect":"Allow",
"Action":[
"iot:Publish"
],
"Resource":[
"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
],
"Condition":{
"ForAllValues:StringEquals":{
"iot:Certificate.Subject.Organization.List":[
"Example Corp",
"AnyCompany"
]
}
}
}
]
}
Las variables de política de AWS IoT Core siguientes le permiten conceder o denegar permisos en función
de los atributos de nombre alternativo del emisor establecidos por el emisor del certificado.
• iot:Certificate.Issuer.AlternativeName.RFC822Name
• iot:Certificate.Issuer.AlternativeName.DNSName
• iot:Certificate.Issuer.AlternativeName.DirectoryName
• iot:Certificate.Issuer.AlternativeName.UniformResourceIdentifier
• iot:Certificate.Issuer.AlternativeName.IPAddress
Las variables de política de AWS IoT Core siguientes le permiten conceder o denegar permisos en función
de los atributos de nombre alternativo del tema establecidos por el emisor del certificado.
• iot:Certificate.Subject.AlternativeName.RFC822Name
• iot:Certificate.Subject.AlternativeName.DNSName
• iot:Certificate.Subject.AlternativeName.DirectoryName
• iot:Certificate.Subject.AlternativeName.UniformResourceIdentifier
• iot:Certificate.Subject.AlternativeName.IPAddress
Otros atributos
Comodines
160
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
la política. Esto puede producir un error de autorización. Se pueden utilizar los siguientes caracteres
comodín: *, $, +, ? y #.
Campos de matriz
Los atributos de certificado que contienen matrices se limitan a cinco elementos. No se tendrán en
cuenta los elementos adicionales.
Longitud de cadena
Todos los valores de cadena están limitados a 1024 caracteres. Si un atributo de certificado contiene
una cadena de más de 1024 caracteres, la variable de política no se sustituirá por el valor de atributo
de certificado y el texto ${policy-variable} figurará en el documento de la política. Esto puede
producir un error de autorización.
Caracteres especiales
Cualquier carácter especial, como ,, ", \, +, =, <, > y ; debe tener el prefijo de una barra invertida (\)
cuando se utiliza en una variable de política. Por ejemplo, Amazon Web Services O=Amazon.com
Inc. L=Seattle ST=Washington C=US se convierte en Amazon Web Service O=
\Amazon.com Inc. L\=Seattle ST\=Washington C\=US.
Temas
• Elementos de política de AWS IoT (p. 161)
• Ejemplos de política de conexión (p. 162)
• Ejemplos de política de publicación/suscripción (p. 164)
• Ejemplos de políticas de conexión y publicación (p. 176)
• Ejemplos de políticas de certificado (p. 176)
• Ejemplos de políticas de objeto (p. 180)
Ejemplos de políticas
Para obtener más ejemplos de políticas, consulte los siguientes temas en otras secciones de esta guía:
Versión
161
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Acción
Cliente: arn:aws:iot:region:account-id:client/client-id
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
}
]
}
La siguiente política deniega el permiso a ID de clientes client1 y client2 para conectar a AWS IoT
Core, a la vez que permite a los dispositivos conectarse mediante un ID de cliente que coincida con el
nombre de un objeto registrado en el registro de AWS IoT Core:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"iot:Connect"
162
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
]
}
]
}
La siguiente política concede permiso a un dispositivo para conectarse utilizando su nombre de objeto
como ID de cliente y para suscribirse al filtro de temas my/topic/filter. El dispositivo debe estar
registrado en AWS IoT Core. Cuando el dispositivo se conecta a AWS IoT Core, debe proporcionar el
certificado asociado con el objeto de IoT en el registro de AWS IoT Core:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic/filter"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse utilizando el ID de cliente client1 y para suscribirse al filtro de
temas my/topic:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
163
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic"
]
}
]
}
Para especificar caracteres comodín en los nombres de los temas, utilice * en el atributo resource de la
política cuando el dispositivo publique y se suscriba a varios temas. La política siguiente permite que un
dispositivo publique en todos los subtemas que comiencen con el mismo nombre de objeto.
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando un ID de cliente que coincide con el
nombre de objeto y para publicar en cualquier tema que tenga como prefijo el nombre del objeto:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}",
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/
${iot:Connection.Thing.ThingName}/*"
]
}
]
}
164
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando el ID de cliente client1, client2 o
client3 y para publicar en cualquier tema que tenga como prefijo el ID de cliente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
}
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/*"
]
}
]
}
También puede utilizar el comodín * al final del filtro de un tema. El uso de caracteres comodín podría dar
lugar a la concesión de privilegios no deseados, por lo que solo deben utilizarse teniendo especial cuidado.
Una situación en la que podrían ser útiles es cuando los dispositivos deben suscribirse a mensajes
con muchos temas distintos (por ejemplo si un dispositivo debe suscribirse a informes de sensores de
temperatura en varias ubicaciones).
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando como ID de cliente el nombre de objeto
del dispositivo y para suscribirse a un tema que tenga como prefijo el nombre del objeto, seguido de
room, seguido de cualquier cadena. (Se espera que estos temas sean, por ejemplo thing1/room1,
thing1/room2, etc.):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
165
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/
${iot:Connection.Thing.ThingName}/room*"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Receive"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/
${iot:Connection.Thing.ThingName}/room*"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando los ID de cliente client1, client2
y client3, y para suscribirse a un tema que tenga como prefijo el ID de cliente, seguido de room,
seguido de cualquier cadena. (Se espera que estos temas sean, por ejemplo client1/room1,
client1/room2, etc.):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/${iot:ClientId}/room*"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Receive"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/room*"
]
}
]
}
166
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Cuando especifique filtros de temas en políticas de AWS IoT Core para clientes MQTT, los caracteres
comodín "+" y "#" de MQTT se tratarán como caracteres literales. Su uso puede dar lugar a un
comportamiento inesperado.
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core con un ID de cliente que coincida con el nombre
del objeto y para suscribirse únicamente al filtro de temas some/+/topic:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/some/+/topic"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core con el ID de cliente client1 y para suscribirse
únicamente al filtro de temas some/+/topic:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/some/+/topic"
]
}
]
167
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
Note
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando el nombre de objeto del dispositivo como
ID de cliente y para suscribirse a los temas my/topic y my/othertopic:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic",
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/othertopic"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente
política concede permiso para conectarse a AWS IoT Core utilizando el ID de cliente client1 y para
suscribirse a los temas my/topic y my/othertopic:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
"Action": [
168
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic",
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/othertopic"
]
}
]
}
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando el nombre de objeto del dispositivo como
ID de cliente y para suscribirse a un tema único para dicho nombre de objeto o ID de cliente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/my/topic/
${iot:Thing.ThingName}"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando el ID de cliente client1 y para publicar
en un tema único para dicho ID de cliente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
169
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
]
}
]
}
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando como ID de cliente el nombre de objeto
del dispositivo y para publicar en cualquier tema que lleve como prefijo el nombre del objeto o cliente
excepto en el caso de un tema que termine por bar:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:Thing.ThingName}/*"
]
},
{
"Effect": "Deny",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:Thing.ThingName}/bar"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando como ID de cliente client1 y client1,
y para publicar en cualquier tema que lleve como prefijo el ID de cliente utilizado para conectarse,
excepto en el caso de un tema que termine por bar:
{
"Version": "2012-10-17",
"Statement": [
170
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/*"
]
},
{
"Effect": "Deny",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/bar"
]
}
]
}
Para los dispositivos registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core utilizando el nombre de objeto del dispositivo como
ID de cliente. El dispositivo se puede suscribir al tema my/topic, pero no puede publicar en <thing-
name> /bar, donde <thing-name> es el nombre del objeto de IoT que se conecta a AWS IoT Core:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic"
]
},
{
"Effect": "Deny",
"Action": [
171
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/${iot:Thing.ThingName}/bar"
]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente
política concede permiso para conectarse a AWS IoT Core utilizando el ID de cliente client1 y para
suscribirse al tema my/topic:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic"
]
}
]
}
Las variables de política de objeto también se sustituyen cuando se asocia un certificado o una Identidad
de Amazon Cognito autenticada a un objeto. La siguiente política concede permiso para conectarse
con AWS IoT Core con el ID del cliente client1 y para publicar y recibir el tema iotmonitor/
provisioning/987654321098. También permite que el titular del certificado se suscriba este tema.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Receive"
],
172
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/iotmonitor/
provisioning/987654321098"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/iotmonitor/
provisioning/987654321098"
]
}
]
}
Para las siguientes operaciones, AWS IoT Core utiliza políticas de AWS IoT Core asociadas a identidades
de Amazon Cognito (mediante la API AttachPolicy) para reducir el ámbito de los permisos asociados al
grupo de Identidad de Amazon Cognito con identidades autenticadas. Esto significa que una Identidad de
Amazon Cognito necesita el permiso de la política de rol de IAM asociada al grupo y la política de AWS IoT
Core asociada a la identidad de Identidad de Amazon Cognito mediante la API AttachPolicy de AWS
IoT Core.
• iot:Connect
• iot:Publish
• iot:Subscribe
• iot:Receive
• iot:GetThingShadow
• iot:UpdateThingShadow
• iot:DeleteThingShadow
Note
En el caso de otras operaciones de AWS IoT Core o de identidades sin autenticar, AWS IoT
Core no reduce el ámbito de los permisos asociados al rol del grupo de identidades de Amazon
Cognito. Para las identidades autenticadas y sin autenticar, esta es la política más permisiva que
recomendamos asociar al rol del grupo de Amazon Cognito.
HTTP
Para permitir que identidades de Amazon Cognito sin autenticar publiquen mensajes sobre HTTP en un
tema específico de Identidad de Amazon Cognito, asocie la política siguiente al rol de grupo de Identidad
de Amazon Cognito:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish",
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-
identity.amazonaws.com:sub}"]
}
173
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
]
}
Para permitir usuarios autenticados, asocie la política anterior al rol del grupo de Identidad de Amazon
Cognito y al Identidad de Amazon Cognito utilizando la API AttachPolicy de AWS IoT Core.
Note
Al autorizar identidades de Amazon Cognito, AWS IoT Core tendrá en cuenta ambas políticas y
concederá los mínimos privilegios especificados. Solo se permite una acción si ambas políticas
permiten la acción solicitada. Si una de ellas no permite una acción, esa acción no se autoriza.
MQTT
Para permitir que identidades de Amazon Cognito sin autenticar publiquen mensajes de MQTT sobre
WebSockets en un tema específico de Identidad de Amazon Cognito en su cuenta, asocie la política
siguiente al rol de grupo de Identidad de Amazon Cognito:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish",
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-
identity.amazonaws.com:sub}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Connect",
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/${cognito-
identity.amazonaws.com:sub}"]
}
]
}
Para permitir usuarios autenticados, asocie la política anterior al rol del grupo de Identidad de Amazon
Cognito y al Identidad de Amazon Cognito utilizando la API AttachPolicy de AWS IoT Core.
Note
Al autorizar identidades de Amazon Cognito, AWS IoT Core tendrá en cuenta ambas y concederá
los mínimos privilegios especificados. Solo se permite una acción si ambas políticas permiten la
acción solicitada. Si una de ellas no permite una acción, esa acción no se autoriza.
Para los dispositivos registrados en el registro de AWS IoT Core, la siguiente política concede permiso
para conectarse a AWS IoT Core con un ID de cliente que coincide con el nombre de objeto y para
suscribirse y recibir mensajes en el tema my/topic:
{
"Version": "2012-10-17",
"Statement": [
{
174
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Receive"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/my/topic"
]
}
]
}
Para los dispositivos no registrados en el registro de AWS IoT Core, la siguiente política concede
permiso para conectarse a AWS IoT Core con un ID de cliente client1 y para suscribirse y recibir
mensajes en un tema:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/client1"]
},
{
"Effect": "Allow",
"Action": [
"iot:Subscribe"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Receive"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/my/topic"
]
}
]
}
175
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action":["iot:Publish"],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/
${iot:Connection.Thing.ThingName}"]
},
{
"Effect": "Allow",
"Action": ["iot:Connect"],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
}
]
}
Para los dispositivos no registrados como objetos en el registro de AWS IoT Core, la siguiente política
concede permiso para conectarse a AWS IoT Core con un ID de cliente client1 y limita las publicaciones
del dispositivo a un tema de MQTT específico del ID de cliente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action":["iot:Publish"],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}"]
},
{
"Effect": "Allow",
"Action": ["iot:Connect"],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/client1"]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish"
176
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
}
]
}
Para los dispositivos no registrados en el registro de AWS IoT Core, la siguiente política concede permisos
para conectarse a AWS IoT Core con los ID de cliente client1, client2 y client3, y para publicar
en un tema cuyo nombre sea igual al certificateId del certificado que el dispositivo utilizó para
autenticarse:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
}
]
}
Para los dispositivos registrados en el registro de AWS IoT Core, la siguiente política concede permiso
para conectarse a AWS IoT Core con un ID de cliente que coincide con el nombre de objeto y para publicar
en un tema cuyo nombre sea igual al campo CommonName del sujeto del certificado que el dispositivo
utilizó para autenticarse:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/
${iot:Certificate.Subject.CommonName}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Connect"
177
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
}
]
}
Note
En este ejemplo, el nombre común del sujeto del certificado se utiliza como identificador de
tema, partiendo del supuesto de que el nombre común del sujeto es único para cada certificado
registrado. Si los certificados se comparten entre varios dispositivos, el nombre común del asunto
es el mismo para todos los dispositivos que comparten este certificado, lo que permite publicar
privilegios en el mismo tema desde varios dispositivos (no se recomienda).
Para los dispositivos no registrados en el registro de AWS IoT Core, la siguiente política concede permiso
para conectarse a AWS IoT Core con los ID de cliente client1, client2 y client3, y para publicar en
un tema cuyo nombre sea igual al campo CommonName del sujeto del certificado que el dispositivo utilizó
para autenticarse:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/
${iot:Certificate.Subject.CommonName}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
}
]
}
Note
En este ejemplo, el nombre común del sujeto del certificado se utiliza como identificador de
tema, partiendo del supuesto de que el nombre común del sujeto es único para cada certificado
registrado. Si los certificados se comparten entre varios dispositivos, el nombre común del asunto
es el mismo para todos los dispositivos que comparten este certificado, lo que permite publicar
privilegios en el mismo tema desde varios dispositivos (no se recomienda).
Para los dispositivos registrados en el registro de AWS IoT Core, la siguiente política concede permiso
para conectarse a AWS IoT Core con un ID de cliente que coincide con un nombre de objeto y para
publicar en un tema cuyo nombre tenga como prefijo admin/ cuando el certificado utilizado para autenticar
el dispositivo tenga el campo Subject.CommonName.2 definido en Administrator:
{
"Version": "2012-10-17",
"Statement": [
{
178
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
"Condition": {
"StringEquals": {
"iot:Certificate.Subject.CommonName.2": "Administrator"
}
}
}
]
}
Para los dispositivos no registrados en el registro de AWS IoT Core, la siguiente política concede permiso
para conectarse a AWS IoT Core con los ID de cliente client1, client2 y client3, y para publicar
en un tema cuyo nombre tenga como prefijo admin/ cuando el certificado utilizado para autenticar el
dispositivo tenga el campo Subject.CommonName.2 definido en Administrator:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
"Condition": {
"StringEquals": {
"iot:Certificate.Subject.CommonName.2": "Administrator"
}
}
}
]
}
Para los dispositivos registrados en el registro de AWS IoT Core, la siguiente política permite a un
dispositivo utilizar su nombre de objeto para publicar en un tema específico que consiste en admin/
seguido del ThingName cuando el certificado utilizado para autenticar el dispositivo tenga alguno de sus
campos Subject.CommonName establecido en Administrator:
{
"Version": "2012-10-17",
179
AWS IoT Guía del desarrollador
Políticas de AWS IoT Core
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/
${iot:Connection.Thing.ThingName}"],
"Condition": {
"ForAnyValue:StringEquals": {
"iot:Certificate.Subject.CommonName.List": "Administrator"
}
}
}
]
}
Para los dispositivos no registrados en el registro de AWS IoT Core, la siguiente política concede permiso
para conectarse a AWS IoT Core con los ID de cliente client1, client2 y client3, y para publicar en
el tema admin cuando el certificado utilizado para autenticar el dispositivo tenga alguno de sus campos
Subject.CommonName definido en Administrator:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1",
"arn:aws:iot:us-east-1:123456789012:client/client2",
"arn:aws:iot:us-east-1:123456789012:client/client3"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin"],
"Condition": {
"ForAnyValue:StringEquals": {
"iot:Certificate.Subject.CommonName.List": "Administrator"
}
}
}
]
}
180
AWS IoT Guía del desarrollador
Autorización de llamadas directas a los servicios de AWS
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":["iot:Connect"],
"Resource":[ "*" ],
"Condition": {
"Bool": {
"iot:Connection.Thing.IsAttached": ["true"]
}
}
}
]
}
Cuando la aplicación admite identidades de Amazon Cognito autenticadas, se especifica una política en
dos lugares. Se asocia una política de IAM al grupo de Identidad de Amazon Cognito autenticado y se
asocia una política de AWS IoT Core a la Identidad de Amazon Cognito. Se asocia una política de IAM a
un grupo de Identidad de Amazon Cognito mediante la consola de Identidad de Amazon Cognito al crear
un grupo de Identidad de Amazon Cognito. Para asociar una política de AWS IoT Core a una Identidad de
Amazon Cognito, debe definir una función de Lambda que llame AttachPolicy.
181
AWS IoT Guía del desarrollador
Autorización de llamadas directas a los servicios de AWS
1. El dispositivo de AWS IoT Core realiza una solicitud HTTPS al proveedor de credenciales para un token
de seguridad. La solicitud incluye el certificado X.509 del dispositivo para autenticación.
2. El proveedor de credenciales reenvía la solicitud al módulo de autenticación y autorización de AWS
IoT Core para validar el certificado y verificar que el dispositivo tiene permiso para solicitar el token de
seguridad.
3. Si el certificado es válido y tiene permiso para solicitar un token de seguridad, el módulo de
autenticación y autorización de AWS IoT Core indica que se ha realizado correctamente. De lo contrario,
envía una excepción al dispositivo.
4. Después de validar correctamente el certificado, el proveedor de credenciales invoca a AWS Security
Token Service (AWS STS) para asumir el rol de IAM que creó para el mismo.
5. AWS STS devuelve un token de seguridad temporal con privilegios limitados al proveedor de
credenciales.
6. El proveedor de credenciales devuelve el token de seguridad al dispositivo.
7. El dispositivo utiliza el token de seguridad para firmar una solicitud de AWS con AWS Signature Version
4.
8. El servicio solicitado invoca a IAM para validar la firma y autorizar la solicitud frente a políticas de
acceso asociadas al rol de IAM que creó para el proveedor de credenciales.
9. Si IAM valida la firma correctamente y autoriza la solicitud, la solicitud se realiza correctamente. De lo
contrario, IAM envía una excepción.
En la siguiente sección se describe cómo utilizar un certificado para obtener un token de seguridad. Se
ha escrito suponiendo que ya ha registrado un dispositivo y creado y activado su propio certificado para el
mismo.
182
AWS IoT Guía del desarrollador
Autorización de llamadas directas a los servicios de AWS
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"Service": "credentials.iot.amazonaws.com"},
"Action": "sts:AssumeRole"
}
}
Para cada servicio de AWS que desee llamar, adjunte una política de acceso al rol. El proveedor de
credenciales admite las siguientes variables de políticas:
• credentials-iot:ThingName
• credentials-iot:ThingTypeName
• credentials-iot:AwsCertificateId
Estas tres variables solo funcionan para las políticas de IAM, no para las políticas de AWS IoT Core.
2. Asegúrese de que el usuario que realiza el siguiente paso (la creación de un alias de rol) tiene permiso
para transferir a AWS IoT Core el rol que se acaba de crear. La política siguiente otorga permisos
iam:GetRole y iam:PassRole a un usuario de AWS. El permiso iam:GetRole permite al usuario
obtener información acerca del rol que acaba de crear. El permiso iam:PassRole permite al usuario
transmitir el rol a otro servicio de AWS.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole"
],
"Resource": "arn:aws:iam::your aws account id:role/your role name"
}
}
3. Crear un alias de rol de AWS IoT Core. El dispositivo que va a realizar llamadas directas a servicios de
AWS debe saber qué ARN de rol usar cuando se conecta a AWS IoT Core. La codificación de forma
rígida de un ARN de rol no es una buena solución, ya que requiere actualizar el dispositivo cada vez
que el ARN del rol cambia. Una solución mejor consiste en utilizar la API CreateRoleAlias para
crear un alias de rol que apunte al ARN del rol. Si el ARN del rol cambia, solo tiene que actualizar el
alias de rol. No es necesario realizar ningún cambio en el dispositivo. Esta API adopta los siguiente
parámetros:
183
AWS IoT Guía del desarrollador
Autorización de llamadas directas a los servicios de AWS
roleAlias
Obligatorio. Una cadena arbitraria que identifica el alias del rol. Sirve como clave principal en el
modelo de datos del alias de rol. Contiene 1-128 caracteres y debe incluir únicamente caracteres
alfanuméricos y los símbolos =, @ y -. Se permiten los caracteres alfabéticos en mayúsculas y
minúsculas.
roleArn
Obligatorio. El ARN del rol al que hace referencia el alias del rol.
credentialDurationInSeconds
Opcional. El tiempo (en segundos) que la credencial es válida. El valor mínimo es de 900
segundos (15 minutos). El valor máximo es de 3 600 segundos (60 minutos). El valor de
predeterminado es de 3600 segundos.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "iot:AssumeRoleWithCertificate",
"Resource": "arn:aws:iot:your region:your_aws_account_id:rolealias/your role
alias"
}
}
5. Realice una solicitud HTTPS al proveedor de credenciales para obtener un token de seguridad.
Proporcione la información siguiente:
• Certificado: dado que se trata de una solicitud HTTP a través de autenticación mutua de TLS, debe
proporcionar el certificado y la clave privada a su cliente al realizar la solicitud. Utilice el mismo
certificado y clave privada utilizados cuando registró su certificado con AWS IoT Core.
Para asegurarse de que un dispositivo se comunica con AWS IoT Core (y no con un servicio que lo
suplante), consulte Autenticación del servidor, siga los enlaces para descargar los certificados de
entidad de certificación apropiados y, a continuación, cópielos en el dispositivo.
• RoleAlias: el nombre del alias de rol que creó para el proveedor de credenciales.
• ThingName: el nombre de objeto que creó al registrar su objeto de AWS IoT Core. Esto se transfiere
como valor del encabezado HTTP x-amzn-iot-thingname. Este valor es obligatorio únicamente
si utiliza atributos de objetos como variables de política en políticas de AWS IoT Core o IAM.
Ejecute el siguiente comando en la AWS CLI para obtener el punto de enlace del proveedor de
credenciales para su cuenta de AWS. Para obtener más información sobre esta API, consulte
DescribeEndpoint.
184
AWS IoT Guía del desarrollador
Acceso entre cuentas
"endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your
region.amazonaws.com"
}
Utilice el punto de enlace para realizar una solicitud HTTPS al proveedor de credenciales para
devolver un token de seguridad. El ejemplo de comando siguiente utiliza curl, pero puede utilizar
cualquier cliente HTTP.
curl ‐‐cert your certificate --key your device certificate key pair -H "x-amzn-iot-
thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-
aliases/your role alias/credentials
Este comando devuelve un objeto de token de seguridad objeto que contiene un accessKeyId, una
secretAccessKey, un sessionToken y un vencimiento. El siguiente objeto de JSON es la salida de
ejemplo del comando curl.
En primer lugar, cree una política de IAM administrada por el cliente tal como se describe en Crear
políticas de IAM, como haría para otros usuarios y certificados en su cuenta de AWS.
Para los dispositivos registrados en el registro de AWS IoT Core, la siguiente política concede permiso a
los dispositivos para conectarse a AWS IoT Core utilizando un ID de cliente que coincide con el nombre de
objeto del dispositivo y para publicar en el tema my/topic/<thing-name> , donde <thing-name> es
el nombre de objeto del dispositivo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:client/
${iot:Connection.Thing.ThingName}"]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/my/topic/
${iot:Connection.Thing.ThingName}"],
}
185
AWS IoT Guía del desarrollador
Protección de los datos
]
}
Para los dispositivos no registrados en el registro de AWS IoT Core, la siguiente política concede permiso
a un dispositivo para utilizar el nombre de objeto client1 registrado en el registro de AWS IoT Core de su
cuenta (123456789012) para conectarse a AWS IoT Core y para publicar en un tema específico del ID de
cliente cuyo nombre lleva el prefijo my/topic/:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:client/client1"
]
},
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
]
}
]
}
A continuación, siga los pasos que se indican en Creación de un rol para delegar permisos a un usuario de
IAM. Especifique el ID de la cuenta de AWS con la que quiere compartir el acceso. A continuación, en el
último paso, asocie al rol la política que acaba de crear. Si posteriormente debe modificar el ID de cuenta
de AWS al que concede acceso, puede utilizar el siguiente formato de política de confianza:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:us-east-1:567890123456:user:MyUser"
},
"Action": "sts:AssumeRole",
}
]
}
186
AWS IoT Guía del desarrollador
Seguridad de transporte en AWS IoT
Para obtener más información sobre la protección de datos, consulte la entrada de blog relativa al modelo
de responsabilidad compartida de AWS y GDPR en el blog de seguridad de AWS.
Los dispositivos de AWS IoT recopilan datos, realizan alguna manipulación en dichos datos y, a
continuación, los envían a otro servicio web. Es posible que decida almacenar algunos datos en su
dispositivo durante un breve período de tiempo. Usted es responsable de proporcionar cualquier protección
de datos sobre dichos datos en reposo. Cuando el dispositivo le envía datos, AWS IoT lo hace a través de
una conexión TLS, como se explica más adelante en esta sección. Los dispositivos de AWS IoT pueden
enviar datos a cualquier servicio de AWS. Para obtener más información acerca de la seguridad de datos
de cada servicio, consulte la documentación de ese servicio. AWS IoT se puede configurar para escribir
registros en CloudWatch Logs y registrar llamadas a la API de AWS IoT en AWS CloudTrail. Para obtener
más información acerca de la seguridad de datos para estos servicios, consulte Autenticación y control de
acceso para Amazon CloudWatch y Cifrado de archivos de registro de CloudTrail con claves administradas
por AWS KMS.
Para MQTT, TLS cifra la conexión entre el dispositivo y el agente. AWS IoT utiliza la autenticación de
cliente de TLS para identificar los dispositivos. Para HTTP, TLS cifra la conexión entre el dispositivo y el
agente. La autenticación se delega a AWS Signature Version 4.
AWS IoT requiere que los dispositivos envíen la extensión Indicación de nombre de servidor (SNI) al
protocolo Transport Layer Security (TLS) y proporcionen la dirección completa del punto de enlace en el
campo host_name. El campo host_name debe contener el punto de enlace al que está llamando y debe
ser:
o bien
187
AWS IoT Guía del desarrollador
Cifrado de datos
Las conexiones que intenten realizar los dispositivos sin el valor de host_name correcto se rechazarán y
se registrarán en CloudWatch.
• ECDHE-ECDSA-AES128-GCM-SHA256 (recomendado)
• ECDHE-RSA-AES128-GCM-SHA256 (recomendado)
• ECDHE-ECDSA-AES128-SHA256
• ECDHE-RSA-AES128-SHA256
• ECDHE-ECDSA-AES128-SHA
• ECDHE-RSA-AES128-SHA
• ECDHE-ECDSA-AES256-GCM-SHA384
• ECDHE-RSA-AES256-GCM-SHA384
• ECDHE-ECDSA-AES256-SHA384
• ECDHE-RSA-AES256-SHA384
• ECDHE-RSA-AES256-SHA
• ECDHE-ECDSA-AES256-SHA
• AES128-GCM-SHA256
• AES128-SHA256
• AES128-SHA
• AES256-GCM-SHA384
• AES256-SHA256
• AES256-SHA
FreeRTOS proporciona una biblioteca PKCS #11 que resume el almacenamiento de claves, el acceso
a objetos criptográficos y la administración de sesiones. Es su responsabilidad utilizar esta biblioteca
para cifrar los datos en reposo en sus dispositivos. Para obtener más información, consulte https://
docs.aws.amazon.com/freertos/latest/userguide/security-pkcs.htmlBiblioteca de estándar de criptografía de
clave pública (PKCS) 11 de FreeRTOS
188
AWS IoT Guía del desarrollador
Administración de identidades y accesos
and-certificate de CLI, este devuelve el certificado y las claves. Usted es responsable de copiar el
certificado y la clave privada en su dispositivo y mantenerlos seguros.
Temas
• Público (p. 189)
• Autenticación con identidades de IAM (p. 189)
• Administración de acceso mediante políticas (p. 191)
• Funcionamiento de AWS IoT con IAM (p. 193)
• Ejemplos de políticas basadas en identidades de AWS IoT (p. 208)
• Solución de problemas de identidad y acceso en AWS IoT (p. 211)
Público
La forma en que utilice AWS Identity and Access Management (IAM) difiere, en función del trabajo que
realice en AWS IoT.
Usuario de servicio: si utiliza el servicio AWS IoT para realizar su trabajo, su administrador le proporciona
las credenciales y los permisos que necesita. A medida que utilice más características de AWS IoT
para realizar su trabajo, es posible que necesite permisos adicionales. Entender cómo se administra el
acceso puede ayudarle a solicitar los permisos correctos a su administrador. Si no puede acceder a una
característica en AWS IoT, consulte Solución de problemas de identidad y acceso en AWS IoT (p. 211).
Administrador de servicio: si está a cargo de los recursos de AWS IoT en su empresa, probablemente
tenga acceso completo a AWS IoT. Su trabajo consiste en determinar qué a características y recursos
de AWS IoT deben acceder sus empleados. A continuación, debe enviar solicitudes a su administrador
de IAM para cambiar los permisos de los usuarios de su servicio. Revise la información de esta página
para conocer los conceptos básicos de IAM. Para obtener más información sobre cómo su empresa puede
utilizar IAM con AWS IoT, consulte Funcionamiento de AWS IoT con IAM (p. 193).
Administrator de IAM: si es un administrador de IAM, es posible que quiera conocer información sobre
cómo escribir políticas para administrar el acceso a AWS IoT. Para ver ejemplos de políticas basadas en la
identidad de AWS IoT que puede utilizar en IAM, consulte Ejemplos de políticas basadas en identidades de
AWS IoT (p. 208).
La autenticación es la manera de iniciar sesión en AWS mediante credenciales de identidad. Para obtener
más información acerca del inicio de sesión con la Consola de administración de AWS, consulte La
consola de IAM y la página de inicio de sesión en la Guía del usuario de IAM.
Debe estar autenticado (haber iniciado sesión en AWS) como Usuario de la cuenta raíz de AWS, usuario
de IAM o asumiendo un rol de IAM. También puede utilizar la autenticación de inicio de sesión único de
189
AWS IoT Guía del desarrollador
Autenticación con identidades de IAM
su empresa o incluso iniciar sesión con Google o Facebook. En estos casos, su administrador habrá
configurado previamente la federación de identidad mediante roles de IAM. Cuando obtiene acceso a AWS
mediante credenciales de otra empresa, asume un rol indirectamente.
Para iniciar sesión directamente en la Consola de administración de AWS, use su contraseña con su
correo electrónico usuario raíz o su nombre de usuario de IAM. Puede obtener acceso a AWS mediante
programación utilizando sus claves de acceso usuario raíz o de usuario de IAM. AWS proporciona SDK y
herramientas de línea de comandos para firmar criptográficamente su solicitud con sus credenciales. Si no
utiliza las herramientas de AWS, debe firmar usted mismo la solicitud. Para ello, utilice Signature Version
4, un protocolo para autenticar solicitudes de API de entrada. Para obtener más información acerca de la
autenticación de solicitudes, consulte Proceso de firma Signature Version 4 en la AWS General Reference.
Independientemente del método de autenticación que utilice, es posible que también deba proporcionar
información de seguridad adicional. Por ejemplo, AWS le recomienda el uso de la autenticación multifactor
(MFA) para aumentar la seguridad de su cuenta. Para obtener más información, consulte Uso de Multi-
Factor Authentication (MFA) en AWS en la Guía del usuario de IAM.
Un grupo de IAM es una identidad que especifica un conjunto de usuarios de IAM. No puede iniciar sesión
como grupo. Puede usar los grupos para especificar permisos para varios usuarios a la vez. Los grupos
facilitan la administración de los permisos de grandes conjuntos de usuarios. Por ejemplo, podría tener un
grupo cuyo nombre fuese Administradores de IAM y conceder permisos a dicho grupo para administrar los
recursos de IAM.
Los usuarios son diferentes de los roles. Un usuario se asocia exclusivamente a una persona o aplicación,
pero la intención es que cualquier usuario pueda asumir un rol que necesite. Los usuarios tienen
credenciales permanentes a largo plazo y los roles proporcionan credenciales temporales. Para obtener
más información, consulte Cuándo crear un usuario de IAM (en lugar de un rol) en la Guía del usuario de
IAM.
Roles de IAM
Un rol de IAM es una entidad de la cuenta de AWS que dispone de permisos específicos. Es similar a
un usuario de IAM, pero no está asociado a una determinada persona. Puede asumir temporalmente un
rol de IAM en la Consola de administración de AWS cambiando de roles. Puede asumir un rol llamando
a una operación de la AWS CLI o de la API de AWS, o utilizando una URL personalizada. Para obtener
más información acerca de los métodos para el uso de roles, consulte Uso de roles de IAM en la Guía del
usuario de IAM.
190
AWS IoT Guía del desarrollador
Administración de acceso mediante políticas
Los roles de IAM con credenciales temporales son útiles en las siguientes situaciones:
• Permisos de usuario temporales de IAM: un usuario de IAM puede asumir un rol de IAM para recibir
temporalmente permisos distintos que le permitan realizar una tarea concreta.
• Acceso de usuario federado: En lugar de crear un usuario de IAM, puede utilizar identidades existentes
de AWS Directory Service, del directorio de usuarios de la empresa o de un proveedor de identidades
web. A estas identidades se les llama usuarios federados. AWS asigna una función a un usuario
federado cuando se solicita acceso a través de un proveedor de identidad. Para obtener más
información acerca de los usuarios federados, consulte Usuarios federados y roles en la Guía del
usuario de IAM.
• Acceso entre cuentas: puede utilizar un rol de IAM para permitir que alguien (una entidad principal de
confianza) de otra cuenta obtenga acceso a los recursos de su cuenta. Los roles son la forma principal
de conceder acceso entre cuentas. Sin embargo, con algunos servicios de AWS, puede asociar una
política directamente a un recurso (en lugar de utilizar un rol como proxy). Para obtener información
acerca de la diferencia entre los roles y las políticas basadas en recursos para el acceso entre cuentas,
consulte Cómo los roles de IAM difieren de las políticas basadas en recursos en la Guía del usuario de
IAM.
• Acceso a servicios de AWS: Un rol de servicio es un rol de IAM que un servicio asume para realizar
acciones en su cuenta en su nombre. Al configurar algunos de los entornos de los servicios de AWS,
debe definir un rol que el servicio asumirá. Este rol de servicio debe incluir todos los permisos que
son necesarios para que el servicio pueda acceder a los recursos de AWS que necesita. Los roles de
servicio varían de servicio a servicio, pero muchos le permiten elegir sus permisos, siempre y cuando
se cumplan los requisitos documentados para dicho servicio. Los roles de servicio ofrecen acceso solo
dentro de su cuenta y no se pueden utilizar para otorgar acceso a servicios en otras cuentas. Puede
crear, modificar y eliminar un rol de servicio desde IAM. Por ejemplo, puede crear un rol que permita
a Amazon Redshift tener acceso a un bucket de Amazon S3 en su nombre y, a continuación, cargar
los datos de ese bucket en un clúster de Amazon Redshift. Para obtener más información, consulte
Creación de un rol para delegar permisos a un servicio de AWS en la Guía del usuario de IAM.
• Aplicaciones que se ejecutan en Amazon EC2: Puede utilizar un rol de IAM para administrar
credenciales temporales para las aplicaciones que se ejecutan en una instancia EC2 y realizan
solicitudes de la AWS CLI o la API de AWS. Es preferible hacerlo de este modo a almacenar claves de
acceso en la instancia EC2. Para asignar un rol de AWS a una instancia EC2 y ponerla a disposición de
todas las aplicaciones, cree un perfil de instancia asociado a la misma. Un perfil de instancia contiene el
rol y permite a los programas que se ejecutan en la instancia EC2 obtener credenciales temporales. Para
obtener más información, consulte Uso de un rol de IAM para conceder permisos a aplicaciones que se
ejecutan en instancias Amazon EC2 en la Guía del usuario de IAM.
Para obtener información acerca del uso de los roles de IAM, consulte Cuándo crear un rol de IAM (en vez
de un usuario) en la Guía del usuario de IAM.
Un administrador de IAM puede utilizar las políticas para especificar quién tiene acceso a los recursos de
AWS y qué acciones se pueden realizar en dichos recursos. Cada entidad de IAM (usuario o rol) comienza
sin permisos. En otras palabras, de forma predeterminada, los usuarios no pueden hacer nada, ni siquiera
cambiar sus propias contraseñas. Para conceder permiso a un usuario para hacer algo, el administrador
debe asociarle una política de permisos. O bien el administrador puede añadir al usuario a un grupo que
191
AWS IoT Guía del desarrollador
Administración de acceso mediante políticas
tenga los permisos necesarios. Cuando el administrador concede permisos a un grupo, todos los usuarios
de ese grupo obtienen los permisos.
Las políticas de IAM definen permisos para una acción independientemente del método que se utilice
para realizar la operación. Por ejemplo, suponga que dispone de una política que permite la acción
iam:GetRole. Un usuario con dicha política puede obtener información del usuario de la Consola de
administración de AWS, la AWS CLI o la API de AWS.
Las políticas basadas en identidad pueden clasificarse además como políticas insertadas o políticas
administradas. Las políticas insertadas se integran directamente en un único usuario, grupo o rol. Las
políticas administradas son políticas independientes que puede asociar a varios usuarios, grupos y roles
de su cuenta de AWS. Las políticas administradas incluyen las políticas administradas por AWS y las
políticas administradas por el cliente. Para obtener más información acerca de cómo elegir una política
administrada o una política insertada, consulte Elegir entre políticas administradas y políticas insertadas en
la Guía del usuario de IAM.
• Límites de permisos: un límite de permisos es una característica avanzada que le permite definir los
permisos máximos que una política basada en identidad puede conceder a una entidad de IAM (usuario
o rol de IAM). Puede establecer un límite de permisos para una identidad. Los permisos resultantes son
la intersección de las políticas basadas en identidades de la entidad y los límites de sus permisos. Las
políticas basadas en recursos que especifiquen el usuario o rol en el campo Principal no estarán
restringidas por el límite de permisos. Una denegación explícita en cualquiera de estas políticas anulará
el permiso. Para obtener más información acerca de los límites de permisos, consulte see Límites de
permisos para las entidades de IAM en la Guía del usuario de IAM.
• Políticas de control de servicios (SCP): las SCP son políticas de JSON que especifican los permisos
máximos para una organización o unidad organizativa (OU) en AWS Organizations. AWS Organizations
es un servicio que le permite agrupar y administrar de forma centralizada varias cuentas de AWS
192
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
que posee su negocio. Si habilita todas las funciones en una organización, entonces podrá aplicar
políticas de control de servicio (SCP) a una o todas sus cuentas. Una SCP limita los permisos para las
entidades de las cuentas de miembros, incluido cada Usuario de la cuenta raíz de AWS. Para obtener
más información acerca de Organizaciones y las SCP, consulte Funcionamiento de las SCP en la Guía
del usuario de AWS Organizations.
• Políticas de sesión: las políticas de sesión son políticas avanzadas que se pasan como parámetro
cuando se crea una sesión temporal mediante programación para un rol o un usuario federado. Los
permisos de la sesión resultantes son la intersección de las políticas basadas en identidades del rol y las
políticas de la sesión. Los permisos también pueden proceder de una política basada en recursos. Una
denegación explícita en cualquiera de estas políticas anulará el permiso. Para obtener más información,
consulte Políticas de sesión en la Guía del usuario de IAM.
Temas
• Políticas de IAM (p. 193)
• Políticas basadas en identidades de AWS IoT (p. 194)
• Políticas basadas en recursos de AWS IoT (p. 207)
• Autorización basada en etiquetas de AWS IoT (p. 208)
• Roles de IAM de AWS IoT: (p. 208)
Políticas de IAM
AWS IoT funciona con políticas de AWS IoT e IAM. En este tema solo se describen las políticas de IAM.
Para obtener más información, consulte Políticas de AWS IoT Core (p. 152). AWS Identity and Access
Management define una acción de política para cada operación que AWS IoT defina, incluidas las API de
plano de control y de plano de datos.
193
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
Acciones
El elemento Action de una política basada en la identidad de IAM describe la acción o las acciones
específicas que la política permitirá o denegará. Las acciones de la política generalmente tienen el mismo
nombre que la operación de API de AWS asociada. La acción se utiliza en una política para otorgar
permisos para realizar la operación asociada.
En la siguiente tabla se enumeran las acciones de IAM IoT, la API de AWS IoT asociada y el recurso que
manipula la acción.
194
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:AcceptCertificateTransfer
AcceptCertificateTransfer
arn:aws:iot:region:account-id:cert/cert-id
Note
iot:AddThingToThingGroup
AddThingToThingGroup
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
arn:aws:iot:region:account-id:thing/thing-name
iot:AssociateTargetsWithJob
AssociateTargetsWithJob
ninguno
o bien
arn:aws:iot:region:account-id:cert/cert-id
iot:AttachPrincipalPolicy
AttachPrincipalPolicy arn:aws:iot:region:account-id:cert/cert-id
iot:AttachSecurityProfile
AttachSecurityProfile arn:aws:iot:región:ID-cuenta:securityprofile/nombre-
perfil-seguridad
arn:aws:iot:región:ID-cuenta:dimension/nombre-
dimensión
iot:AttachThingPrincipal
AttachThingPrincipal arn:aws:iot:region:account-id:cert/cert-id
iot:CancelCertificateTransfer
CancelCertificateTransfer
arn:aws:iot:region:account-id:cert/cert-id
Note
iot:CancelJobExecution
CancelJobExecution arn:aws:iot:region:account-id:job/job-id
arn:aws:iot:region:account-id:thing/thing-name
iot:ClearDefaultAuthorizer
ClearDefaultAuthorizer
Ninguno
iot:CreateCertificateFromCsr
CreateCertificateFromCsr
*
iot:CreateKeysAndCertificate
CreateKeysAndCertificate
*
iot:CreatePolicy CreatePolicy *
195
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:CreatePolicyVersion
CreatePolicyVersion arn:aws:iot:region:account-id:policy/policy-name
Note
arn:aws:iot:region:account-id:rolealias/role-alias-
name
iot:CreateSecurityProfile
CreateSecurityProfilearn:aws:iot:región:ID-cuenta:securityprofile/nombre-
perfil-seguridad
arn:aws:iot:región:ID-cuenta:dimension/nombre-
dimensión
iot:CreateThingGroupCreateThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DeleteCACertificate
DeleteCACertificate arn:aws:iot:region:account-id:cacert/cert-id
iot:DeleteJobExecution
DeleteJobExecution arn:aws:iot:region:account-id:job/job-id
arn:aws:iot:region:account-id:thing/thing-name
iot:DeletePolicyVersion
DeletePolicyVersion arn:aws:iot:region:account-id:policy/policy-name
iot:DeleteRegistrationCode
DeleteRegistrationCode
*
196
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:DeleteSecurityProfile
DeleteSecurityProfile arn:aws:iot:región:ID-cuenta:securityprofile/nombre-
perfil-seguridad
arn:aws:iot:región:ID-cuenta:dimension/nombre-
dimensión
iot:DeleteThingGroupDeleteThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DeleteV2LoggingLevel
DeleteV2LoggingLevel
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DeprecateThingType
DeprecateThingType arn:aws:iot:region:account-id:thingtype/thing-type-
name
iot:DescribeAuthorizerDescribeAuthorizer arn:aws:iot:region:account-id:authorizer/authorizer-
function-name
(parámetro: authorizerName)
ninguno
iot:DescribeCACertificate
DescribeCACertificatearn:aws:iot:region:account-id:cacert/cert-id
iot:DescribeCertificateDescribeCertificate arn:aws:iot:region:account-id:cert/cert-id
iot:DescribeDefaultAuthorizer
DescribeDefaultAuthorizer
Ninguno
iot:DescribeEndpoint DescribeEndpoint *
iot:DescribeEventConfigurations
DescribeEventConfigurations
ninguno
iot:DescribeJobExecution
DescribeJobExecutionNinguno
iot:DescribeRoleAliasDescribeRoleAlias arn:aws:iot:region:account-id:rolealias/role-alias-
name
iot:DescribeThingGroup
DescribeThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DescribeThingRegistrationTask
DescribeThingRegistrationTask
Ninguno
iot:DescribeThingTypeDescribeThingType arn:aws:iot:region:account-id:thingtype/thing-type-
name
197
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
o bien
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DetachPrincipalPolicy
DetachPrincipalPolicyarn:aws:iot:region:account-id:cert/cert-id
iot:DetachSecurityProfile
DetachSecurityProfilearn:aws:iot:región:ID-cuenta:securityprofile/nombre-
perfil-seguridad
arn:aws:iot:región:ID-cuenta:dimension/nombre-
dimensión
iot:DetachThingPrincipal
DetachThingPrincipalarn:aws:iot:region:account-id:cert/cert-id
iot:GetEffectivePolicies
GetEffectivePolicies arn:aws:iot:region:account-id:cert/cert-id
iot:GetIndexingConfiguration
GetIndexingConfiguration
Ninguno
iot:GetLoggingOptionsGetLoggingOptions *
iot:GetRegistrationCode
GetRegistrationCode *
iot:ListAttachedPolicies
ListAttachedPolicies arn:aws:iot:region:account-id:thinggroup/thing-group-
name
o bien
arn:aws:iot:region:account-id:cert/cert-id
iot:ListCACertificates ListCACertificates *
iot:ListCertificates ListCertificates *
iot:ListCertificatesByCA
ListCertificatesByCA *
iot:ListJobExecutionsForJob
ListJobExecutionsForJob
Ninguno
iot:ListJobExecutionsForThing
ListJobExecutionsForThing
Ninguno
198
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:ListOutgoingCertificates
ListOutgoingCertificates
*
iot:ListPolicies ListPolicies *
iot:ListPolicyPrincipalsListPolicyPrincipals arn:aws:iot:region:account-id:policy/policy-name
iot:ListPolicyVersionsListPolicyVersions arn:aws:iot:region:account-id:policy/policy-name
iot:ListPrincipalPolicies
ListPrincipalPolicies arn:aws:iot:region:account-id:cert/cert-id
iot:ListPrincipalThingsListPrincipalThings arn:aws:iot:region:account-id:cert/cert-id
iot:ListTargetsForPolicy
ListTargetsForPolicy arn:aws:iot:region:account-id:policy/policy-name
iot:ListThingGroupsForThing
ListThingGroupsForThing
arn:aws:iot:region:account-id:thing/thing-name
iot:ListThingPrincipalsListThingPrincipals arn:aws:iot:region:account-id:thing/thing-name
iot:ListThingRegistrationTaskReports
ListThingRegistrationTaskReports
Ninguno
iot:ListThingRegistrationTasks
ListThingRegistrationTasks
Ninguno
iot:ListThingTypes ListThingTypes *
iot:ListThings ListThings *
iot:ListThingsInThingGroup
ListThingsInThingGroup
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:ListTopicRules ListTopicRules *
iot:ListV2LoggingLevels
ListV2LoggingLevels Ninguno
iot:RegisterCACertificate
RegisterCACertificate*
iot:RegisterCertificateRegisterCertificate *
iot:RejectCertificateTransfer
RejectCertificateTransfer
arn:aws:iot:region:account-id:cert/cert-id
iot:RemoveThingFromThingGroup
RemoveThingFromThingGroup
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
arn:aws:iot:region:account-id:thing/thing-name
iot:ReplaceTopicRuleReplaceTopicRule arn:aws:iot:region:account-id:rule/rule-name
199
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:SetDefaultAuthorizer
SetDefaultAuthorizer arn:aws:iot:region:account-id:authorizer/authorizer-
function-name
iot:SetDefaultPolicyVersion
SetDefaultPolicyVersion
arn:aws:iot:region:account-id:policy/policy-name
iot:SetLoggingOptionsSetLoggingOptions arn:aws:iot:region:account-id:role/role-name
iot:SetV2LoggingLevelSetV2LoggingLevel arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:SetV2LoggingOptions
SetV2LoggingOptionsarn:aws:iot:region:account-id:role/role-name
iot:StartThingRegistrationTask
StartThingRegistrationTask
Ninguno
iot:StopThingRegistrationTask
StopThingRegistrationTask
Ninguno
iot:TestInvokeAuthorizer
TestInvokeAuthorizerNinguno
iot:TransferCertificateTransferCertificate arn:aws:iot:region:account-id:cert/cert-id
iot:UpdateCACertificate
UpdateCACertificate arn:aws:iot:region:account-id:cacert/cert-id
iot:UpdateEventConfigurations
UpdateEventConfigurations
Ninguno
iot:UpdateIndexingConfiguration
UpdateIndexingConfiguration
Ninguno
iot:UpdateSecurityProfile
UpdateSecurityProfilearn:aws:iot:región:ID-cuenta:securityprofile/nombre-
perfil-seguridad
arn:aws:iot:región:ID-cuenta:dimension/nombre-
dimensión
iot:UpdateThingGroupUpdateThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:UpdateThingGroupsForThing
UpdateThingGroupsForThing
arn:aws:iot:region:account-id:thing/thing-name
Las acciones de políticas de AWS IoT utilizan el siguiente prefijo antes de la acción: iot:. Por ejemplo,
para conceder a alguien permiso para obtener una lista de todos los objetos de IoT registrados en su
cuenta de AWS con la API ListThings, debe incluir la acción iot:ListThings en su política. Las
instrucciones de política deben incluir un elemento NotAction o Action. AWS IoT define su propio
conjunto de acciones que describen las tareas que se pueden realizar con este servicio.
200
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
Para especificar varias acciones en una única instrucción, sepárelas con comas del siguiente modo:
"Action": [
"ec2:action1",
"ec2:action2"
Puede utilizar caracteres comodín para especificar varias acciones (*). Por ejemplo, para especificar todas
las acciones que comiencen con la palabra Describe, incluya la siguiente acción:
"Action": "iot:Describe*"
Para ver una lista de acciones de AWS IoT, consulte Actions Defined by AWS IoT en la Guía del usuario
de IAM.
Recursos
El elemento Resource especifica el objeto u objetos a los que se aplica la acción. Las instrucciones deben
contener un elemento Resource o NotResource. Especifique un recurso con un ARN o el carácter
comodín (*) para indicar que la instrucción se aplica a todos los recursos.
iot:AcceptCertificateTransfer
AcceptCertificateTransfer
arn:aws:iot:region:account-id:cert/cert-id
Note
iot:AddThingToThingGroup
AddThingToThingGroup
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
arn:aws:iot:region:account-id:thing/thing-name
iot:AssociateTargetsWithJob
AssociateTargetsWithJob
ninguno
o bien
arn:aws:iot:region:account-id:cert/cert-id
iot:AttachPrincipalPolicy
AttachPrincipalPolicy arn:aws:iot:region:account-id:cert/cert-id
iot:AttachThingPrincipal
AttachThingPrincipal arn:aws:iot:region:account-id:cert/cert-id
iot:CancelCertificateTransfer
CancelCertificateTransfer
arn:aws:iot:region:account-id:cert/cert-id
Note
iot:CancelJobExecution
CancelJobExecution arn:aws:iot:region:account-id:job/job-id
201
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:ClearDefaultAuthorizer
ClearDefaultAuthorizer
Ninguno
iot:CreateCertificateFromCsr
CreateCertificateFromCsr
*
iot:CreateKeysAndCertificate
CreateKeysAndCertificate
*
iot:CreatePolicy CreatePolicy *
CreatePolicyVersion iot:CreatePolicyVersion
arn:aws:iot:region:account-id:policy/policy-name
Note
arn:aws:iot:region:account-id:rolealias/role-alias-
name
iot:CreateThingGroupCreateThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DeleteCACertificate
DeleteCACertificate arn:aws:iot:region:account-id:cacert/cert-id
iot:DeleteJobExecution
DeleteJobExecution arn:aws:iot:region:account-id:job/job-id
arn:aws:iot:region:account-id:thing/thing-name
iot:DeletePolicyVersion
DeletePolicyVersion arn:aws:iot:region:account-id:policy/policy-name
iot:DeleteRegistrationCode
DeleteRegistrationCode
*
202
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:DeleteThingGroupDeleteThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DeleteV2LoggingLevel
DeleteV2LoggingLevel
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DeprecateThingType
DeprecateThingType arn:aws:iot:region:account-id:thingtype/thing-type-
name
iot:DescribeAuthorizerDescribeAuthorizer arn:aws:iot:region:account-id:authorizer/authorizer-
function-name
(parámetro: authorizerName)
ninguno
iot:DescribeCACertificate
DescribeCACertificatearn:aws:iot:region:account-id:cacert/cert-id
iot:DescribeCertificateDescribeCertificate arn:aws:iot:region:account-id:cert/cert-id
iot:DescribeDefaultAuthorizer
DescribeDefaultAuthorizer
Ninguno
iot:DescribeEndpoint DescribeEndpoint *
iot:DescribeEventConfigurations
DescribeEventConfigurations
ninguno
iot:DescribeJobExecution
DescribeJobExecutionNinguno
iot:DescribeRoleAliasDescribeRoleAlias arn:aws:iot:region:account-id:rolealias/role-alias-
name
iot:DescribeThingGroup
DescribeThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DescribeThingRegistrationTask
DescribeThingRegistrationTask
Ninguno
iot:DescribeThingTypeDescribeThingType arn:aws:iot:region:account-id:thingtype/thing-type-
name
203
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
o bien
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:DetachPrincipalPolicy
DetachPrincipalPolicyarn:aws:iot:region:account-id:cert/cert-id
iot:DetachThingPrincipal
DetachThingPrincipalarn:aws:iot:region:account-id:cert/cert-id
iot:GetEffectivePolicies
GetEffectivePolicies arn:aws:iot:region:account-id:cert/cert-id
iot:GetIndexingConfiguration
GetIndexingConfiguration
Ninguno
iot:GetLoggingOptionsGetLoggingOptions *
iot:GetRegistrationCode
GetRegistrationCode *
iot:ListAttachedPolicies
ListAttachedPolicies arn:aws:iot:region:account-id:thinggroup/thing-group-
name
o bien
arn:aws:iot:region:account-id:cert/cert-id
iot:ListCACertificates ListCACertificates *
iot:ListCertificates ListCertificates *
iot:ListCertificatesByCA
ListCertificatesByCA *
iot:ListJobExecutionsForJob
ListJobExecutionsForJob
Ninguno
iot:ListJobExecutionsForThing
ListJobExecutionsForThing
Ninguno
iot:ListOutgoingCertificates
ListOutgoingCertificates
*
204
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:ListPolicies ListPolicies *
iot:ListPolicyPrincipalsListPolicyPrincipals arn:aws:iot:region:account-id:policy/policy-name
iot:ListPolicyVersionsListPolicyVersions arn:aws:iot:region:account-id:policy/policy-name
iot:ListPrincipalPolicies
ListPrincipalPolicies arn:aws:iot:region:account-id:cert/cert-id
iot:ListPrincipalThingsListPrincipalThings arn:aws:iot:region:account-id:cert/cert-id
iot:ListTargetsForPolicy
ListTargetsForPolicy arn:aws:iot:region:account-id:policy/policy-name
iot:ListThingGroupsForThing
ListThingGroupsForThing
arn:aws:iot:region:account-id:thing/thing-name
iot:ListThingPrincipalsListThingPrincipals arn:aws:iot:region:account-id:thing/thing-name
iot:ListThingRegistrationTaskReports
ListThingRegistrationTaskReports
Ninguno
iot:ListThingRegistrationTasks
ListThingRegistrationTasks
Ninguno
iot:ListThingTypes ListThingTypes *
iot:ListThings ListThings *
iot:ListThingsInThingGroup
ListThingsInThingGroup
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:ListTopicRules ListTopicRules *
iot:ListV2LoggingLevels
ListV2LoggingLevels Ninguno
iot:RegisterCACertificate
RegisterCACertificate*
iot:RegisterCertificateRegisterCertificate *
iot:RejectCertificateTransfer
RejectCertificateTransfer
arn:aws:iot:region:account-id:cert/cert-id
iot:RemoveThingFromThingGroup
RemoveThingFromThingGroup
arn:aws:iot:region:account-id:thinggroup/thing-group-
name
arn:aws:iot:region:account-id:thing/thing-name
iot:ReplaceTopicRuleReplaceTopicRule arn:aws:iot:region:account-id:rule/rule-name
iot:SetDefaultAuthorizer
SetDefaultAuthorizer arn:aws:iot:region:account-id:authorizer/authorizer-
function-name
iot:SetDefaultPolicyVersion
SetDefaultPolicyVersion
arn:aws:iot:region:account-id:policy/policy-name
iot:SetLoggingOptionsSetLoggingOptions arn:aws:iot:region:account-id:role/role-name
205
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
iot:SetV2LoggingLevelSetV2LoggingLevel arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:SetV2LoggingOptions
SetV2LoggingOptionsarn:aws:iot:region:account-id:role/role-name
iot:StartThingRegistrationTask
StartThingRegistrationTask
Ninguno
iot:StopThingRegistrationTask
StopThingRegistrationTask
Ninguno
iot:TestInvokeAuthorizer
TestInvokeAuthorizerNinguno
iot:TransferCertificateTransferCertificate arn:aws:iot:region:account-id:cert/cert-id
iot:UpdateCACertificate
UpdateCACertificate arn:aws:iot:region:account-id:cacert/cert-id
iot:UpdateEventConfigurations
UpdateEventConfigurations
Ninguno
iot:UpdateIndexingConfiguration
UpdateIndexingConfiguration
Ninguno
iot:UpdateThingGroupUpdateThingGroup arn:aws:iot:region:account-id:thinggroup/thing-group-
name
iot:UpdateThingGroupsForThing
UpdateThingGroupsForThing
arn:aws:iot:region:account-id:thing/thing-name
Para obtener más información acerca del formato de los ARN, consulte Nombres de recursos de Amazon
(ARN) y espacios de nombres de servicios de AWS.
Algunas acciones de AWS IoT, como las empleadas para la creación de recursos, no se pueden llevar a
cabo en un recurso específico. En dichos casos, debe utilizar el carácter comodín (*).
"Resource": "*"
Para ver una lista de los tipos de recursos de AWS IoT y sus ARN, consulte Resources Defined by AWS
IoT en la Guía del usuario de IAM. Para obtener información acerca de con qué acciones puede especificar
los ARN de cada recurso, consulte Actions Defined by AWS IoT.
Claves de condición
El elemento Condition (o bloque de Condition) permite especificar condiciones en las que entra en
vigor una instrucción. El elemento Condition es opcional. Puede crear expresiones condicionales que
utilizan operadores de condición, tales como igual o menor que, para que coincida la condición de la
política con valores de la solicitud.
Si especifica varios elementos de Condition en una instrucción o varias claves en un único elemento de
Condition, AWS las evalúa mediante una operación AND lógica. Si especifica varios valores para una
206
AWS IoT Guía del desarrollador
Funcionamiento de AWS IoT con IAM
única clave de condición, AWS evalúa la condición con una operación lógica OR. Se deben cumplir todas
las condiciones antes de que se concedan los permisos de la instrucción.
También puede utilizar variables de marcador de posición al especificar condiciones. Por ejemplo, puede
conceder un permiso de usuario de IAM para acceder a un recurso solo si está etiquetado con su nombre
de usuario de IAM. Para obtener más información, consulte Elementos de la política de IAM: Variables y
etiquetas en la Guía del usuario de IAM.
AWS IoT define su propio conjunto de claves de condición y también admite el uso de algunas claves de
condición globales. Para ver todas las claves de condición globales de AWS, consulte Claves de contexto
de condición globales de AWS en la Guía del usuario de IAM.
Para ver una lista de claves de condición de AWS IoT, consulte Condition Keys for AWS IoT en la Guía del
usuario de IAM. Para obtener más información acerca de las acciones y los recursos con los que puede
utilizar una clave de condición, consulte Actions Defined by AWS IoT.
Ejemplos
Para ver ejemplos de políticas basadas en identidad de AWS IoT, consulte Ejemplos de políticas basadas
en identidades de AWS IoT (p. 208).
AWS IoT no admite las políticas basadas en recursos de IAM. Sin embargo, admite políticas basadas en
los recursos de AWS IoT.
207
AWS IoT Guía del desarrollador
Ejemplos de políticas basadas en identidades
Para ver un ejemplo de política basada en la identidad para limitar el acceso a un recurso basado
en las etiquetas de dicho recurso, consulte Visualización de recursos de AWS IoT basados en
etiquetas (p. 210).
Roles de servicio
Esta característica permite que un servicio asuma un rol de servicio en nombre de usted. Este rol permite
que el servicio obtenga acceso a los recursos de otros servicios para completar una acción en su nombre.
Los roles de servicio aparecen en su cuenta de IAM y son propiedad de la cuenta. Esto significa que un
administrador de IAM puede cambiar los permisos de este rol. Sin embargo, hacerlo podría deteriorar la
funcionalidad del servicio.
Para obtener más información acerca de cómo crear una política basada en identidad de IAM con estos
documentos de políticas de JSON de ejemplo, consulte Creación de políticas en la pestaña JSON en la
Guía del usuario de IAM.
208
AWS IoT Guía del desarrollador
Ejemplos de políticas basadas en identidades
Temas
• Prácticas recomendadas relativas a políticas (p. 209)
• Mediante la consola de AWS IoT (p. 209)
• Permitir a los usuarios consultar sus propios permisos (p. 209)
• Visualización de recursos de AWS IoT basados en etiquetas (p. 210)
• Introducción sobre el uso de políticas administradas de AWS: para comenzar a utilizar AWS IoT
rápidamente, utilice las políticas administradas de AWS para proporcionar a los empleados los permisos
necesarios. Estas políticas ya están disponibles en su cuenta y las mantiene y actualiza AWS. Para
obtener más información, consulte Introducción sobre el uso de permisos con políticas administradas de
AWS en la Guía del usuario de IAM.
• Conceder privilegios mínimos: al crear políticas personalizadas, conceda solo los permisos necesarios
para llevar a cabo una tarea. Comience con un conjunto mínimo de permisos y conceda permisos
adicionales según sea necesario. Por lo general, es más seguro que comenzar con permisos que son
demasiado tolerantes e intentar hacerlos más severos más adelante. Para obtener más información,
consulte Conceder privilegios mínimos en la Guía del usuario de IAM.
• Habilitar MFA para operaciones confidenciales: para mayor seguridad, obligue a los usuarios de
IAM a que utilicen la autenticación multifactor (MFA) para acceder a recursos u operaciones de API
confidenciales. Para obtener más información, consulte Uso de Multi-Factor Authentication (MFA) en
AWS en la Guía del usuario de IAM.
• Utilizar condiciones de política para mayor seguridad: en la medida en que sea práctico, defina las
condiciones en las que sus políticas basadas en identidad permitan el acceso a un recurso. Por ejemplo,
puede escribir condiciones para especificar un rango de direcciones IP permitidas desde el que debe
proceder una solicitud. También puede escribir condiciones para permitir solicitudes solo en un intervalo
de hora o fecha especificado o para solicitar el uso de SSL o MFA. Para obtener más información,
consulte Elementos de la política de JSON de IAM: condición en la Guía del usuario de IAM.
Para asegurarse de que esas entidades puedan seguir usando la consola de AWS IoT, asocie también
la política administrada de AWS siguiente a las entidades AWSIoTFullAccess. Para obtener más
información, consulte Adición de permisos a un usuario en la Guía del usuario de IAM:
No es necesario que conceda permisos mínimos para la consola a los usuarios que solo realizan llamadas
a la AWS CLI o a la API de AWS. En su lugar, permite acceso únicamente a las acciones que coincidan
con la operación de API que intenta realizar.
209
AWS IoT Guía del desarrollador
Ejemplos de políticas basadas en identidades
permisos para llevar a cabo esta acción en la consola o mediante programación con la AWS CLI o la API
de AWS.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ViewOwnUserInfo",
"Effect": "Allow",
"Action": [
"iam:GetUserPolicy",
"iam:ListGroupsForUser",
"iam:ListAttachedUserPolicies",
"iam:ListUserPolicies",
"iam:GetUser"
],
"Resource": ["arn:aws:iam::*:user/${aws:username}"]
},
{
"Sid": "NavigateInConsole",
"Effect": "Allow",
"Action": [
"iam:GetGroupPolicy",
"iam:GetPolicyVersion",
"iam:GetPolicy",
"iam:ListAttachedGroupPolicies",
"iam:ListGroupPolicies",
"iam:ListPolicyVersions",
"iam:ListPolicies",
"iam:ListUsers"
],
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBillingGroupsInConsole",
"Effect": "Allow",
"Action": "iot:ListBillingGroups",
"Resource": "*"
},
{
"Sid": "ViewBillingGroupsIfOwner",
"Effect": "Allow",
"Action": "iot:DescribeBillingGroup",
"Resource": "arn:aws:iot:*:*:billinggroup/*",
"Condition": {
"StringEquals": {"aws:ResourceTag/Owner": "${aws:username}"}
}
}
210
AWS IoT Guía del desarrollador
Solución de problemas
]
}
También puede adjuntar esta política al usuario de IAM en su cuenta. Si un usuario llamado richard-
roe intenta ver un grupo de facturación de AWS IoT, el grupo de facturación debe estar etiquetado como
Owner=richard-roe o como owner=richard-roe. De lo contrario, se le deniega el acceso. La clave
de la etiqueta de condición Owner coincide con los nombres de las claves de condición Owner y owner
porque no distinguen entre mayúsculas y minúsculas. Para obtener más información, consulte Elementos
de la política de JSON de IAM: condición en la Guía del usuario de IAM.
Temas
• No tengo autorización para realizar una acción en AWS IoT (p. 211)
• No tengo autorización para realizar la operación iam:PassRole (p. 211)
• Quiero ver mis claves de acceso (p. 212)
• Soy administrador y deseo permitir que otros obtengan acceso a AWS IoT (p. 212)
• Quiero permitir a personas externas a mi cuenta de AWS el acceso a mis recursos de AWS
IoT (p. 212)
En el siguiente ejemplo, el error se produce cuando el usuario de IAM, mateojackson, intenta utilizar la
consola para ver detalles sobre una cosa, pero no tiene permisos iot:DescribeThing.
En este caso, Mateo pide a su administrador que actualice sus políticas de forma que pueda obtener
acceso al recurso MyIoTThing mediante la acción iot:DescribeThing.
Algunos servicios de AWS le permiten transferir un rol existente a dicho servicio en lugar de crear un nuevo
rol de servicio o uno vinculado al servicio. Para ello, debe tener permisos para transferir el rol al servicio.
En el siguiente ejemplo, el error se produce cuando un usuario de IAM denominado marymajor intenta
utilizar la consola para realizar una acción en AWS IoT. Sin embargo, la acción requiere que el servicio
cuente con permisos otorgados por un rol de servicio. Mary no tiene permisos para transferir el rol al
servicio.
211
AWS IoT Guía del desarrollador
Solución de problemas
En este caso, Mary pide a su administrador que actualice sus políticas para que pueda realizar la acción
iam:PassRole.
Las claves de acceso se componen de dos partes: un ID de clave de acceso (por ejemplo,
AKIAIOSFODNN7EXAMPLE) y una clave de acceso secreta (por ejemplo, wJalrXUtnFEMI/K7MDENG/
bPxRfiCYEXAMPLEKEY). El ID de clave de acceso y la clave de acceso secreta se utilizan juntos, como un
nombre de usuario y contraseña, para autenticar sus solicitudes. Administre sus claves de acceso con el
mismo nivel de seguridad que para el nombre de usuario y la contraseña.
Important
No proporcione las claves de acceso a terceras personas, ni siquiera para que le ayuden a buscar
el ID de usuario canónico. Si lo hace, podría conceder a otra persona acceso permanente a su
cuenta.
Cuando cree un par de claves de acceso, se le pide que guarde el ID de clave de acceso y la clave de
acceso secreta en un lugar seguro. La clave de acceso secreta solo está disponible en el momento de su
creación. Si pierde la clave de acceso secreta, debe añadir nuevas claves de acceso a su usuario de IAM.
Puede tener un máximo de dos claves de acceso. Si ya cuenta con dos, debe eliminar un par de claves
antes de crear uno nuevo. Para ver las instrucciones, consulte Administración de las claves de acceso en
la Guía del usuario de IAM.
Para comenzar de inmediato, consulte Creación del primer grupo y usuario delegado de IAM en la Guía del
usuario de IAM.
• Para obtener información acerca de si AWS IoT admite estas características, consulte Funcionamiento
de AWS IoT con IAM (p. 193).
• Para aprender cómo proporcionar acceso a sus recursos en cuentas de AWS de su propiedad, consulte
Proporcionar acceso a un usuario de IAM a otra cuenta de AWS de la que es propietario en la Guía del
usuario de IAM.
212
AWS IoT Guía del desarrollador
Registro y monitorización
• Para obtener información acerca de cómo ofrecer acceso a sus recursos a cuentas de AWS de terceros,
consulte Proporcionar acceso a las cuentas de AWS propiedad de terceros en la Guía del usuario de
IAM.
• Para obtener información acerca de cómo ofrecer acceso a la identidad federada, consulte Proporcionar
acceso a usuarios autenticados externamente (identidad federada) en la Guía del usuario de IAM.
• Para obtener información acerca de la diferencia entre utilizar los roles y las políticas basadas en
recursos para el acceso entre cuentas, consulte Cómo los roles de IAM difieren de las políticas basadas
en recursos en la Guía del usuario de IAM.
Registro y monitorización
La monitorización es una parte importante del mantenimiento de la fiabilidad, la disponibilidad y el
rendimiento de AWS IoT; y sus soluciones de AWS. Debe recopilar datos de monitorización de todas las
partes de su solución de AWS para que le resulte más sencillo depurar cualquier error que se produzca en
distintas partes del código, en caso de que ocurra. Para obtener información sobre los procedimientos de
registro y monitoreo, consulte Monitorización de AWS IoT (p. 220)
Antes de empezar a monitorizar AWS IoT, debe crear un plan de monitorización que incluya respuestas a
las siguientes preguntas:
Herramientas de monitorización
AWS proporciona herramientas que puede utilizar para monitorizar AWS IoT. Puede configurar algunas de
estas herramientas para que realicen la monitorización por usted. Algunas de las herramientas requieren
intervención manual. Le recomendamos que automatice las tareas de monitorización en la medida de lo
posible.
• Amazon CloudWatch Alarms (Alarmas de Amazon CloudWatch): observe una sola métrica durante
el periodo que especifique y realice una o varias acciones según el valor de la métrica relativo a un
determinado umbral durante varios periodos de tiempo. La acción es una notificación que se envía
a un tema de Amazon Simple Notification Service (Amazon SNS) o a una política de Amazon EC2
Auto Scaling. Las alarmas de CloudWatch no invocan acciones simplemente por tener un estado
determinado. El estado debe haber cambiado y debe mantenerse durante el número de periodos
especificado. Para obtener más información, consulte Monitoreo de alarmas y métricas de AWS IoT
mediante Amazon CloudWatch (p. 227).
• Amazon CloudWatch Logs: monitorice, almacene y obtenga acceso a los archivos de registro desde
AWS CloudTrail o de otras fuentes. Para obtener más información, consulte Monitoreo de AWS IoT
mediante CloudWatch Logs (p. 239). Para obtener más información acerca del uso de Amazon
CloudWatch, consulte Monitoreo de archivos de registro en la Guía del usuario de Amazon CloudWatch.
• Amazon CloudWatch Events –: seleccione los eventos y diríjalos a uno o varios flujos o funciones de
destino para realizar cambios, capturar información de estado y aplicar medidas correctivas. Para
obtener más información, consulte ¿Qué es Amazon CloudWatch Events? en la Guía del usuario de
Amazon CloudWatch.
• Monitorización de registros de AWS CloudTrail: compartir archivos de registro entre cuentas, monitorizar
archivos de registro de CloudTrail en tiempo real mediante su envío a CloudWatch Logs, escribir
aplicaciones de procesamiento de registros en Java y validar que sus archivos de registro no hayan
cambiado después de que CloudTrail los entregue. Para obtener más información, consulte Registre las
213
AWS IoT Guía del desarrollador
Validación de la conformidad
llamadas a la API de AWS IoT con AWS CloudTrail. (p. 257) y también Uso de archivos de registro de
CloudTrail en la AWS CloudTrail User Guide.
Para obtener una lista de los servicios de AWS en el ámbito de programas de conformidad específicos,
consulte Servicios de AWS en el ámbito del programa de conformidad. Para obtener información general,
consulte Programas de conformidad de AWS.
Puede descargar los informes de auditoría de terceros utilizando AWS Artifact. Para obtener más
información, consulte la sección Descarga de informes en AWS Artifact.
214
AWS IoT Guía del desarrollador
Resiliencia
• AWS Security Hub – Este servicio de AWS ofrece una vista integral de su estado de seguridad en
AWS que le ayuda a comprobar la conformidad con las normas del sector de seguridad y las prácticas
recomendadas.
Para obtener más información sobre zonas de disponibilidad y las regiones de AWS, consulte
Infraestructura global de AWS.
AWS IoT Core guarda la información sobre los dispositivos en el registro de dispositivos. También
almacena certificados de CA, certificados de dispositivo y datos de sombra de dispositivos. Estos datos no
se replican automáticamente si se producen errores de hardware o de red. AWS IoT Core publica eventos
MQTT cuando se actualiza el registro de un dispositivo. Puede utilizar estos mensajes para realizar una
copia de seguridad de los datos del registro y guardarlos en algún lugar, como una tabla de DynamoDB.
Usted es responsable de guardar los certificados que AWS IoT Core cree para usted o los que cree usted
mismo. La sombra del dispositivo almacena datos de estado sobre sus dispositivos y se pueden volver a
enviar cuando un dispositivo vuelve a conectarse.
Los recursos de AWS IoT Core son específicos de la región y no se replican entre regiones de AWS a
menos que lo haga específicamente.
Puede utilizar llamadas a la API publicadas en AWS para obtener acceso a AWS IoT a través de la red.
Los clientes deben ser compatibles con Transport Layer Security (TLS) 1.2 o una versión posterior. Los
clientes también deben ser compatibles con conjuntos de cifrado con confidencialidad directa total (PFS)
tales como Ephemeral Diffie-Hellman (DHE) o Elliptic Curve Ephemeral Diffie-Hellman (ECDHE). La
mayoría de los sistemas modernos, como Java 7 y posteriores, son compatibles con estos modos. Para
obtener más información, consulte Seguridad de transporte en AWS IoT (p. 187).
Las solicitudes deben estar firmadas mediante un ID de clave de acceso y una clave de acceso secreta
que esté asociada a una entidad principal de IAM. También puede utilizar AWS Security Token Service
(AWS STS) para generar credenciales de seguridad temporales para firmar solicitudes.
215
AWS IoT Guía del desarrollador
Prácticas recomendadas de seguridad
configuración de la flota sea compleja y propensa a errores. Y dado que los dispositivos a menudo están
limitados en potencia informática, memoria y capacidades de almacenamiento, esto limita el uso del cifrado
y otras formas de seguridad en los propios dispositivos. Además, los dispositivos a menudo usan software
con vulnerabilidades conocidas. Estos factores hacen que las flotas de IoT sean un objetivo atractivo para
los piratas informáticos y dificultan la protección continuada de la flota de dispositivos.
AWS IoT Device Defender afronta estos desafíos proporcionando herramientas para identificar los
problemas de seguridad y las desviaciones de las prácticas recomendadas. Puede utilizar AWS IoT Device
Defender para analizar, auditar y supervisar los dispositivos conectados para detectar comportamientos
anómalos y mitigar los riesgos de seguridad. AWS IoT Device Defender puede auditar las flotas de
dispositivos para asegurarse de que cumplan con las prácticas recomendadas de seguridad y detecten
un comportamiento anómalo en los dispositivos. Esto posibilita aplicar políticas de seguridad coherentes
en toda su flota de dispositivos AWS IoT y responder rápidamente cuando los dispositivos sufren ataques.
Para obtener más información, consulte AWS IoT Device Defender (p. 580).
• Su caso de uso (por ejemplo, los datos que los dispositivos envían a AWS IoT, la cantidad de datos y la
frecuencia con la que se envían).
• Su configuración de cliente MQTT (por ejemplo, configuración de reconexión automática,
temporizaciones de interrupción asociadas y uso de sesiones persistentes de MQTT (p. 278)).
• Las restricciones de recursos de dispositivos.
• La causa principal de las desconexiones, su agresividad y persistencia.
Para evitar conflictos del ID de cliente y sus posibles efectos negativos, asegúrese de que cada dispositivo
o aplicación móvil tiene una política de AWS IoT o IAM que restrinja qué identificadores de cliente pueden
usarse en conexiones de MQTT con el agente de mensajes de AWS IoT. Por ejemplo, puede usar una
política de IAM para evitar que un dispositivo cierre por error la conexión de otro dispositivo utilizando un ID
de cliente que ya está en uso. Para obtener más información, consulte Autorización (p. 151).
Todos los dispositivos de la flota deben tener credenciales con privilegios que autoricen únicamente las
acciones previstas; por ejemplo, acciones MQTT de AWS IoT, como la publicación de mensajes o la
216
AWS IoT Guía del desarrollador
Protección de conexiones MQTT en AWS IoT
suscripción a temas con un ámbito y un contexto específicos. Las políticas de permisos específicas pueden
variar en función de los casos de uso. Identifique las políticas de permisos que se ajusten mejor a sus
requisitos empresariales y de seguridad.
Para simplificar la creación y la administración de políticas de permisos, puede utilizar Variables de las
políticas de AWS IoT Core (p. 155) y Variables de las políticas de IAM. Las variables de la política
se pueden colocar en una política y cuando se evalúa la política las variables se sustituyen por valores
procedentes de la solicitud del dispositivo. Al usar variables de la política, puede crear una única
política para la concesión de permisos a varios dispositivos. Puede identificar las variables de la política
relevantes para su caso de uso en función de su configuración de la cuenta de AWS IoT, el mecanismo
de autenticación y el protocolo de red utilizado en la conexión al agente de mensajes de AWS IoT. Sin
embargo, para escribir las mejores políticas de permisos, deben tenerse en cuenta los detalles concretos
de su caso de uso y el modelo de amenazas.
Por ejemplo, si ha registrado los dispositivos en el registro de AWS IoT (p. 6), puede utilizar variables
de la política de objetos (p. 156) en las políticas de AWS IoT para conceder o denegar permisos en
función de las propiedades de un objeto, como el nombre o el tipo de objeto, o los valores de atributo
del objeto. El nombre del objeto se obtiene a partir del ID de cliente del mensaje de MQTT Connect que
se envía cuando un objeto se conecta a AWS IoT. Las variables de la política de objeto se sustituyen
cuando un objeto se conecta con AWS IoT sobre MQTT empleando la autenticación mutua de TLS o
MQTT sobre WebSocket mediante identidades de Amazon Cognito autenticadas. Puede usar la API
AttachThingPrincipal para asociar certificados e identidades de Amazon Cognito autenticadas a un objeto.
iot:Connection.Thing.ThingName es una variable de política de objetos útil para forzar la aplicación
de las restricciones del ID de cliente. La siguiente política de AWS IoT de ejemplo requiere un nombre
del objeto registrado que se va a utilizar como el ID de cliente para las conexiones MQTT al agente de
mensajes de AWS IoT:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":"iot:Connect",
"Resource":[
"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
]
}
]
}
Si desea identificar conflictos de ID de cliente en curso, puede habilitar y utilizar CloudWatch Logs para
AWS IoT (p. 239). Por cada conexión MQTT que el agente de mensajes de AWS IoT desconecta debido
a conflictos de ID de cliente, se genera un registro parecido a lo siguiente:
{
"timestamp": "2019-04-28 22:05:30.105",
"logLevel": "ERROR",
"traceId": "02a04a93-0b3a-b608-a27c-1ae8ebdb032a",
"accountId": "123456789012",
"status": "Failure",
"eventType": "Disconnect",
"protocol": "MQTT",
"clientId": "clientId01",
"principalId": "1670fcf6de55adc1930169142405c4a2493d9eb5487127cd0091ca0193a3d3f6",
"sourceIp": "203.0.113.1",
"sourcePort": 21335,
"reason": "DUPLICATE_CLIENT_ID",
"details": "A new connection was established with the same client ID"
}
217
AWS IoT Guía del desarrollador
Mantener sincronizado el reloj del dispositivo
Puede utilizar AWS IoT Device Defender para identificar políticas de AWS IoT e IAM demasiado
permisivas. AWS IoT Device Defender también ofrece una comprobación de auditoría que le notifica si
varios dispositivos en la flota se conecta al agente de mensajes de AWS IoT con el mismo ID de cliente.
Véase también
• AWS IoT Core
En la mayoría de los sistemas, esto significa que el software del dispositivo debe incluir un cliente NTP
(Protocolo de tiempo de red). El dispositivo debe esperar hasta que se sincronice con un servidor NTP
antes de intentar conectarse a AWS IoT Core. Si esto no es posible, el sistema debería proporcionar un
mecanismo para que el usuario establezca la hora del dispositivo, de forma que las conexiones posteriores
se realicen correctamente.
Una vez que el dispositivo se haya sincronizado con un servidor NTP, podrá abrir una conexión con AWS
IoT Core. La cantidad de sesgo de reloj permitida dependerá de lo que esté tratando de hacer con la
conexión.
218
AWS IoT Guía del desarrollador
Usar una identidad única por dispositivo
para AWS IoT por una autoridad de certificación de confianza que verificó nuestra identidad y propiedad
del dominio.
Una de las primeras cosas que AWS IoT Core hace cuando se conecta un dispositivo es enviar al
dispositivo un certificado de servidor. Los dispositivos pueden comprobar que estaban esperando para
conectarse a iot.amazonaws.com y que el servidor al final de dicha conexión posee un certificado de
una autoridad de confianza para ese dominio.
Los certificados TLS tienen formato X.509 e incluyen información diversa, como el nombre de la
organización, la ubicación, el nombre de dominio y un período de validez. El período de validez se
especifica como un par de valores de tiempo llamados notBefore y notAfter. Algunos servicios como
AWS IoT Core utilizan períodos de validez limitados (por ejemplo, un año) para los certificados de servidor
y comienzan a proporcionar otros nuevos antes de que caduquen los antiguos.
Por ejemplo, suponga que tiene una aplicación que se compone de un dispositivo de teléfono móvil que
recibe actualizaciones de estado de dos objetos inteligentes del hogar diferentes: una bombilla y un
termostato. La bombilla envía el estado de su nivel de batería y el termostato envía mensajes que informan
de la temperatura.
AWS IoT autentica los dispositivos por separado y trata cada conexión individualmente. Puede aplicar
controles de acceso detallados a través de políticas de autorización. Puede definir una política para
el termostato que le permita publicar en un espacio de tema. Puede definir una política independiente
para la bombilla que le permita publicar en un espacio de tema diferente. Por último, puede definir una
política para la aplicación móvil que solo le permita conectarse y suscribirse a los temas del termostato y la
bombilla para recibir mensajes de estos dispositivos.
Aplique el principio de privilegios mínimos y amplíe los permisos por dispositivo tanto como sea posible.
Todos los dispositivos o usuarios deben tener una política de AWS IoT en AWS IoT que solo les permita
conectarse con un ID de cliente conocido, así como publicar y suscribirse a un conjunto de temas
identificado y fijo.
219
AWS IoT Guía del desarrollador
Le recomendamos encarecidamente que recopile datos de monitoreo de todas las partes de su solución
de AWS para que le resulte más sencillo depurar cualquier error que se produzca en distintas partes del
código, en caso de que ocurra. Comience por crear un plan de monitoreo que responda a las siguientes
preguntas. Si no está seguro de cómo responderlas, puede continuar habilitando el registro (p. 221) y
estableciendo las líneas base de rendimiento.
El siguiente paso consiste en habilitar el registro (p. 221) y establecer un punto de referencia de
rendimiento de AWS IoT normal en el entorno midiendo el rendimiento varias veces y bajo distintas
condiciones de carga. A medida que monitorea AWS IoT, mantenga los datos de monitoreo históricos para
que pueda compararlos con los datos de rendimiento actuales. Esto le ayudará a identificar patrones de
rendimiento normales y anomalías de rendimiento, así como a idear métodos para abordarlos.
Para establecer el rendimiento previsto para AWS IoT, debe monitorear estas métricas para comenzar.
Siempre puede monitorear más métricas más adelante.
Los temas de esta sección pueden ayudarle a iniciar el registro y el monitoreo de AWS IoT.
Temas
• Configuración de registros de AWS IoT (p. 221)
• Monitoreo de alarmas y métricas de AWS IoT mediante Amazon CloudWatch (p. 227)
• Monitoreo de AWS IoT mediante CloudWatch Logs (p. 239)
• Registre las llamadas a la API de AWS IoT con AWS CloudTrail. (p. 257)
220
AWS IoT Guía del desarrollador
Configuración de registros de AWS IoT
Puede habilitar el registro para todo AWS IoT o solo para grupos de objetos específicos. Puede configurar
el registro de AWS IoT mediante la consola de AWS IoT, la CLI o la API; sin embargo, debe usar la CLI o
la API para configurar el registro para grupos de objetos específicos.
Antes de habilitar el registro de AWS IoT, asegúrese de comprender bien los permisos de acceso
a CloudWatch Logs. Los usuarios con acceso a CloudWatch Logs podrán consultar la información
de depuración desde sus dispositivos. Para obtener más información, consulte Autenticación y
control de acceso de Amazon CloudWatch Logs.
1. En el panel de navegación, seleccione Roles (Roles) y, a continuación, seleccione Create role (Crear
rol).
2. En Seleccionar tipo de entidad de confianza, elija Servicio de AWS, IoT.
3. En Select your use case (Seleccione su caso de uso), elija IoT y, a continuación, Next: Permissions
(Siguiente: Permisos).
4. En la página que muestra las políticas que se asocian automáticamente al rol de servicio, elija Next:
Tags (Siguiente: Etiquetas).
5. Elija Next: Review.
6. Escriba un Nombre de rol y una Descripción de rol para el rol y, a continuación, elija Crear rol.
7. En la lista de Roles, busque el rol que creó, ábralo y copie el ARN del rol (<logging-role-arn>)
para utilizarlo más adelante.
221
AWS IoT Guía del desarrollador
Configure el registro predeterminado en AWS IoT (consola)
Note
Política de roles:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:PutMetricFilter",
"logs:PutRetentionPolicy"
],
"Resource": [
"*"
]
}
]
}
Política de confianza:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Para usar la consola de AWS IoT para configurar el registro predeterminado para todo AWS IoT
1. Inicie sesión en la consola de AWS IoT. Para obtener más información, consulte Inicie sesión en la
consola de AWS IoT. (p. 5).
2. En el panel de navegación izquierdo, elija Configuración. En la sección Registros de la página
Configuración, elija Editar.
La sección Registros muestra el rol de registro y el nivel de detalle utilizado por todo AWS IoT.
222
AWS IoT Guía del desarrollador
Configurar el registro predeterminado en AWS IoT (CLI)
3. En la página Configurar ajustes del rol, elija el Nivel de detalle que describe el nivel de
detalle (p. 226) de las entradas de registro que desea que aparezcan en los registros de
CloudWatch.
4. Elija Seleccionar para especificar un rol que creó en Creación de un rol de registro (p. 221) o Crear
rol para crear un nuevo rol para utilizarlo para registro.
5. Elija Actualizar para guardar los cambios.
223
AWS IoT Guía del desarrollador
Configurar el registro predeterminado en AWS IoT (CLI)
Note
Necesita el nombre de recurso de Amazon (ARN) del rol que desea utilizar. Si necesita crear un
rol para usar en el registro, consulte Creación de un rol de registro (p. 221) antes de continuar.
La entidad principal que se utiliza para realizar la llamada a la API debe tener Transmisión de los
permisos de rol (p. 287) para el rol de registro.
También puede realizar este procedimiento con la API utilizando los métodos de la API de AWS que
corresponden a los comandos CLI que se muestran aquí.
Para usar la CLI para configurar el registro predeterminado para AWS IoT
1. Utilice el comando set-v2-logging-options para establecer las opciones de registro para su cuenta.
donde:
--role-arn
El ARN de rol que concede permiso a AWS IoT para escribir en los registros CloudWatch Logs.
--default-log-level
El nivel de registro (p. 226) que se debe usar. Los valores válidos son: ERROR, WARN, INFO,
DEBUG o DISABLED
--no-disable-all-logs
Un parámetro opcional que habilita todo el registro de AWS IoT. Utilice este parámetro para
habilitar el registro cuando esté deshabilitado actualmente.
--disable-all-logs
Un parámetro opcional que deshabilita todo el registro de AWS IoT. Utilice este parámetro para
deshabilitar el registro cuando esté habilitado actualmente.
2. Utilice el comando get-v2-logging-options para obtener las opciones de registro actuales.
AWS IoT sigue siendo compatible con los comandos más antiguos (set-logging-options y get-
logging-options) para establecer y obtener el registro global en su cuenta. Tenga en cuenta
que, cuando se utilizan estos comandos, los registros resultantes contienen texto sin formato,
en lugar de cargas JSON y que la latencia de registro normalmente es mayor. No se realizarán
mejoras en la implementación de estos comandos más antiguos. Le recomendamos que utilice las
versiones "v2" para configurar las opciones de registro y, cuando sea posible, que modifique las
aplicaciones heredadas que utilizan las versiones más antiguas.
224
AWS IoT Guía del desarrollador
Configurar el inicio de sesión específico
de recursos en AWS IoT (CLI)
Los grupos de objetos pueden contener otros grupos de objetos para crear una relación jerárquica. Este
procedimiento describe cómo configurar el registro de un solo grupo de objetos. Puede aplicar este
procedimiento al grupo de objetos principal de una jerarquía para configurar el registro de todos los grupos
de objetos de la jerarquía. También puede aplicar este procedimiento a un grupo de objetos secundario
para anular la configuración de registro de su principal.
Note
Necesita el nombre de recurso de Amazon (ARN) del rol que desea utilizar. Si necesita crear un
rol para usar en el registro, consulte Creación de un rol de registro (p. 221) antes de continuar.
La entidad principal que se utiliza para realizar la llamada a la API debe tener Transmisión de los
permisos de rol (p. 287) para el rol de registro.
También puede realizar este procedimiento con la API utilizando los métodos de la API de AWS que
corresponden a los comandos CLI que se muestran aquí.
Para usar la CLI para configurar el registro específico de recursos para AWS IoT
1. Utilice el comando set-v2-logging-options para establecer las opciones de registro para su cuenta.
donde:
--role-arn
El ARN de rol que concede permiso a AWS IoT para escribir en los registros CloudWatch Logs.
--default-log-level
El nivel de registro (p. 226) que se debe usar. Los valores válidos son: ERROR, WARN, INFO,
DEBUG o DISABLED
--no-disable-all-logs
Un parámetro opcional que habilita todo el registro de AWS IoT. Utilice este parámetro para
habilitar el registro cuando esté deshabilitado actualmente.
--disable-all-logs
Un parámetro opcional que deshabilita todo el registro de AWS IoT. Utilice este parámetro para
deshabilitar el registro cuando esté habilitado actualmente.
2. Utilice el comando set-v2-logging-level para configurar el registro específico de recursos para un grupo
de objetos.
225
AWS IoT Guía del desarrollador
Niveles de registro
--log-target
El tipo y nombre del recurso para el que está configurando el registro. El valor target_type
debe ser THING_GROUP. El valor del parámetro log-target puede ser texto, como se muestra en el
ejemplo de comando anterior, o una cadena JSON, como en el ejemplo siguiente.
--log-level
El nivel de registro utilizado cuando se generan registros para el recurso especificado. Los valores
válidos son: DEBUG, INFO, ERROR, WARN y DISABLED.
3. Utilice el comando list-v2-logging-levels para enumerar los niveles de registro configurados
actualmente.
--targetType
Niveles de registro
Estos niveles de registro determinan los eventos que se registran y se aplican a los niveles de registro
predeterminados y específicos de recursos.
ERROR
226
AWS IoT Guía del desarrollador
Monitoreo de alarmas y métricas de
AWS IoT mediante Amazon CloudWatch
Estos temas exploran algunas de las preguntas que podría tener en esta situación para comenzar.
• ¿Cómo se me puede enviar una notificación si mis objetos no se conectan correctamente cada
día? (p. 228)
• ¿Cómo se me puede enviar una notificación si mis objetos no publican datos cada día? (p. 229)
• ¿Cómo se me puede enviar una notificación si las actualizaciones de la sombra de mi objeto se
rechazan cada día? (p. 229)
227
AWS IoT Guía del desarrollador
Creación de alarmas de CloudWatch en AWS IoT
En los temas siguientes se describen algunos ejemplos del uso de alarmas de CloudWatch.
• ¿Cómo se me puede enviar una notificación si mis objetos no se conectan correctamente cada
día? (p. 228)
• ¿Cómo se me puede enviar una notificación si mis objetos no publican datos cada día? (p. 229)
• ¿Cómo se me puede enviar una notificación si las actualizaciones de la sombra de mi objeto se
rechazan cada día? (p. 229)
Puede ver todas las métricas en las que las alarmas de CloudWatch pueden monitorear en Métricas y
dimensiones de AWS IoT (p. 230).
Para obtener más información sobre cómo crear una notificación de Amazon SNS, consulte
Introducción a Amazon SNS.
2. Cree la alarma.
3. Pruebe la alarma.
228
AWS IoT Guía del desarrollador
Creación de alarmas de CloudWatch en AWS IoT
Para obtener más información sobre cómo crear una notificación de Amazon SNS, consulte
Introducción a Amazon SNS.
2. Cree la alarma.
3. Pruebe la alarma.
Para obtener más información sobre cómo crear una notificación de Amazon SNS, consulte
Introducción a Amazon SNS.
2. Cree la alarma.
229
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
3. Pruebe la alarma.
Las métricas se agrupan en primer lugar por el espacio de nombres de servicio y, a continuación, por las
diversas combinaciones de dimensiones dentro de cada espacio de nombres.
230
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
Métricas de reglas
Métrica Descripción
Métrica Descripción
231
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
el nombre de la regla que especifica la acción. La
dimensión RuleName contiene el nombre de la regla que
especifica la acción. La dimensión ActionType contiene
el tipo de acción que se invocó.
Métrica Descripción
Métrica Descripción
232
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
233
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
234
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
Note
Las métricas del agente de mensajes se muestran en la consola de AWS IoT bajo Protocol
Metrics (Métricas del protocolo).
Métrica Descripción
Note
Las métricas de sombras de dispositivos se muestran en la consola de AWS IoT bajo Protocol
Metrics (Métricas del protocolo).
Métricas de trabajos
Métrica Descripción
235
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
por CloudWatch. Para obtener más información acerca
de las métricas de CloudWatch, consulte Métricas de
Amazon CloudWatch. La dimensión JobId contiene el
ID del trabajo.
236
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
Métrica Descripción
Métrica Descripción
237
AWS IoT Guía del desarrollador
Métricas y dimensiones de AWS IoT
Métrica Descripción
seguridad específico y de un comportamiento concreto
de un perfil de seguridad determinado.
Métrica Descripción
Dimensión Descripción
238
AWS IoT Guía del desarrollador
Monitoreo de AWS IoT mediante CloudWatch Logs
Dimensión Descripción
Para obtener más información acerca de CloudWatch Logs, consulte CloudWatch Logs. Para obtener
más información sobre los CloudWatch Logs admitidos para AWS IoT, consulte Entradas de registro de
CloudWatch en AWS IoT (p. 240).
También puede escribir una consulta en el cuadro de texto Filter events (Filtrar eventos). Aquí tiene
algunas consultas interesantes que probar:
• { $.logLevel = "INFO" }
Busque todos los registros que tengan un estado de Success y un tipo de evento de
GetThingShadow.
Para obtener más información acerca de la creación de expresiones de filtro, vea Consultas de
CloudWatch Logs.
239
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
Temas
• Entradas de registro del agente de mensajes (p. 240)
• Entradas de registro de sombre de dispositivo (p. 244)
• Entradas del registro del motor de reglas (p. 246)
• Entradas del registro de Job (p. 250)
• Entradas de registro de aprovisionamiento de dispositivos (p. 254)
• Entradas de registro de grupo de objetos dinámicos (p. 255)
• Atributos de CloudWatch Logs comunes (p. 256)
Temas
• Entrada de registro Connect (p. 240)
• Entrada de registro Disconnect (p. 241)
• Entrada de registro Publish-In (p. 241)
• Entrada de registro Publish-Out (p. 242)
• Entrada de registro Subscribe (p. 243)
{
"timestamp": "2017-08-10 15:37:23.476",
"logLevel": "INFO",
"traceId": "20b23f3f-d7f1-feae-169f-82263394fbdb",
"accountId": "123456789012",
"status": "Success",
"eventType": "Connect",
"protocol": "MQTT",
"clientId": "abf27092886e49a8a5c1922749736453",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"sourceIp": "205.251.233.181",
"sourcePort": 13490
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro Connect
contienen los siguientes atributos:
clientId
240
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
principalId
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
sourceIp
{
"timestamp": "2017-08-10 15:37:23.476",
"logLevel": "INFO",
"traceId": "20b23f3f-d7f1-feae-169f-82263394fbdb",
"accountId": "123456789012",
"status": "Success",
"eventType": "Disconnect",
"protocol": "MQTT",
"clientId": "abf27092886e49a8a5c1922749736453",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"sourceIp": "205.251.233.181",
"sourcePort": 13490
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro Disconnect
contienen los siguientes atributos:
clientId
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
sourceIp
241
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
{
"timestamp": "2017-08-10 15:39:30.961",
"logLevel": "INFO",
"traceId": "672ec480-31ce-fd8b-b5fb-22e3ac420699",
"accountId": "123456789012",
"status": "Success",
"eventType": "Publish-In",
"protocol": "MQTT",
"topicName": "$aws/things/MyThing/shadow/get",
"clientId": "abf27092886e49a8a5c1922749736453",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"sourceIp": "205.251.233.181",
"sourcePort": 13490
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro Publish-In
contienen los siguientes atributos:
clientId
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
sourceIp
{
"timestamp": "2017-08-10 15:39:30.961",
"logLevel": "INFO",
"traceId": "672ec480-31ce-fd8b-b5fb-22e3ac420699",
"accountId": "123456789012",
"status": "Success",
"eventType": "Publish-Out",
"protocol": "MQTT",
"topicName": "$aws/things/MyThing/shadow/get",
"clientId": "abf27092886e49a8a5c1922749736453",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"sourceIp": "205.251.233.181",
"sourcePort": 13490
242
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro Publish-Out
contienen los siguientes atributos:
clientId
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
sourceIp
{
"timestamp": "2017-08-10 15:39:04.413",
"logLevel": "INFO",
"traceId": "7aa5c38d-1b49-3753-15dc-513ce4ab9fa6",
"accountId": "123456789012",
"status": "Success",
"eventType": "Subscribe",
"protocol": "MQTT",
"topicName": "$aws/things/MyThing/shadow/#",
"clientId": "abf27092886e49a8a5c1922749736453",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"sourceIp": "205.251.233.181",
"sourcePort": 13490
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro Subscribe
contienen los siguientes atributos:
clientId
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
243
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
sourceIp
Temas
• Entrada de registro DeleteThingShadow (p. 244)
• Entrada de registro GetThingShadow (p. 244)
• Entrada de registro UpdateThingShadow (p. 245)
{
"timestamp": "2017-08-07 18:47:56.664",
"logLevel": "INFO",
"traceId": "1a60d02e-15b9-605b-7096-a9f584a6ad3f",
"accountId": "123456789012",
"status": "Success",
"eventType": "DeleteThingShadow",
"protocol": "MQTT",
"deviceShadowName": "Jack",
"topicName": "$aws/things/Jack/shadow/delete"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
DeleteThingShadow contienen los siguientes atributos:
deviceShadowName
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
244
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
{
"timestamp": "2017-08-09 17:56:30.941",
"logLevel": "INFO",
"traceId": "b575f19a-97a2-cf72-0ed0-c64a783a2504",
"accountId": "123456789012",
"status": "Success",
"eventType": "GetThingShadow",
"protocol": "MQTT",
"deviceShadowName": "MyThing",
"topicName": "$aws/things/MyThing/shadow/get"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro GetThingShadow
contienen los siguientes atributos:
deviceShadowName
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
{
"timestamp": "2017-08-07 18:43:59.436",
"logLevel": "INFO",
"traceId": "d0074ba8-0c4b-a400-69df-76326d414c28",
"accountId": "123456789012",
"status": "Success",
"eventType": "UpdateThingShadow",
"protocol": "MQTT",
"deviceShadowName": "Jack",
"topicName": "$aws/things/Jack/shadow/update"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
UpdateThingShadow contienen los siguientes atributos:
deviceShadowName
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
245
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
Temas
• Entrada de registro FunctionExecution (p. 246)
• Entrada de registro de RuleExecution (p. 247)
• Entrada de registro RuleMatch (p. 247)
• Entrada de registro RuleMessageThrottled (p. 248)
• Entrada de registro RuleNotFound (p. 249)
• Entrada de registro StartingRuleExecution (p. 250)
{
"timestamp": "2017-07-13 18:33:51.903",
"logLevel": "DEBUG",
"traceId": "180532b7-0cc7-057b-687a-5ca1824838f5",
"status": "Success",
"eventType": "FunctionExecution",
"clientId": "N/A",
"topicName":"rules/test",
"ruleName": "ruleTestPredict",
"ruleAction": "MachinelearningPredict",
"resources": {
"ModelId": "predict-model"
},
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
FunctionExecution contienen los siguientes atributos:
clientId
246
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
{
"timestamp": "2017-08-10 16:32:46.070",
"logLevel": "INFO",
"traceId": "30aa7ccc-1d23-0b97-aa7b-76196d83537e",
"accountId": "123456789012",
"status": "Success",
"eventType": "RuleExecution",
"clientId": "abf27092886e49a8a5c1922749736453",
"topicName": "rules/test",
"ruleName": "JSONLogsRule",
"ruleAction": "RepublishAction",
"resources": {
"RepublishTopic": "rules/republish"
},
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro RuleExecution
contienen los siguientes atributos:
clientId
{
"timestamp": "2017-08-10 16:32:46.002",
"logLevel": "INFO",
247
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
"traceId": "30aa7ccc-1d23-0b97-aa7b-76196d83537e",
"accountId": "123456789012",
"status": "Success",
"eventType": "RuleMatch",
"clientId": "abf27092886e49a8a5c1922749736453",
"topicName": "rules/test",
"ruleName": "JSONLogsRule",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro RuleMatch
contienen los siguientes atributos:
clientId
{
"timestamp": "2017-10-04 19:25:46.070",
"logLevel": "ERROR",
"traceId": "30aa7ccc-1d23-0b97-aa7b-76196d83537e",
"accountId": "123456789012",
"status": "Failure",
"eventType": "RuleMessageThrottled",
"clientId": "abf27092886e49a8a5c1922749736453",
"topicName": "$aws/rules/example_rule",
"ruleName": "example_rule",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"reason": "RuleExecutionThrottled",
"details": "Message for Rule example_rule throttled"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
RuleMessageThrottled contienen los siguientes atributos:
clientId
248
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
principalId
La cadena "RuleMessageThrottled".
ruleName
{
"timestamp": "2017-10-04 19:25:46.070",
"logLevel": "ERROR",
"traceId": "30aa7ccc-1d23-0b97-aa7b-76196d83537e",
"accountId": "123456789012",
"status": "Failure",
"eventType": "RuleNotFound",
"clientId": "abf27092886e49a8a5c1922749736453",
"topicName": "$aws/rules/example_rule",
"ruleName": "example_rule",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167",
"reason": "RuleNotFound",
"details": "Rule example_rule not found"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro RuleNotFound
contienen los siguientes atributos:
clientId
La cadena "RuleNotFound".
ruleName
249
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
{
"timestamp": "2017-08-10 16:32:46.002",
"logLevel": "DEBUG",
"traceId": "30aa7ccc-1d23-0b97-aa7b-76196d83537e",
"accountId": "123456789012",
"status": "Success",
"eventType": "StartingRuleExecution",
"clientId": "abf27092886e49a8a5c1922749736453",
"topicName": "rules/test",
"ruleName": "JSONLogsRule",
"ruleAction": "RepublishAction",
"principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro rule- contienen
los siguientes atributos:
clientId
Temas
• Entrada de registro DescribeJobExecution (p. 250)
• Entrada de registro GetPendingJobExecution (p. 251)
• Entrada de registro ReportFinalJobExecutionCount (p. 252)
• Entrada de registro StartNextPendingJobExecution (p. 252)
• Entrada de registro UpdateJobExecution (p. 253)
250
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
{
"timestamp": "2017-08-10 19:13:22.841",
"logLevel": "DEBUG",
"accountId": "123456789012",
"status": "Success",
"eventType": "DescribeJobExecution",
"protocol": "MQTT",
"clientId": "thingOne",
"jobId": "002",
"topicName": "$aws/things/thingOne/jobs/002/get",
"clientToken": "myToken",
"details": "The request status is SUCCESS."
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
GetJobExecution contienen los siguientes atributos:
clientId
Identificador único con distinción entre mayúsculas y minúsculas que permite garantizar la
idempotencia de la solicitud. Para obtener más información, consulte How to Ensure Idempotency.
details
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
{
"timestamp": "2018-06-13 17:45:17.197",
"logLevel": "DEBUG",
"accountId": "123456789012",
"status": "Success",
"eventType": "GetPendingJobExecution",
"protocol": "MQTT",
"clientId": "299966ad-54de-40b4-99d3-4fc8b52da0c5",
"topicName": "$aws/things/299966ad-54de-40b4-99d3-4fc8b52da0c5/jobs/get",
"clientToken": "24b9a741-15a7-44fc-bd3c-1ff2e34e5e82",
"details": "The request status is SUCCESS."
251
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
GetPendingJobExecution contienen los siguientes atributos:
clientId
Identificador único con distinción entre mayúsculas y minúsculas que permite garantizar la
idempotencia de la solicitud. Para obtener más información, consulte How to Ensure Idempotency.
details
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
{
"timestamp": "2017-08-10 19:44:16.776",
"logLevel": "INFO",
"accountId": "123456789012",
"status": "Success",
"eventType": "ReportFinalJobExecutionCount",
"jobId": "002",
"details": "Job 002 completed. QUEUED job execution count: 0 IN_PROGRESS job execution
count: 0 FAILED job execution count: 0 SUCCEEDED job execution count: 1 CANCELED job
execution count: 0 REJECTED job execution count: 0 REMOVED job execution count: 0"
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
ReportFinalJobExecutionCount contienen los siguientes atributos:
details
252
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
{
"timestamp": "2018-06-13 17:49:51.036",
"logLevel": "DEBUG",
"accountId": "123456789012",
"status": "Success",
"eventType": "StartNextPendingJobExecution",
"protocol": "MQTT",
"clientId": "95c47808-b1ca-4794-bc68-a588d6d9216c",
"topicName": "$aws/things/95c47808-b1ca-4794-bc68-a588d6d9216c/jobs/start-next",
"clientToken": "bd7447c4-3a05-49f4-8517-dd89b2c68d94",
"details": "The request status is SUCCESS."
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
StartNextPendingJobExecution contienen los siguientes atributos:
clientId
Identificador único con distinción entre mayúsculas y minúsculas que permite garantizar la
idempotencia de la solicitud. Para obtener más información, consulte How to Ensure Idempotency.
details
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
{
"timestamp": "2017-08-10 19:25:14.758",
"logLevel": "DEBUG",
"accountId": "123456789012",
"status": "Success",
"eventType": "UpdateJobExecution",
"protocol": "MQTT",
"clientId": "thingOne",
"jobId": "002",
"topicName": "$aws/things/thingOne/jobs/002/update",
"clientToken": "myClientToken",
"versionNumber": "1",
"details": "The destination status is IN_PROGRESS. The request status is SUCCESS."
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
UpdateJobExecution contienen los siguientes atributos:
253
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
clientId
Identificador único con distinción entre mayúsculas y minúsculas que permite garantizar la
idempotencia de la solicitud. Para obtener más información, consulte How to Ensure Idempotency.
details
El protocolo utilizado cuando se realiza la solicitud. Los valores válidos son MQTT o HTTP.
topicName
Temas
• Entrada de registro GetDeviceCredentials (p. 254)
• Entrada de registro de ProvisionDevice (p. 255)
{
"timestamp" : "2019-02-20 20:31:22.932",
"logLevel" : "INFO",
"traceId" : "8d9c016f-6cc7-441e-8909-7ee3d5563405",
"accountId" : "123456789101",
"status" : "Success",
"eventType" : "GetDeviceCredentials",
"deviceCertificateId" :
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"details" : "Additional details about this log."
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
GetDeviceCredentials contienen los siguientes atributos:
details
254
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
deviceCertificateId
{
"timestamp" : "2019-02-20 20:31:22.932",
"logLevel" : "INFO",
"traceId" : "8d9c016f-6cc7-441e-8909-7ee3d5563405",
"accountId" : "123456789101",
"status" : "Success",
"eventType" : "ProvisionDevice",
"provisioningTemplateName" : "myTemplate",
"deviceCertificateId" :
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"details" : "Additional details about this log."
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
ProvisionDevice contienen los siguientes atributos:
details
Temas
• Entrada de registro AddThingToDynamicThingGroupsFailed (p. 255)
255
AWS IoT Guía del desarrollador
Entradas de registro de CloudWatch en AWS IoT
Para obtener más información, consulte este artículo sobre las limitaciones y conflictos de los grupos de
objetos dinámicos (p. 114).
{
"timestamp": "2020-03-16 22:24:43.804",
"logLevel": "ERROR",
"traceId": "70b1f2f5-d95e-f897-9dcc-31e68c3e1a30",
"accountId": "571032923833",
"status": "Failure",
"eventType": "AddThingToDynamicThingGroupsFailed",
"thingName": "TestThing",
"dynamicThingGroupNames": [
"DynamicThingGroup11",
"DynamicThingGroup12",
"DynamicThingGroup13",
"DynamicThingGroup14"
],
"reason": "The thing failed to be added to the given dynamic thing group(s) because the
thing already belongs to the maximum allowed number of groups."
}
Además de Atributos de CloudWatch Logs comunes (p. 256), las entradas de registro
AddThingToDynamicThingGroupsFailed contienen los siguientes atributos:
dynamicThingGroupNames
Matriz de los grupos de objetos dinámicos a los que no pudo agregarse el objeto.
reason
accountId
Su ID de cuenta de AWS.
eventType
El tipo de evento para el que se generó el registro. El valor del tipo de evento depende del evento que
generó la entrada de registro. Cada descripción de entrada de registro incluye el valor de eventType
para esa entrada de registro.
logLevel
El nivel de registro que se está utilizando. Para obtener más información, consulte the section called
“Niveles de registro” (p. 226).
256
AWS IoT Guía del desarrollador
Registre las llamadas a la API de
AWS IoT con AWS CloudTrail.
status
El estado de la solicitud.
timestamp
La marca de tiempo de UNIX de cuando el cliente se conectó al agente de mensajes de AWS IoT.
traceId
Un identificador generado aleatoriamente que puede utilizarse para correlacionar todos los registros
para una solicitud específica.
Para obtener más información sobre CloudTrail, consulte la AWS CloudTrail User Guide.
Para mantener un registro continuo de los eventos de la cuenta de AWS, incluidos los eventos de AWS
IoT, cree un registro de seguimiento. Un registro de seguimiento permite a CloudTrail enviar archivos de
registro a un bucket de Amazon S3. De forma predeterminada, cuando se crea un registro de seguimiento
en la consola, este se aplica a todas las regiones de AWS. El registro de seguimiento registra los eventos
de todas las regiones de AWS de la partición de AWS y envía los archivos de registro al bucket de Amazon
S3 especificado. También puede configurar otros servicios de AWS para analizar y actuar según los datos
de eventos recopilados en los registros de CloudTrail. Para obtener más información, consulte:
Note
Las acciones del plano de datos (lado del dispositivo) de AWS IoT no se registran en CloudTrail.
Utilice CloudWatch para supervisar estas acciones.
257
AWS IoT Guía del desarrollador
Descripción de las entradas de
archivos de registro de AWS IoT
Las acciones del plano de control de AWS IoT las registra CloudTrail. Por ejemplo, las llamadas a las
secciones CreateThing, ListThings y ListTopicRules generan entradas en los archivos de registro de
CloudTrail.
Cada entrada de registro o evento contiene información acerca de quién generó la solicitud. La información
de identidad del usuario le ayuda a determinar lo siguiente:
Para obtener más información, consulte el elemento userIdentity de CloudTrail. Las acciones de AWS IoT
se documentan en la Referencia de la API de AWS IoT.
En el ejemplo siguiente, se muestra una entrada de registro de CloudTrail que ilustra la acción
AttachPolicy.
{
"timestamp":"1460159496",
"AdditionalEventData":"",
"Annotation":"",
"ApiVersion":"",
"ErrorCode":"",
"ErrorMessage":"",
"EventID":"8bff4fed-c229-4d2d-8264-4ab28a487505",
"EventName":"AttachPolicy",
"EventTime":"2016-04-08T23:51:36Z",
"EventType":"AwsApiCall",
"ReadOnly":"",
"RecipientAccountList":"",
"RequestID":"d4875df2-fde4-11e5-b829-23bf9b56cbcd",
"RequestParamters":{
"principal":"arn:aws:iot:us-
east-1:123456789012:cert/528ce36e8047f6a75ee51ab7beddb4eb268ad41d2ea881a10b67e8e76924d894",
"policyName":"ExamplePolicyForIoT"
},
"Resources":"",
"ResponseElements":"",
"SourceIpAddress":"52.90.213.26",
"UserAgent":"aws-internal/3",
"UserIdentity":{
"type":"AssumedRole",
"principalId":"AKIAI44QH8DHBEXAMPLE",
"arn":"arn:aws:sts::12345678912:assumed-role/iotmonitor-us-east-1-beta-
InstanceRole-1C5T1YCYMHPYT/i-35d0a4b6",
"accountId":"222222222222",
"accessKeyId":"access-key-id",
"sessionContext":{
258
AWS IoT Guía del desarrollador
Descripción de las entradas de
archivos de registro de AWS IoT
"attributes":{
"mfaAuthenticated":"false",
"creationDate":"Fri Apr 08 23:51:10 UTC 2016"
},
"sessionIssuer":{
"type":"Role",
"principalId":"AKIAI44QH8DHBEXAMPLE",
"arn":"arn:aws:iam::123456789012:role/executionServiceEC2Role/iotmonitor-
us-east-1-beta-InstanceRole-1C5T1YCYMHPYT",
"accountId":"222222222222",
"userName":"iotmonitor-us-east-1-InstanceRole-1C5T1YCYMHPYT"
}
},
"invokedBy":{
"serviceAccountId":"111111111111"
}
},
"VpcEndpointId":""
}
259
AWS IoT Guía del desarrollador
Conexión de dispositivos
Los dispositivos se conectan a AWS IoT mediante un nombre de dominio completo (FQDN) que es
específico de su cuenta. Todas las conexiones a AWS IoT deben estar protegidas con TLS versión 1.2.
Además, AWS IoT necesita que los dispositivos envíen la extensión de Indicación de nombre del servidor
(SNI). Para obtener más información, consulte Seguridad de transporte en AWS IoT.
AWS IoT proporciona tres tipos de puntos de enlace, que se distinguen por los siguientes tres tipos de
servicio que exponen:
• Data: se utiliza para enviar y recibir datos desde y hacia los componentes Agente de mensajes, Sombra
de dispositivo y Motor de reglas de AWS IoT.
• Credential_Provider: se utiliza para intercambiar el certificado X.509 integrado en un dispositivo por
credenciales temporales para establecer una conexión directa con otros servicios de AWS. Para obtener
más información acerca de cómo conectarse a otros servicios de AWS, consulte Autorizar llamadas
directas a servicios de AWS.
• Jobs: se utiliza para permitir que los dispositivos interactúen con el servicio AWS IoT Jobs utilizando las
API HTTPS de dispositivo de Jobs.
Cada cliente de AWS IoT tiene puntos de enlace predeterminados para cada tipo de servicio. La API
DescribeEndpoint se utiliza para obtener los puntos de enlace predeterminados. En la lista siguiente se
indican los tipos de puntos de enlace válidos:
Important
Cada cliente tiene otro tipo de punto de enlace: iot:Data. Utilice este punto de enlace
para recuperar puntos de enlace de datos antiguos que utilicen certificados VeriSign para la
compatibilidad con versiones anteriores. Recomendamos a los clientes que utilicen el tipo
de punto de enlace iot:Data-ATS más reciente para evitar problemas relacionados con la
desconfianza generalizada en las entidades de certificación de Symantec. Para obtener más
información, consulte Autenticación del servidor.
También puede usar su propio FQDN (por ejemplo, ejemplo.com) y el certificado de servidor asociado
para conectar dispositivos a AWS IoT mediante la función de puntos de enlace configurables, que
actualmente está en versión beta pública. En la siguiente sección se explica cómo utilizar puntos de enlace
configurables para los dominios personalizados y dominios administrados por AWS.
260
AWS IoT Guía del desarrollador
Puntos de enlace configurables (beta)
Temas
• Puntos de enlace configurables (beta) (p. 261)
Puede crear varios puntos de enlace para conectar dispositivos a AWS IoT. También puede configurar
algunos detalles (como el nombre de dominio) utilizando configuraciones de dominio. Puede utilizar
configuraciones de dominio para simplificar tareas como las siguientes.
En la versión beta, puede configurar un nombre de dominio completo (FQDN), así como el certificado de
servidor asociado. También puede asociar un autorizador personalizado o un autorizador personalizado
mejorado. Para obtener más información, consulte Autorizadores personalizados (p. 143) y Autenticación
personalizada mejorada (beta) (p. 147).
Note
AWS IoT utiliza la extensión TLS de indicación de nombre de servidor (SNI) para aplicar
configuraciones de dominio. Los dispositivos deben usar esta extensión al conectarse y pasar un
nombre de servidor idéntico al nombre de dominio especificado en la configuración del dominio.
Para probar este servicio, use la versión v2 de cada SDK de dispositivo de AWS IoT en GitHub.
Temas
• Creación y configuración de dominios administrados por AWS (p. 261)
• Creación y configuración de dominios personalizados (p. 262)
• Administración de configuraciones de dominio (p. 265)
Un punto de enlace configurable en un dominio administrado por AWS se crea con la API
CreateDomainConfiguration. Una configuración de dominio para un dominio administrado por AWS consta
de lo siguiente:
261
AWS IoT Guía del desarrollador
Creación y configuración de dominios personalizados
Note
Los nombres de configuración de dominio que comienzan por IoT: están reservados para los
puntos de enlace predeterminados y no se pueden usar. Además, este valor debe ser exclusivo
de su región.
• defaultAuthorizerName: el nombre del autorizador personalizado que se va a utilizar en el punto de
enlace.
• allowAuthorizerOverride: un valor booleano que especifica si los dispositivos pueden invalidar
el autorizador predeterminado especificando un autorizador diferente en el encabezado HTTP de la
solicitud. Este valor es obligatorio si se especifica un valor para defaultAuthorizerName.
• serviceType: los valores posibles son DATA, CREDENTIAL_PROVIDER y JOB. Si especifica DATA,
AWS IoT devuelve un punto de enlace del tipo iot:Data-Beta. Este es un tipo de punto de enlace
especial para la versión beta de puntos de enlace configurables. El punto de enlace sirve certificados de
servidor firmados por ATS. No se puede crear un punto de enlace configurable iot:Data (VeriSign).
Note
El siguiente comando de la AWS CLI crea la configuración de dominio para un punto de enlace Data.
Esta característica actualmente se encuentra en versión beta pública y solo está disponible en la región
de EE. UU. Este (Norte de Virginia).
El flujo de trabajo para establecer una configuración de dominio con un dominio personalizado consta de
las tres etapas siguientes.
262
AWS IoT Guía del desarrollador
Creación y configuración de dominios personalizados
• Certificados externos firmados por una entidad emisora de certificación privada (p. 263)
Note
AWS IoT considera que un certificado está firmado por una entidad de certificación pública (CA) si
está incluido en el paquete de CA de confianza de Mozilla.
Si tiene previsto utilizar un certificado para cubrir varios subdominios, utilice un dominio comodín
en el campo Nombre común (CN) o Nombres alternativos del firmante (SAN). Por ejemplo, utilice
*.iot.example.com para cubrir dev.iot.example.com, qa.iot.example.com y prod.iot.example.com.
Cada FQDN requiere su propia configuración de dominio, pero varias configuraciones de dominio pueden
usar el mismo valor comodín. El CN o el SAN deben cubrir el FQDN que desea utilizar como dominio
personalizado. Esta cobertura puede ser una coincidencia exacta o una coincidencia de caracteres
comodín.
En las siguientes secciones se describe cómo obtener cada tipo de certificado. Cada recurso de certificado
requiere el ARN registrado con ACM que utiliza al crear la configuración de dominio.
Después de importar el certificado a ACM, genere un certificado público para el dominio personalizado
mediante la API RequestCertificate. Cuando genera un certificado de esta manera, ACM valida que usted
es el propietario del dominio personalizado. Para obtener más información, consulte Solicitar un certificado
público. Cuando cree la configuración de dominio, utilice este certificado público como certificado de
validación.
263
AWS IoT Guía del desarrollador
Creación y configuración de dominios personalizados
Note
Los nombres de configuración de dominio que comienzan por IoT: están reservados para los
puntos de enlace predeterminados y no se pueden usar. Además, este valor debe ser exclusivo
de su región.
• domainName: el FQDN que utilizan los dispositivos para conectarse a AWS IoT.
Note
AWS IoT utiliza la extensión TLS de indicación de nombre de servidor (SNI) para aplicar
configuraciones de dominio. Los dispositivos deben usar esta extensión al conectarse y pasar
un nombre de servidor idéntico al nombre de dominio especificado en la configuración del
dominio.
• serverCertificateArns: el ARN de la cadena de certificados de servidor que registró en ACM. La
versión beta solo admite un certificado de servidor.
• validationCertificateArn: el ARN del certificado público que generó en ACM para validar
que usted es el propietario del dominio personalizado. Este argumento no es necesario si utiliza un
certificado de servidor firmado públicamente o uno generado por ACM.
• defaultAuthorizerName: el nombre del autorizador personalizado que se va a utilizar en el punto de
enlace.
• allowAuthorizerOverride: un valor booleano que especifica si los dispositivos pueden invalidar
el autorizador predeterminado especificando un autorizador diferente en el encabezado HTTP de la
solicitud. Este valor es obligatorio si se especifica un valor para defaultAuthorizerName.
• serviceType: los valores posibles son DATA, CREDENTIAL_PROVIDER y JOB. Si especifica DATA,
AWS IoT devuelve un punto de enlace del tipo iot:Data-Beta. Este es un tipo de punto de enlace
especial para la versión beta de puntos de enlace configurables. No se puede crear un punto de enlace
configurable iot:Data (VeriSign).
Note
El siguiente comando de la AWS CLI crea una configuración de dominio para iot.example.com.
Note
Después de crear la configuración de dominio, puede pasar un máximo de 15 minutos hasta que
AWS IoT obtenga los certificados de servidor personalizados.
El siguiente comando de la AWS CLI muestra cómo obtener su punto de enlace beta.
264
AWS IoT Guía del desarrollador
Administración de configuraciones de dominio
Cuando tenga el punto de enlace iot:Data-Beta, cree un registro CNAME en el dominio personalizado
para este punto de enlace de AWS IoT. Si crea varios dominios personalizados en la misma cuenta, asigne
un alias a este mismo punto de enlace iot:Data-Beta.
Puede administrar los ciclos de vida de las configuraciones existentes mediante las siguientes API.
• ListDomainConfigurations
• DescribeDomainConfiguration
• UpdateDomainConfiguration
• DeleteDomainConfiguration
Después de eliminar una configuración de dominio, AWS IoT ya no sirve el certificado de servidor asociado
a ese dominio personalizado.
265
AWS IoT Guía del desarrollador
Temas
El procesamiento de mensajes a través del agente de mensajes de AWS IoT le permite definir
reglas (p. 285) que pueden iniciar más acciones en función del contenido de los mensajes. Si no necesita
características de AWS IoT como reglas (p. 285) o trabajos (p. 413), consulte Mensajería de AWS
para obtener información sobre otros servicios de mensajería de AWS que podrían ajustarse mejor a sus
requisitos.
Temas
• Temas (p. 266)
• Protocolos (p. 276)
Temas
Los temas identifican mensajes de AWS IoT. Los clientes de AWS IoT identifican los mensajes que
publican dando los nombres de temas a los mensajes. Los clientes identifican los mensajes a los que
desean suscribirse (recibir) registrando un filtro de temas con AWS IoT Core. El agente de mensajes de
AWS IoT utiliza nombres y filtros de temas para dirigir los mensajes de los clientes de publicación a los
clientes de suscripción.
Aunque AWS IoT admite algunos temas reservados del sistema (p. 267), la mayoría de los temas de
MQTT los crea y administra el diseñador del sistema. AWS IoT utiliza temas para identificar los mensajes
que se reciben de los clientes de publicación y para seleccionar los mensajes que se van a enviar a los
clientes suscriptores, tal y como se describe en las secciones siguientes. Antes de crear un espacio de
nombres de temas para el sistema, consulte las características de los temas de MQTT para crear la
jerarquía de nombres de temas que funcione mejor con su sistema de IoT.
Nombres de temas
Los nombres de los temas y los filtros de temas son cadenas codificadas por UTF-8. Pueden representar
una jerarquía de información utilizando el carácter de barra diagonal (/) para separar los niveles de la
jerarquía. Por ejemplo, este nombre de tema podría referirse a un sensor de temperatura en la sala 1:
• sensor/temperature/room1
En este ejemplo, también puede haber otros tipos de sensores en otras salas con nombres de temas
como:
• sensor/temperature/room2
• sensor/humidity/room1
• sensor/humidity/room2
Note
Cuando considere los nombres de los temas para los mensajes de su sistema, tenga en cuenta:
266
AWS IoT Guía del desarrollador
Filtros de temas
• Los nombres de temas y los filtros de temas distinguen entre mayúsculas y minúsculas.
• Los nombres de los temas no deben contener información de identificación personal.
• Los nombres de tema que comienzan por $ son temas reservados (p. 267) que debe utilizar
únicamente AWS IoT Core.
• AWS IoT Core no puede enviar ni recibir mensajes entre cuentas o regiones de AWS.
El espacio de nombres del tema está limitado a una cuenta y región de AWS. Por ejemplo, el tema de
sensor/temp/room1 utilizado por una cuenta de AWS en una región es distinto del tema sensor/
temp/room1 utilizado por la misma cuenta de AWS en otra región o utilizado por cualquier otra cuenta de
AWS en cualquier región.
Filtros de temas
Los clientes suscriptores registran filtros de temas con el agente de mensajes de AWS IoT para especificar
los temas de mensajes que el agente de mensajes debe enviarles. Un filtro de tema puede ser un único
nombre de tema para suscribirse a un único nombre de tema o puede incluir caracteres comodín para
suscribirse a varios nombres de tema a la vez.
Los clientes de publicación no pueden utilizar caracteres comodín en los nombres de tema que publican.
En la tabla siguiente se enumeran los caracteres comodín que se pueden utilizar en un filtro de temas.
Comodines de tema
Temas reservados
Los temas que comienzan por un signo de dólar ($) están reservados para su uso por parte de AWS IoT.
Puede suscribirse y publicar en estos temas reservados según lo permitan; sin embargo, no puede crear
267
AWS IoT Guía del desarrollador
Temas reservados
nuevos temas que comiencen por un signo de dólar. Las operaciones de publicación o suscripción no
admitidas a temas reservados pueden dar como resultado que se termine la conexión.
Temas de eventos
Temas de reglas
268
AWS IoT Guía del desarrollador
Temas reservados
269
AWS IoT Guía del desarrollador
Temas reservados
Temas de trabajos
270
AWS IoT Guía del desarrollador
Temas reservados
271
AWS IoT Guía del desarrollador
Temas reservados
Solo el dispositivo
que publica en $aws/
things/thingName/
jobs/jobId/update
recibirá mensajes en
este tema.
Solo el dispositivo
que publica en $aws/
things/thingName/
jobs/jobId/update
recibirá mensajes en
este tema.
272
AWS IoT Guía del desarrollador
Temas reservados
273
AWS IoT Guía del desarrollador
Temas reservados
274
AWS IoT Guía del desarrollador
Temas reservados
275
AWS IoT Guía del desarrollador
Protocolos
Otros temas
Protocolos
El agente de mensajes admite clientes que utilizan el protocolo MQTT para publicar y suscribirse
a mensajes y el protocolo HTTPS para publicar mensajes. Ambos protocolos se admiten mediante
IP (versiones 4 y 6). El agente de mensajes también admite el protocolo MQTT sobre el protocolo
WebSocket. La forma en que un cliente puede conectarse al agente de mensajes depende del protocolo
utilizado.
276
AWS IoT Guía del desarrollador
Protocolos, mapeos de puertos y autenticación
†
Los clientes que se conectan al puerto 443 con la autenticación de certificado cliente X.509 deben
implementar la extensión de TLS negociación de protocolo de capa de aplicación (ALPN) y utilizar el
nombre de protocolo ALPN indicado en la ProtocolNameList de ALPN enviado por el cliente como parte
del mensaje ClientHello. Los clientes también deben enviar la extensión TLS de Indicación de nombre
de servidor (SNI) para evitar que se rechacen las conexiones. Para obtener más información, consulte
Seguridad de transporte en AWS IoT.
MQTT
MQTT es un protocolo de mensajería ligero muy utilizado, diseñado para dispositivos limitados. Para
obtener más información, consulte la especificación MQTT v3.1.1.
La implementación del agente de mensajes de AWS IoT se basa en MQTT versión 3.1.1, pero difiere de la
especificación como se indica a continuación:
• AWS IoT Core admite los niveles 0 y 1 de calidad de servicio (QoS) de MQTT. AWS IoT Core no admite
la publicación o suscripción con QoS nivel 2. El agente de mensajes de AWS IoT no envía PUBACK o
SUBACK cuando se solicita QoS nivel 2.
• En AWS IoT Core, suscribirse a un tema con QoS nivel 0 significa que un mensaje se entrega cero o
más veces. Es posible que un mensaje se entregue más de una vez. Los mensajes que se entreguen
más de una vez pueden enviarse con otro ID de paquete. En tal caso, la marca DUP no se establece.
• Cuando responde a una solicitud de conexión, el agente de mensajes envía un mensaje CONNACK.
Este mensaje contiene una marca para indicar si la conexión reanuda una sesión anterior.
• Cuando un cliente se suscribe a un tema, puede haber un retraso entre el momento en que el agente
de mensajes envía un SUBACK y el momento en que el cliente empieza a recibir nuevos mensajes
coincidentes.
• La especificación MQTT ofrece una cláusula que permite a un editor solicitar al agente que conserve
el último mensaje enviado a un tema y que lo envíe a todos los futuros suscriptores de dicho tema.
277
AWS IoT Guía del desarrollador
MQTT
AWS IoT Core no admite mensajes conservados. Si se envía una solicitud para conservar mensajes, se
interrumpe la conexión.
• El agente de mensajes utiliza el ID de cliente para identificar a cada cliente. El ID de cliente se transfiere
desde el cliente al agente de mensajes como parte de la carga de MQTT. Dos clientes que tengan el
mismo ID de cliente no pueden estar conectados simultáneamente al agente de mensajes. Cuando un
cliente se conecta al agente de mensajes mediante un ID de cliente que otro cliente está utilizando, se
acepta la nueva conexión de cliente y se desconecta el cliente previamente conectado.
• En raras ocasiones, el agente de mensajes reenviará el mismo mensaje PUBLISH lógico con otro ID de
paquete.
• El agente de mensajes no garantiza el orden de recepción de los mensajes y ACK.
Puede conectarse a AWS IoT Core a través de MQTT mediante una de las SDK de AWS IoT para
dispositivos y móviles (p. 762). Para ver un ejemplo de cómo conectarse a AWS IoT Core con MQTT,
consulte el ejemplo de basicPubSub en el SDK de Python. Los otros SDK de AWS IoT (p. 762) tienen
aplicaciones de ejemplo similares.
Para obtener más información acerca de la autenticación y las asignaciones de puertos para mensajes
MQTT, consulte Protocolos, mapeos de puertos y autenticación (p. 277).
Puede crear una sesión persistente de MQTT enviando un mensaje CONNECT que establezca la marca
cleanSession en 0. Si no existe ninguna sesión para el cliente que envía el mensaje CONNECT, se crea
una sesión persistente nueva. Si ya existe una sesión para el cliente, se reanuda.
Una vez que el cliente se une a la sesión, puede continuar publicando mensajes y suscribirse a filtros
de temas sin ningún indicador adicional en cada operación. Las condiciones siguientes describen cómo
comienzan y terminan las sesiones persistentes.
• Una sesión persistente termina y no se puede reanudar cuando el cliente envía un mensaje CONNECT
que establece el indicador cleanSession en 1.
• De forma predeterminada, una sesión persistente caduca una hora después de que el agente de
mensajes detecta que un cliente se ha desconectado. Puede configurar este intervalo de tiempo.
• Cuando un cliente se vuelve a conectar después de que la sesión haya caducado y establece el
indicador cleanSession en 0, el servicio crea una nueva sesión persistente. Las suscripciones y los
mensajes de la sesión anterior se descartan.
Las sesiones persistentes tienen un periodo de caducidad predeterminado de una hora. El periodo
de caducidad comienza cuando el agente de mensajes detecta que un cliente se desconecta (por
desconexión o por tiempo de espera de MQTT). El periodo de caducidad de la sesión persistente puede
278
AWS IoT Guía del desarrollador
MQTT
aumentarse a través del proceso de aumento del límite estándar. Si un cliente no ha reanudado su sesión
dentro del periodo de caducidad, la sesión se termina y los mensajes relacionados almacenados se
descartan. El período de caducidad es aproximado. Las sesiones podrían persistir hasta 30 minutos
más (pero no menos) que la duración configurada. Para obtener más información, consulte Cuotas de
servicio de AWS. Todos los mensajes almacenados para las sesiones persistentes se facturarán a la tarifa
estándar de mensajería. Para obtener más información, consulte Precios de AWS IoT Core.
Una conexión WebSocket se inicia en un cliente enviando una solicitud HTTP GET. La dirección URL que
utilice tiene la forma siguiente:
wss://<endpoint>.iot.<region>.amazonaws.com/mqtt
wss
Su punto de enlace de AWS IoT Core específico de la cuenta de AWS. Puede utilizar el comando de la
CLI de AWS IoT Core describe-endpoint para encontrar este punto de enlace.
region
Cuando el servidor responde, el cliente envía una solicitud de actualización para indicar al servidor que
se comunica mediante el protocolo WebSocket. Después de que el servidor reconozca la solicitud de
actualización, toda la comunicación se realizará mediante el protocolo WebSocket. La implementación
de WebSocket que utilice actúa como protocolo de transporte. Los datos que envíe mediante el protocolo
WebSocket son mensajes MQTT.
El código JavaScript siguiente define algunas funciones de utilidades para generar una solicitud Signature
Version 4.
Para obtener más información sobre el uso del protocolo WebSocket en JavaScript, vea WebSocket en
The Modern JavaScript Tutorial.
/**
* utilities to do sigv4
* @class SigV4Utils
279
AWS IoT Guía del desarrollador
MQTT
*/
function SigV4Utils() {}
280
AWS IoT Guía del desarrollador
MQTT
2. Cree una cadena para firmar, genere una clave de firma y firme la cadena.
Tome la URL canónica que ha creado en el paso anterior e insértela en una cadena para firmar. Para
ello, cree una cadena formada por el algoritmo de hash, la fecha, el ámbito de las credenciales y el
SHA de la solicitud canónica.
A continuación, genere la clave de firma y firme la cadena, tal y como se muestra en el siguiente
código JavaScript.
El siguiente código JavaScript muestra cómo agregar la información de firma a la cadena de consulta.
4. Si tiene credenciales de sesión (de un servidor STS, AssumeRole o Amazon Cognito), anexe el token
de sesión al final de la cadena URL después de la firma:
canonicalQuerystring += '&X-Amz-Security-Token=' +
encodeURIComponent(credentials.sessionToken);
6. Abra WebSocket.
El siguiente código JavaScript muestra cómo crear un cliente Paho MQTT y hacer una llamada
CONNECT a AWS IoT. El argumento endpoint corresponde al punto de enlace específico de su
cuenta de AWS. El clientId es un identificador de texto único entre todos los clientes conectados
simultáneamente en su cuenta de AWS.
281
AWS IoT Guía del desarrollador
HTTP
var connectOptions = {
onSuccess: function(){
// connect succeeded
},
useSSL: true,
timeout: 3,
mqttVersion: 4,
onFailure: function() {
// connect failed
}
};
client.connect(connectOptions);
• Node.js
• iOS
• Android
Para ver una implementación de referencia para conectar una aplicación web a AWS IoT Core mediante
MQTT sobre el protocolo WebSocket consulte AWS Labs WebSocket sample en el sitio web de GitHub.
Si utiliza un lenguaje de programación o de script que no esté admitido actualmente, puede utilizar
cualquier biblioteca de WebSocket existente siempre y cuando la solicitud de actualización de WebSocket
inicial (HTTP POST) se conecte mediante Signature Version 4. Algunos clientes MQTT, como Eclipse
Paho para JavaScript, admiten el protocolo WebSocket de manera nativa.
HTTP
Los clientes pueden publicar mensajes realizando solicitudes a la API REST utilizando los protocolos
HTTP 1.0 o 1.1. Para obtener información sobre la autenticación y los mapeos de puertos utilizados por las
solicitudes HTTP, consulte Protocolos, mapeos de puertos y autenticación (p. 277).
HTTP URL
Los clientes de publicación realizan solicitudes POST a un punto de enlace específico del
cliente y a una dirección URL específica del tema: https://<AWS IoT endpoint>/
topics/<url_encoded_topic_name>?qos=1".
• <AWS IoT endpoint> es el punto de enlace de la API REST. Puede encontrar el punto de enlace en
la consola de AWS IoT en la página de detalles del objeto o en el cliente mediante el comando la CLI de
AWS IoT:
282
AWS IoT Guía del desarrollador
HTTP
Ejemplo de curl
Puede usar curl para emular a un cliente que envía un mensaje a AWS IoT Core.
Para usar curl para enviar un mensaje desde un dispositivo cliente de AWS IoT Core
curl --help
En el texto de ayuda, busque las opciones TLS. Debería ver la opción --tlsv1.2.
b. Si ve la opción --tlsv1.2, continúe.
c. Si no ve la opción --tlsv1.2 o aparece un error command not found, actualice o instale curl
en su cliente antes de continuar.
2. Instale los certificados en su cliente.
Copie los archivos de certificado que creó cuando registró su cliente (objeto) en la consola de AWS
IoT. Asegúrese de que tiene estos tres archivos de certificado en su cliente antes de continuar.
--tlsv1.2
Los datos de HTTP POST que quiere publicar. En este caso, es una cadena JSON, con las
comillas internas con el carácter de escape de barra invertida (\).
"https://<AWS IoT endpoint>:8443/topics/topic?qos=1"
La URL del punto de enlace de la API REST de su cliente, seguido del puerto HTTPS, :8443,
seguido de la palabra clave /topics/ y el nombre del tema topic, en este caso. Especifique la
calidad del servicio como parámetro de consulta, ?qos=1.
4. Abra el cliente de prueba MQTT en la consola.
283
AWS IoT Guía del desarrollador
HTTP
Siga las instrucciones de Visualización de los mensajes de MQTT de dispositivo con el cliente MQTT
de AWS IoT (p. 12) y configure la consola para que se suscriba a los mensajes con el nombre del
tema de topic o utilice el filtro de tema comodín de #.
5. Pruebe el comando.
Mientras monitorea el tema en el cliente de prueba de la consola de AWS IoT, vaya a su cliente y
ejecute la línea de comandos curl que creó en el paso 3. Debería ver los mensajes de su cliente en la
consola.
284
AWS IoT Guía del desarrollador
Concesión a AWS IoT del acceso requerido
Su reglas pueden utilizar mensajes de MQTT que pasen por publicación o suscripción de Agente de
mensajes de AWS IoT (p. 266) o, mediante la característica Basic Ingest (p. 319), puede enviar de forma
segura los datos de los dispositivos a los servicios de AWS indicados anteriormente sin incurrir en costos
de mensajería. (La característica Basic Ingest (p. 319) optimiza el flujo de datos eliminando el agente de
mensajes de publicación/suscripción desde la ruta de adquisición, por lo que resulta más rentable al tiempo
que mantiene las características de procesamiento de los datos y de seguridad de AWS IoT).
Para que AWS IoT pueda realizar estas acciones, debe concederle permiso de acceso a los recursos de
AWS en su nombre. Cuando dichas acciones se ejecuten, se le cobrará la tarifa estándar de los servicios
de AWS que utilice.
1. Guarde el siguiente documento de política de confianza, que concede a AWS IoT permiso para asumir
el rol, en un archivo llamado iot-role-trust.json:
285
AWS IoT Guía del desarrollador
Concesión a AWS IoT del acceso requerido
"Version":"2012-10-17",
"Statement":[{
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}]
}
Utilice el comando create-role para crear un rol de IAM especificando el archivo iot-role-
trust.json:
{
"Role": {
"AssumeRolePolicyDocument": "url-encoded-json",
"RoleId": "AKIAIOSFODNN7EXAMPLE",
"CreateDate": "2015-09-30T18:43:32.821Z",
"RoleName": "my-iot-role",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "dynamodb:*",
"Resource": "*"
}]
}
Este JSON es un ejemplo de documento de política que concede a AWS IoT acceso de administrador
a DynamoDB.
Ejecute el comando create-policy para conceder a AWS IoT acceso a sus recursos de AWS en el
momento en que asuma el rol pasando el archivo iot-policy.json:
Para obtener más información acerca de cómo conceder acceso a los servicios de AWS en las
políticas de AWS IoT, consulte Creación de una regla de AWS IoT (p. 288).
La salida del comando create-policy contendrá el ARN de la política. Tendrá que adjuntar la política a
un rol.
{
"Policy": {
"PolicyName": "my-iot-policy",
"CreateDate": "2015-09-30T19:31:18.620Z",
286
AWS IoT Guía del desarrollador
Transmisión de los permisos de rol
"AttachmentCount": 0,
"IsAttachable": true,
"PolicyId": "ZXR6A36LTYANPAI7NJ5UV",
"DefaultVersionId": "v1",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:policy/my-iot-policy",
"UpdateDate": "2015-09-30T19:31:18.620Z"
}
}
De hecho, cuando crea o sustituye una regla, está transfiriendo un rol al motor de reglas. El usuario que
realiza esta operación necesita el permiso iam:PassRole. Para asegurarse de que dispone de dicho
permiso, cree una política que conceda el permiso iam:PassRole y asóciela a su usuario de IAM. La
política siguiente muestra cómo conceder un permiso iam:PassRole para un rol.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::123456789012:role/myRole"
]
}
]
}
En este ejemplo de política, se concede el permiso iam:PassRole para el rol myRole. El rol se especifica
mediante el ARN del rol. Debe asociar esta política al usuario o al rol de IAM al que pertenezca el usuario.
Para obtener más información, consulte Working with Managed Policies.
Note
Las funciones de Lambda utilizan una política basada en recursos. Dicha política está
directamente asociada a la función de Lambda en sí. Cuando crea una regla que invoca una
función Lambda, no pasa un rol, por lo que el usuario que crea la regla no necesita el permiso
iam:PassRole. Para obtener más información acerca de la autorización de funciones de
Lambda, consulte Granting Permissions Using a Resource Policy.
287
AWS IoT Guía del desarrollador
Creación de una regla de AWS IoT
Nombre de la regla
El nombre de la regla.
Note
Sintaxis de SQL simplificada para filtrar los mensajes recibidos sobre un tema MQTT e insertar
los datos en otro punto. Para obtener más información, consulte Referencia de la SQL de AWS
IoT (p. 320).
Versión de SQL
Versión del motor de reglas SQL que debe utilizarse al evaluar la regla. Aunque esta propiedad es
opcional, recomendamos encarecidamente que especifique la versión de SQL. Si no se define esta
propiedad, se usará el valor predeterminado 2015-10-08. Para obtener más información, consulte
Versiones de SQL (p. 375).
Una o varias acciones
Las acciones que realiza AWS IoT al ejecutar la regla. Por ejemplo, puede insertar datos en una tabla
de DynamoDB, escribir datos en un bucket de Amazon S3, publicar en un tema de Amazon SNS o
invocar una función de Lambda.
Una acción de error
La acción AWS IoT se realiza cuando no es posible realizar una acción de la regla.
Cuando cree una regla, debe tener en cuenta la cantidad de datos que publica en los temas. Si crea
reglas que contienen un patrón de tema con comodín, es posible que coincidan con una gran cantidad de
mensajes y que necesite aumentar la capacidad de los recursos de AWS se que utilizan en las acciones de
destino. Asimismo, si crea una regla para volver a publicar que contenga un patrón de tema con comodín,
puede acabar teniendo una regla circular que genere un bucle infinito.
Note
La creación y la actualización de reglas son acciones de nivel de administrador. Todo usuario que
tenga permiso para crear o actualizar reglas podrá tener acceso a los datos procesados por las
reglas.
288
AWS IoT Guía del desarrollador
Creación de una regla de AWS IoT
Ejemplo de archivo de carga con una regla que inserta todos los mensajes enviados al tema iot/test
en la tabla de DynamoDB especificada. La instrucción SQL filtra los mensajes, y el ARN del rol concede a
AWS IoT permiso para escribir en la tabla de DynamoDB.
{
"sql": "SELECT * FROM 'iot/test'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"dynamoDB": {
"tableName": "my-dynamodb-table",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role",
"hashKeyField": "topic",
"hashKeyValue": "${topic(2)}",
"rangeKeyField": "timestamp",
"rangeKeyValue": "${timestamp()}"
}
}]
}
A continuación, se muestra un ejemplo de archivo de carga con una regla que inserta todos los mensajes
enviados al tema iot/test en el bucket de S3 especificado. La instrucción SQL filtra los mensajes, y el
ARN del rol concede a AWS IoT permiso para escribir en el bucket de Amazon S3.
{
"awsIotSqlVersion": "2016-03-23",
"sql": "SELECT * FROM 'iot/test'",
"ruleDisabled": false,
"actions": [
{
"s3": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_s3",
"bucketName": "my-bucket",
"key": "myS3Key"
}
}
]
}
A continuación, se muestra un ejemplo de archivo de carga con una regla que inserta datos en Amazon
Elasticsearch Service:
{
"sql":"SELECT *, timestamp() as timestamp FROM 'iot/test'",
"ruleDisabled":false,
"awsIotSqlVersion": "2016-03-23",
"actions":[
{
"elasticsearch":{
"roleArn":"arn:aws:iam::123456789012:role/aws_iot_es",
"endpoint":"https://my-endpoint",
"index":"my-index",
"type":"my-type",
"id":"${newuuid()}"
}
}
]
}
289
AWS IoT Guía del desarrollador
Creación de una regla de AWS IoT
Ejemplo de archivo de carga con una regla que invoca una función de Lambda:
{
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"lambda": {
"functionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-lambda-
function"
}
}]
}
Ejemplo de archivo de carga con una regla que publica en un tema de Amazon SNS:
{
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"sns": {
"targetArn": "arn:aws:sns:us-west-2:123456789012:my-sns-topic",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}]
}
Ejemplo de archivo de carga con una regla que vuelve a publicar en otro tema MQTT:
{
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"republish": {
"topic": "my-mqtt-topic",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}]
}
Ejemplo de archivo de carga con una regla que inserta datos en un flujo de Amazon Kinesis Data Firehose:
{
"sql": "SELECT * FROM 'my-topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"firehose": {
"roleArn": ""arn:aws:iam::123456789012:role/my-iot-role",
"deliveryStreamName": "my-stream-name"
}
}]
}
Ejemplo de archivo de carga con una regla que utiliza la función Amazon Machine Learning de
machinelearning_predict para volver a publicar en un tema, siempre y cuando los datos de la carga
de MQTT se clasifiquen como 1.
290
AWS IoT Guía del desarrollador
Visualización de las reglas
{
"sql": "SELECT * FROM 'iot/test' where machinelearning_predict('my-model',
'arn:aws:iam::123456789012:role/my-iot-aml-role', *).predictedLabel=1",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"republish": {
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role",
"topic": "my-mqtt-topic"
}
}]
}
A continuación se incluye un archivo de carga de ejemplo con una regla que publica mensajes en un flujo
de entrada de Salesforce IoT Cloud.
{
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"salesforce": {
"token": "ABCDEFGHI123456789abcdefghi123456789",
"url": "https://ingestion-cluster-id.my-env.sfdcnow.com/streams/stream-id/
connection-id/my-event"
}
}]
}
Ejemplo de archivo de carga con una regla que inicia la ejecución de una máquina de estado de Step
Functions.
{
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"stepFunctions": {
"stateMachineName": "myCoolStateMachine",
"executionNamePrefix": "coolRunning",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}]
}
291
AWS IoT Guía del desarrollador
Eliminar una regla
Note
Es posible que el motor de reglas de AWS IoT realice varios intentos para ejecutar una acción en
caso de errores intermitentes. Si todos los intentos fallan, el mensaje se descarta y el error está
disponible en los registros de CloudWatch. Es posible especificar una acción de error para cada
regla que se invoca cuando se produce un error. Para obtener más información, consulte Control
de errores (acción de error) (p. 315).
Algunas acciones de regla desencadenan acciones en servicios que se integran con AWS Key
Management Service (AWS KMS) para admitir el cifrado de datos en reposo. Si utiliza una clave maestra
del cliente de AWS KMS (CMK) administrada por el cliente para cifrar los datos en reposo, el servicio
292
AWS IoT Guía del desarrollador
Acción de alarma de CloudWatch
debe tener permiso para poder usar la CMK en nombre del autor de la llamada. Consulte los temas de
cifrado de datos en la guía del servicio apropiado para obtener información acerca de cómo administrar los
permisos de una CMK administrada por el cliente. Para obtener más información acerca de las CMK y las
CMK administradas por el cliente, consulte Conceptos de AWS Key Management Service en la AWS Key
Management Service Developer Guide.
Cuando cree una regla de AWS IoT con una acción de alarma de CloudWatch, debe especificar la
información siguiente:
roleArn
El valor del estado de alarma. Los valores aceptables son OK, ALARM e INSUFFICIENT_DATA.
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
cloudwatch:SetAlarmState.
El siguiente ejemplo de JSON muestra cómo definir una acción de alarma de CloudWatch en una
regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"cloudwatchAlarm": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_cw",
"alarmName": "IotAlarm",
"stateReason": "Temperature stabilized.",
"stateValue": "OK"
}
}]
}
}
293
AWS IoT Guía del desarrollador
Acción de CloudWatch Logs
La acción de registros de CloudWatch permite enviar datos a CloudWatch Logs. Puede especificar el
grupo de registros de CloudWatch al que la acción va a enviar los datos.
More information (2)
Cuando cree una regla de AWS IoT con una acción de registros de CloudWatch, debe especificar la
siguiente información:
roleArn
El siguiente ejemplo de JSON muestra cómo definir una acción de registros de CloudWatch en una
regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"cloudwatchLogs": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_cw",
"logGroupName": "IotLogs"
}
}]
}
}
Para obtener más información, consulte Introducción a CloudWatch Logs. Si utiliza una CMK de AWS
KMS administrada por el cliente para cifrar los datos de registro en CloudWatch Logs, el servicio
debe tener permiso para poder usar la CMK en nombre del autor de la llamada. Para obtener más
información, consulte Cifrar datos de registro en CloudWatch Logs mediante AWS KMS en la Guía del
usuario de Amazon CloudWatch Logs.
Cuando cree una regla de AWS IoT con una acción de métrica de CloudWatch, debe especificar la
información siguiente:
roleArn
294
AWS IoT Guía del desarrollador
Acción de DynamoDB
metricNamespace
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
cloudwatch:PutMetricData.
El siguiente ejemplo de JSON muestra cómo definir una acción de métrica de CloudWatch en una
regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"cloudwatchMetric": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_cw",
"metricNamespace": "IotNamespace",
"metricName": "IotMetric",
"metricValue": "1",
"metricUnit": "Count",
"metricTimestamp": "1456821314"
}
}]
}
}
Acción de DynamoDB
DynamoDB action
La acción dynamoDB le permite escribir todo un mensaje MQTT o parte de él en una tabla de
DynamoDB.
More information (4)
hashKeyType
Opcional. El tipo de datos de la clave hash (también denominado clave de partición). Los valores
válidos son: "STRING" o "NUMBER".
295
AWS IoT Guía del desarrollador
Acción de DynamoDB
hashKeyField
Opcional. El tipo de datos de la clave de rango (también denominada clave de ordenación). Los
valores válidos son: "STRING" o "NUMBER".
rangeKeyField
Opcional. El tipo de operación que se va a realizar. Sigue la plantilla de sustitución, por lo que
puede ser ${operation}, pero la sustitución debe tener como resultado uno de los elementos
siguientes: INSERT, UPDATE o DELETE.
payloadField
Opcional. El nombre del campo donde se escribirá la carga. Si este valor no se especifica, la
carga se escribe en el campo payload.
tabla
El rol de IAM que permite tener acceso a la tabla de DynamoDB. Como mínimo, el rol debe
permitir la acción de IAM dynamoDB:PutItem.
Los datos que se escriben en la tabla de DynamoDB son el resultado de la instrucción SQL de la
regla. Los campos hashKeyValue y rangeKeyValue se componen normalmente de expresiones
(por ejemplo, "${topic()}" o "${timestamp()}").
Note
Los datos que no son JSON se escriben en DynamoDB como datos binarios. La consola de
DynamoDB mostrará los datos como texto codificado en Base64.
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
dynamodb:PutItem.
El siguiente ejemplo de JSON muestra cómo definir una acción dynamoDB en una regla de AWS IoT:
{
"topicRulePayload": {
"ruleDisabled": false,
"sql": "SELECT * AS message FROM 'some/topic'",
"description": "A test Dynamo DB rule",
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"dynamoDB": {
"hashKeyField": "key",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_dynamoDB",
"tableName": "my_ddb_table",
296
AWS IoT Guía del desarrollador
Acción DynamoDBv2
"hashKeyValue": "${topic()}",
"rangeKeyValue": "${timestamp()}",
"rangeKeyField": "timestamp"
}
}]
}
}
Para obtener más información, consulte Guía de introducción a Amazon DynamoDB. Si utiliza una
CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo de DynamoDB, el
servicio debe tener permiso para poder usar la CMK en nombre del autor de la llamada. Para obtener
más información, consulte este artículo sobre la CMK administrado por el cliente en la Guía de
introducción de Amazon DynamoDB.
Acción DynamoDBv2
DynamoDBv2 action
La acción dynamoDBv2 le permite escribir todo un mensaje MQTT o parte de él en una tabla de
DynamoDB. Cada atributo de la carga se escribe en una columna independiente de la base de datos
de DynamoDB.
More information (5)
roleARN
El rol de IAM que permite tener acceso a la tabla de DynamoDB. Como mínimo, el rol debe
permitir la acción de IAM dynamoDB:PutItem.
tableName
Note
La carga del mensaje MQTT debe contener una clave de nivel de raíz que coincida con la
clave de partición principal de la tabla y una clave de nivel de raíz que coincida con la clave
de ordenación principal de la tabla, si hay una definida.
Los datos que se escriben en la tabla de DynamoDB son el resultado de la instrucción SQL de la
regla.
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
dynamodb:PutItem.
El siguiente ejemplo de JSON muestra cómo definir una acción dynamoDB en una regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * AS message FROM 'some/topic'",
"ruleDisabled": false,
"description": "A test DynamoDBv2 rule",
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"dynamoDBv2": {
297
AWS IoT Guía del desarrollador
Acción de Elasticsearch
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_dynamoDBv2",
"putItem": {
"tableName": "my_ddb_table"
}
}
}]
}
}
Para obtener más información, consulte Guía de introducción a Amazon DynamoDB. Si utiliza una
CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo de DynamoDB, el
servicio debe tener permiso para poder usar la CMK en nombre del autor de la llamada. Para obtener
más información, consulte este artículo sobre la CMK administrado por el cliente en la Guía de
introducción de Amazon DynamoDB.
Acción de Elasticsearch
Elasticsearch action
Cuando cree una regla de AWS IoT con una acción elasticsearch, debe especificar la información
siguiente:
endpoint
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
es:ESHttpPut.
El siguiente ejemplo de JSON muestra cómo definir una acción elasticsearch en una regla de
AWS IoT:
{
"topicRulePayload":{
"sql":"SELECT *, timestamp() as timestamp FROM 'iot/test'",
"ruleDisabled":false,
"awsIotSqlVersion": "2016-03-23",
"actions":[{
"elasticsearch":{
"roleArn":"arn:aws:iam::123456789012:role/aws_iot_es",
298
AWS IoT Guía del desarrollador
Acción Firehose
"endpoint":"https://my-endpoint",
"index":"my-index",
"type":"my-type",
"id":"${newuuid()}"
}
}]
}
}
Para obtener más información, consulte Guía para desarrolladores de Amazon Elasticsearch Service.
Si utiliza una CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo de
Elasticsearch, el servicio debe tener permiso para poder usar la CMK en nombre del autor de la
llamada. Para obtener más información, consulte este artículo sobre el cifrado de datos en reposo
para Amazon Elasticsearch Service en la Guía del desarrollador de Amazon Elasticsearch Service.
Acción Firehose
Firehose action
Una acción firehose envía datos de un mensaje MQTT que activó la regla a un flujo de Kinesis Data
Firehose.
More information (7)
Cuando cree una regla con una acción firehose, debe especificar la información siguiente:
deliveryStreamName
El flujo de Kinesis Data Firehose en el que deben escribirse los datos del mensaje.
roleArn
Un separador de caracteres que se utiliza para separar los registros escritos en el flujo de Kinesis
Data Firehose. Los valores válidos son: '\n' (línea nueva), '\t' (tabulador), '\r\n' (línea nueva de
Windows), ',' (coma).
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
firehose:PutRecord.
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción firehose:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"firehose": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_firehose",
"deliveryStreamName": "my_firehose_stream"
}
}]
}
}
299
AWS IoT Guía del desarrollador
Acción HTTP
Para obtener más información, consulte Guía para desarrolladores de Amazon Kinesis Data Firehose.
Si utiliza Kinesis Data Firehose para enviar datos a un bucket de Amazon S3 y utiliza una CMK de
AWS KMS administrada por el cliente para los cifrar datos en reposo de Amazon S3, Kinesis Data
Firehose debe tener acceso al bucket y permiso para poder usar la CMK en nombre de la persona que
llama. Para obtener más información, consulte este artículo acerca de cómo conceder a Kinesis Data
Firehose acceso a un destino de Amazon S3 en la Guía del desarrollador de Amazon Kinesis Data
Firehose.
Acción HTTP
HTTP action
La acción http envía datos desde el mensaje MQTT que activó la regla a sus aplicaciones o servicios
web para su posterior procesamiento, sin escribir ningún código. El punto de enlace al que envía datos
debe verificarse para que el motor de reglas pueda usarlo.
More information (8)
Cuando cree una regla con una acción http, debe especificar la información siguiente:
url
La URL HTTPS donde HTTP POST envía el mensaje. Puede utilizar plantillas de sustitución en la
URL.
confirmationUrl
Opcional. Si se especifica, AWS IoT utiliza la dirección URL de confirmación para crear un destino
de regla del tema coincidente. Debe habilitar el destino de la regla del tema para poder usarlo en
una acción http. Para obtener más información, consulte Trabajar con destinos de reglas de
temas (p. 317). Si utiliza plantillas de sustitución, debe crear manualmente destinos de reglas de
tema para poder utilizar la acción http. confirmationUrl debe ser un prefijo de url.
Opcional. Autenticación utilizada por el motor de reglas para conectarse a la dirección URL del
punto de enlace especificada en el argumento url. Actualmente, Signature Version 4 es el único
tipo de autenticación admitido. Para obtener más información, consulte Autorización HTTP.
300
AWS IoT Guía del desarrollador
Acción de IoT Analytics
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción http:
{
"topicRulePayload": {
"sql": "select * from 'a/b'",
"awsIotSqlVersion": "2016-03-23",
"ruleDisabled": false,
"actions": [{
"http": {
"url": "https://www.example.com/subpath",
"confirmationUrl": "https://www.example.com",
"headers": [{
"key": "static_header_key",
"value": "static_header_value"
},
{
"key": "substitutable_header_key",
"value": "${value_from_payload}"
}]
}
}]
}
}
El tipo de contenido predeterminado es application/json cuando la carga útil está en formato JSON.
De lo contrario, es application/octet-stream. Puede sobrescribirlo especificando el tipo de contenido
exacto en el encabezado con el tipo de contenido de la clave (sin distinción entre mayúsculas y
minúsculas).
HTTP action retry logic
El motor de reglas de AWS IoT reintenta las acciones http de acuerdo con estas reglas:
Note
Una acción iotAnalytics envía datos desde el mensaje MQTT que activó la regla a un canal de
AWS IoT Analytics.
More information (9)
Cuando cree una regla con una acción iotAnalytics, debe especificar la información siguiente:
301
AWS IoT Guía del desarrollador
Acción de IoT Analytics
channelName
El nombre del canal de AWS IoT Analytics en el que se escriben los datos.
roleArn
El rol de IAM que permite tener acceso al canal de AWS IoT Analytics.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iotanalytics:BatchPutMessage",
"Resource": [
"arn:aws:iotanalytics:us-west-2:account-id:channel/mychannel"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole",
}
]
}
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción
iotAnalytics:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"iotAnalytics": {
"channelName": "mychannel",
"roleArn": "arn:aws:iam::123456789012:role/analyticsRole",
}
}]
}
}
Para obtener más información, consulte la Guía del usuario de AWS IoT Analytics.
La consola de AWS IoT Analytics también tiene una característica Inicio rápido que le permite crear un
canal, almacén de datos y canalización con un solo clic. Busque esta página cuando abra la consola
de AWS IoT Analytics:
302
AWS IoT Guía del desarrollador
Acción de eventos de IoT
Una acción iotEvents envía datos desde el mensaje MQTT que activó la regla a una entrada de
AWS IoT Events.
More information (10)
Cuando cree una regla con una acción iotEvents, debe especificar la información siguiente:
inputName
Opcional. Utilice esta opción para asegurarse de que un detector de AWS IoT Events solo
procesará una entrada (un mensaje) con un determinado messageId.
roleArn
El ARN del rol que concede permiso a AWS IoT para enviar una entrada a un detector de AWS
IoT Events. ("Action":"iotevents:BatchPutMessage").
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "iotevents:BatchPutMessage",
"Resource": [ * ]
}
}
El ejemplo JSON siguiente muestra cómo crear una regla de AWS IoT con una acción iotEvents:
{
"topicRulePayload": {
303
AWS IoT Guía del desarrollador
Acción SiteWise de IoT
"sql": "expression",
"ruleDisabled": false,
"description": "An AWS IoT Events test rule",
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"iotEvents": {
"inputName": "MyIoTEventsInput",
"messageId": "1234567890",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_events"
},
}]
}
}
Para obtener más información, consulte la Guía para desarrolladores de AWS IoT Events.
Una acción iotSiteWise envía datos desde el mensaje MQTT que activó la regla a las propiedades
de recurso de AWS IoT SiteWise.
Note
Cuando envía datos a AWS IoT SiteWise con esta acción, los datos deben cumplir todos los
requisitos de la acción BatchPutAssetPropertyValue. Para obtener más información,
consulte BatchPutAssetPropertyValue en la Referencia de la API AWS IoT SiteWise.
Puede seguir un tutorial que le muestra cómo incorporar datos de objetos de AWS IoT. Para obtener
más información, consulte Incorporación de datos a AWS IoT SiteWise desde objetos de AWS IoT en
la Guía del usuario de AWS IoT SiteWise.
Para obtener más información acerca de la solución de problemas de esta regla, consulte Solución de
problemas de una acción de regla de AWS IoT SiteWise en la Guía del usuario de AWS IoT SiteWise.
More information (11)
Cuando cree una regla con una acción iotSiteWise, debe especificar la información siguiente:
putAssetPropertyValueEntries
Una lista de entradas de valor de propiedad de recurso, en la que cada entrada contiene la
siguiente información:
entryId
Opcional. Un identificador único para esta entrada. Puede definir el entryId para facilitar el
seguimiento del mensaje que causó un error en caso de que se produzca un error. Acepta
plantillas de sustitución. El valor predeterminado es un nuevo UUID.
propertyAlias
304
AWS IoT Guía del desarrollador
Acción SiteWise de IoT
propertyId
Una lista de valores de propiedad que se van a insertar, en la que cada valor contiene una
marca temporal, la calidad y el valor (TQV) en el formato siguiente:
timestamp
Una cadena que contiene el tiempo en segundos en formato de tiempo Unix. Acepta
plantillas de sustitución. Si su carga de mensajes no tiene una marca temporal,
puede usar Timestamp() (p. 369), que devuelve la hora actual en milisegundos.
Para convertir ese tiempo en segundos, puede utilizar la siguiente plantilla de
sustitución: ${floor(timestamp() / 1E3)}.
offsetInNanos
Con respecto a la hora en formato de tiempo Unix, AWS IoT SiteWise acepta solo
entradas que tengan una marca temporal de hasta 15 minutos en el pasado y hasta 5
minutos en el futuro.
quality
Opcional. Una cadena que describe la calidad del valor. Acepta plantillas de sustitución.
Debe ser GOOD, BAD o UNCERTAIN.
value
Una estructura de valores que contiene uno de los siguientes campos de valor, en
función del tipo de datos de la propiedad del recurso:
booleanValue
Opcional. Una cadena que contiene el valor booleano de la entrada del valor. Acepta
plantillas de sustitución.
doubleValue
Opcional. Una cadena que contiene el valor "double" de la entrada del valor. Acepta
plantillas de sustitución.
integerValue
Opcional. Una cadena que contiene el valor entero de la entrada del valor. Acepta
plantillas de sustitución.
stringValue
El ARN del rol que concede a AWS IoT permiso para enviar un valor de propiedad de recurso
AWS IoT SiteWise. ("Action": "iotsitewise:BatchPutAssetPropertyValue").
305
AWS IoT Guía del desarrollador
Acción SiteWise de IoT
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iotsitewise:BatchPutAssetPropertyValue",
"Resource": "*"
}
]
}
Para mejorar la seguridad, puede especificar una ruta jerárquica de recursos de AWS IoT
SiteWise en la propiedad Condition. El siguiente ejemplo es una política de confianza que
especifica una ruta jerárquica de recursos.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iotsitewise:BatchPutAssetPropertyValue",
"Resource": "*",
"Condition": {
"StringLike": {
"iotsitewise:assetHierarchyPath": [
"/root node asset ID",
"/root node asset ID/*"
]
}
}
}
]
}
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción
iotSiteWise básica:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"iotSiteWise": {
"putAssetPropertyValueEntries": [
{
"propertyAlias": "/some/property/alias",
"propertyValues": [
{
"timestamp": {
"timeInSeconds": "${my.payload.timeInSeconds}"
},
"value": {
"integerValue": "${my.payload.value}"
}
}
]
}
],
306
AWS IoT Guía del desarrollador
Acción Kinesis
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_sitewise"
},
}]
}
}
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción
iotSiteWise: En este ejemplo se utiliza el tema como alias de propiedad y función timestamp().
Por ejemplo, si publica datos en /company/windfarm/3/turbine/7/rpm, esta acción envía los
datos a la propiedad del recurso con un alias de propiedad que es el mismo que el tema especificado.
{
"topicRulePayload": {
"sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"iotSiteWise": {
"putAssetPropertyValueEntries": [
{
"propertyAlias": "${topic()}",
"propertyValues": [
{
"timestamp": {
"timeInSeconds": "${floor(timestamp() / 1E3)}",
"offsetInNanos": "${(timestamp() % 1E3) * 1E6}"
},
"value": {
"doubleValue": "${my.payload.value}"
}
}
]
}
],
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_sitewise"
},
}]
}
}
Para obtener más información, consulte la Guía del usuario de AWS IoT SiteWise.
Acción Kinesis
Kinesis action
La acción kinesis le permite escribir los datos de mensajes de MQTT en un flujo de Kinesis.
More information (12)
Cuando cree una regla de AWS IoT con una acción kinesis, debe especificar la información
siguiente:
stream
La clave de partición utilizada para determinar en qué fragmento se escriben los datos. La
clave de partición se compone normalmente de una expresión (por ejemplo, "${topic()}" o
"${timestamp()}").
307
AWS IoT Guía del desarrollador
Acción Lambda
Note
El siguiente ejemplo de JSON muestra cómo definir una acción kinesis en una regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"kinesis": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_kinesis",
"streamName": "my_kinesis_stream",
"partitionKey": "${topic()}"
}
}],
}
}
Para obtener más información, consulte Guía para desarrolladores de Amazon Kinesis Data Streams.
Si utiliza una CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo de Kinesis
Data Streams, el servicio debe tener permiso para poder usar la CMK en nombre del autor de la
llamada. Para obtener más información, consulte Permisos para utilizar claves maestras de KMS
generadas por el usuario en la Guía del desarrollador de Amazon Kinesis Data Streams.
Acción Lambda
Lambda action
Una acción lambda llama a una función de Lambda, transfiriendo el mensaje MQTT que activó la
regla. Las funciones de Lambda se ejecutan de forma asíncrona.
More information (13)
Para que AWS IoT llame a la función de Lambda, debe configurar una política que conceda el
permiso lambda:InvokeFunction a AWS IoT. Solo puede invocar una función de Lambda
definida en la misma región en la que existe la política de Lambda. Las funciones de Lambda
utilizan políticas basadas en recursos, de modo que debe asociar la política a la propia función de
Lambda. Ejecute el siguiente comando de la CLI para asociar una política que conceda el permiso
lambda:InvokeFunction:
--function-name
Nombre de la función de Lambda cuya política de recursos está actualizando mediante la adición
de un nuevo permiso.
--region
308
AWS IoT Guía del desarrollador
Acción Lambda
--principal
La entidad principal que obtiene el permiso. Debe ser iot.amazonaws.com para que AWS IoT
pueda llamar a una función de Lambda.
--source-arn
El ARN de la regla. Puede utilizar el comando de la CLI get-topic-rule para obtener el ARN
de una regla.
--source-account
La acción Lambda que desea permitir en esta instrucción. Para permitir que AWS IoT invoque una
función de Lambda, especifique lambda:InvokeFunction.
Note
Si agrega un permiso para una entidad de seguridad de AWS IoT sin proporcionar el ARN
de origen, cualquier cuenta de AWS que cree una regla con la acción de Lambda podrá
desencadenar reglas para invocar la función Lambda desde AWS IoT.
Para obtener más información, consulte este artículo sobre el modelo de permisos de Lambda.
Cuando cree una regla con una acción lambda, debe especificar la función Lambda que se invocará
cuando se active la regla.
El ejemplo de JSON siguiente muestra una regla que llama a una función de Lambda:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"lambda": {
"functionArn": "arn:aws:lambda:us-
east-2:123456789012:function:myLambdaFunction"
}
}]
}
}
Si no especifica una versión o un alias para la función de Lambda, se ejecutará la versión más
reciente de la función. Puede especificar una versión o alias si desea ejecutar una versión específica
de su función de Lambda. Para especificar una versión o alias, añada la versión o el alias en el ARN
de la función de Lambda. Por ejemplo:
"arn:aws:lambda:us-east-2:123456789012:function:myLambdaFunction:someAlias"
Para obtener más información acerca del control de versiones y los alias, consulte Control de
versiones y alias de las funciones de AWS Lambda. Para obtener más información sobre AWS
Lambda, consulte la AWS Lambda Developer Guide.
309
AWS IoT Guía del desarrollador
Acción Republish
Si utiliza una CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo de AWS
Lambda, el servicio debe tener permiso para poder usar la CMK en nombre del autor de la llamada.
Para obtener más información, consulte Cifrado en reposo en la Guía del desarrollador de AWS
Lambda.
Acción Republish
Republish action
La acción republish le permite volver a publicar el mensaje que activó el rol, en otro tema MQTT.
More information (14)
Cuando cree una regla con una acción republish, debe especificar la información siguiente:
tema
Opcional. El nivel de calidad de servicio (QoS) que se utiliza para volver a publicar mensajes. Los
valores válidos son 0 o 1. El valor predeterminado es 0.
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
iot:Publish.
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"republish": {
"topic": "another/topic",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_republish",
"qos": 1
}
}]
}
}
Acción S3
S3 action
Una acción s3 escribe los datos desde el mensaje MQTT que activó la regla en un bucket de Amazon
S3.
310
AWS IoT Guía del desarrollador
Acción S3
Cuando cree una regla de AWS IoT con una acción s3, debe especificar la información siguiente
(excepto cannedacl, que es opcional):
bucket
Opcional. La lista de control de acceso (ACL) predefinida de Amazon S3 que controla el acceso
al objeto identificado mediante la clave de objeto. Para obtener más información, incluidos los
valores permitidos, consulte ACL predefinidas de S3.
key
La ruta al archivo en el que se escriben los datos. Por ejemplo, si el valor de este argumento es
"${topic()}/${timestamp()}", el tema al que se envió el mensaje es "this/is/my/topic". Si la marca de
tiempo actual es 1460685389, los datos se escriben en un archivo denominado "1460685389" en
la carpeta "this/is/my/topic" de Amazon S3.
Note
El uso de una clave estática hará que se sobrescriba únicamente un archivo en Amazon
S3 por cada invocación de la regla. Lo más habitual es utilizar la marca de tiempo del
mensaje u otro identificador de mensaje único, de modo que por cada mensaje recibido
se guarde un archivo nuevo en Amazon S3.
roleArn
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
s3:PutObject.
El siguiente ejemplo de JSON muestra cómo definir una acción s3 en una regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"s3": {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_s3",
"bucketName": "my-bucket",
"key": "${topic()}/${timestamp()}"
"cannedacl": "public-read"
}
}]
}
}
Para obtener más información, consulte Guía para desarrolladores de Amazon Simple Storage
Service. Si utiliza una CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo
de Amazon S3, el servicio debe tener permiso para poder usar la CMK en nombre del autor de la
llamada. Para obtener más información, consulte CMK administradas por AWS y CMK administradas
por el cliente en la Guía del desarrollador de Amazon Simple Storage Service.
311
AWS IoT Guía del desarrollador
Acción Salesforce
Acción Salesforce
Salesforce action
Una acción salesforce envía datos del mensaje MQTT que activó la regla a un flujo de entrada de
Salesforce IoT.
More information (16)
Cuando cree una regla con una acción salesforce, debe especificar la información siguiente:
url
La dirección URL expuesta por el flujo de entrada de Salesforce IoT. La dirección URL está
disponible en la plataforma de Salesforce IoT cuando crea un flujo de entrada. Para obtener más
información, consulte la documentación de Salesforce IoT.
token
El token que se utiliza para autenticar el acceso al flujo de entrada de Salesforce IoT especificado.
El token está disponible en la plataforma de Salesforce IoT cuando se crea un flujo de entrada.
Para obtener más información, consulte la documentación de Salesforce IoT.
Note
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción
salesforce:
{
"topicRulePayload": {
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"salesforce": {
"token": "ABCDEFGHI123456789abcdefghi123456789",
"url": "https://ingestion-cluster-id.my-env.sfdcnow.com/streams/stream-
id/connection-id/my-event"
}
}]
}
}
Acción SNS
SNS action
Una acción sns envía los datos del mensaje MQTT que activó la regla como notificación de inserción
de SNS.
More information (17)
Cuando cree una regla con una acción sns, debe especificar la información siguiente:
312
AWS IoT Guía del desarrollador
Acción SQS
messageFormat
El formato del mensaje. Los valores aceptados son "JSON" y "RAW." El valor predeterminado del
atributo es "RAW." SNS utiliza esta configuración para determinar si la carga debe analizarse y las
partes pertinentes de la carga específicas de la plataforma deben extraerse.
roleArn
Note
El siguiente ejemplo de JSON muestra cómo definir una acción sns en una regla de AWS IoT:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"sns": {
"targetArn": "arn:aws:sns:us-east-2:123456789012:my_sns_topic",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_sns"
}
}]
}
}
Para obtener más información, consulte Guía para desarrolladores de Amazon Simple Notification
Service. Si utiliza una CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo
de Amazon SNS, el servicio debe tener permiso para poder usar la CMK en nombre del autor de la
llamada. Para obtener más información, consulte este artículo sobre la administración de claves en la
Guía del desarrollador de Amazon Simple Notification Service.
Acción SQS
SQS action
Una acción sqs envía datos del mensaje MQTT que activó la regla a una cola de SQS.
More information (18)
Cuando cree una regla con una acción sqs, debe especificar la información siguiente:
queueUrl
Establezca esta opción en true si quiere que los datos de mensajes MQTT se codifiquen en
Base64 antes de escribir en la cola SQS. De lo contrario, establézcala en false.
roleArn
313
AWS IoT Guía del desarrollador
Acción de Step Functions
Note
Asegúrese de que el rol asociado a la regla tenga una política que conceda el permiso
sqs:SendMessage.
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción sqs:
{
"topicRulePayload": {
"sql": "SELECT * FROM 'some/topic'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"sqs": {
"queueUrl": "https://sqs.us-east-2.amazonaws.com/123456789012/
my_sqs_queue",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_sqs",
"useBase64": false
}
}]
}
}
La acción de SQS no es compatible con las colas FIFO de SQS. Dado que el motor de reglas es un
servicio totalmente distribuido, no se garantiza el orden de los mensajes cuando se activa la acción de
SQS.
Para obtener más información, consulte Guía para desarrolladores de Amazon Simple Queue Service.
Si utiliza una CMK de AWS KMS administrada por el cliente para cifrar los datos en reposo de Amazon
SQS, el servicio debe tener permiso para poder usar la CMK en nombre del autor de la llamada.
Para obtener más información, consulte este artículo sobre la administración de claves en la Guía del
desarrollador de Amazon Simple Queue Service.
Una acción stepFunctions inicia la ejecución de una máquina de estado de Step Functions.
More information (19)
Cuando cree una regla con una acción stepFunctions, debe especificar la información siguiente:
executionNamePrefix
El ARN del rol que concede a AWS IoT permisos para iniciar la ejecución de una máquina de
estado ("Action":"states:StartExecution").
314
AWS IoT Guía del desarrollador
Solución de problemas de las reglas
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "states:StartExecution",
"Resource": [ * ]
}
}
El ejemplo de JSON siguiente muestra cómo crear una regla de AWS IoT con una acción
stepFunctions:
{
"topicRulePayload": {
"sql": "expression",
"ruleDisabled": false,
"description": "A step functions test rule",
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"stepFunctions": {
"executionNamePrefix": "myExecution",
"stateMachineName": "myStateMachine",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_step_functions"
}
}]
}
}
Para obtener más información, consulte Guía para desarrolladores de AWS Step Functions.
Si se produce un problema al activar una acción, el motor de reglas activa una acción de error si se
especificó una para la regla. Esto podría ocurrir cuando:
315
AWS IoT Guía del desarrollador
Ejemplo de acción de error
{
"ruleName": "TestAction",
"topic": "testme/action",
"cloudwatchTraceId": "7e146a2c-95b5-6caf-98b9-50e3969734c7",
"clientId": "iotconsole-1511213971966-0",
"base64OriginalPayload": "ewogICJtZXNzYWdlIjogIkhlbGxvIHZyb20gQVdTIElvVCBjb25zb2xlIgp9",
"failures": [
{
"failedAction": "S3Action",
"failedResource": "us-east-1-s3-verify-user",
"errorMessage": "Failed to put S3 object. The error received was The
specified bucket does not exist (Service: Amazon S3; Status Code: 404; Error
Code: NoSuchBucket; Request ID: 9DF5416B9B47B9AF; S3 Extended Request ID:
yMah1cwPhqTH267QLPhTKeVPKJB8BO5ndBHzOmWtxLTM6uAvwYYuqieAKyb6qRPTxP1tHXCoR4Y=).
Message arrived on: error/action, Action: s3, Bucket: us-
east-1-s3-verify-user, Key: \"aaa\". Value of x-amz-id-2:
yMah1cwPhqTH267QLPhTKeVPKJB8BO5ndBHzOmWtxLTM6uAvwYYuqieAKyb6qRPTxP1tHXCoR4Y="
}
]
}
ruleName
{
"sql" : "SELECT * FROM ..."
"actions" : [{
"dynamoDB" : {
"table" : "PoorlyConfiguredTable",
316
AWS IoT Guía del desarrollador
Trabajar con destinos de reglas de temas
"hashKeyField" : "AConstantString",
"hashKeyValue" : "AHashKey"}}
],
"errorAction" : {
"s3" : {
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_s3",
"bucket" : "message-processing-errors",
"key" : "${replace(topic(), '/', '-') + '-' + timestamp() + '-' + newuuid()}"
}
}
}
Puede utilizar cualquier función o sustitución en una instrucción SQL de la acción de error, excepto en
funciones externas (por ejemplo, get_thing_shadow, aws_lambda y machinelearning_predict).
Para obtener más información acerca de reglas y cómo especificar una acción de error, consulte Creación
de una regla de AWS IoT (p. 288).
Para obtener más información sobre el uso de CloudWatch para monitorizar el éxito o el fracaso de las
reglas, consulte Métricas y dimensiones de AWS IoT (p. 230).
Los destinos de reglas de temas se utilizan para comprobar que usted es el propietario del punto de enlace
al que desea enviar los datos o tiene acceso a él. Cuando crea una acción de regla con un punto de enlace
(por ejemplo, una acción http) o actualiza el punto de enlace de una acción de regla existente, AWS
IoT envía un mensaje de confirmación al punto de enlace que contiene un token único. Para verificar su
punto de enlace, debe llamar a ConfirmTopicRuleDestination con el token para verificar que usted
es el propietario del punto de enlace o tiene acceso a él. El token es válido durante tres días, después
de los cuales debe crear una nueva acción http o llamar a la API UpdateTopicRuleDestination
para reiniciar el proceso de confirmación. También puede confirmar el destino de la regla del tema
desplazándose hasta enableUrl o proporcionando el token en la página Destination (Destino) de la
consola de AWS IoT.
Cuando AWS IoT recibe el token enviado a su punto de enlace, se confirma el destino. Debe habilitar el
destino para que lo pueda utilizar el motor de reglas. Un destino puede tener cualquiera de los siguientes
estados:
ENABLED
El destino está habilitado. Un destino debe tener el estado ENABLED para que se utilice en una regla.
Solo puede habilitar destinos con el estado DISABLED.
DISABLED
El destino se ha confirmado pero está deshabilitado. Esto es útil si desea impedir temporalmente el
tráfico a su punto de enlace sin tener que pasar de nuevo por el proceso de confirmación. Solo puede
deshabilitar un destino con el estado ENABLED.
IN_PROGRESS
317
AWS IoT Guía del desarrollador
Creación de un destino de regla del tema
Una vez confirmados y habilitados, los destinos se pueden utilizar con cualquier regla de su cuenta.
Al crear un destino, AWS IoT comprueba que la dirección URL del punto de enlace sea válida. Si la URL
es válida, se envía un mensaje de confirmación a esa URL. La solicitud de confirmación tiene el siguiente
formato:
arn
El token de confirmación. El token del ejemplo está truncado. Su token será mayor.
enableUrl
La dirección URL a la que se desplaza para confirmar el destino de una regla del tema.
messageType
Tipo de mensaje.
El token debe ser válido para que el destino adopte el estado ENABLED. Si el token ha caducado, debe
llamar a UpdateTopicRuleDestination para reiniciar el proceso de confirmación.
Note
318
AWS IoT Guía del desarrollador
Deshabilitación de un destino de regla del tema
Para utilizar Basic Ingest, los mensajes se envían desde los dispositivos o aplicaciones con los nombres de
temas que empiezan con $aws/rules/rule-name como sus tres primeros niveles, donde rule-name
es el nombre de la regla de AWS IoT que desencadenar.
Puede utilizar una regla existente con Basic Ingest simplemente añadiendo el prefijo de Basic Ingest
($aws/rules/rule-name) al tema del mensaje por el que normalmente se desencadena la regla.
Por ejemplo, si tiene una regla llamada BuildingManager que se desencadena mediante mensajes
con temas como Buildings/Building5/Floor2/Room201/Lights ("sql": "SELECT * FROM
'Buildings/#'"), podrá desencadenar la misma regla con Basic Ingest enviando un mensaje con el
tema $aws/rules/BuildingManager/Buildings/Building5/Floor2/Room201/Lights.
• Sus dispositivos y sus reglas no pueden suscribirse a temas reservados para Basic Ingest. Para obtener
más información, consulte Temas reservados (p. 267).
• Si necesita un agente de publicación/suscripción para distribuir mensajes a varios suscriptores (por
ejemplo para entregar mensajes a otros dispositivos y al motor de reglas), debe seguir utilizando el
agente de mensajes de AWS IoT para gestionar la distribución de los mensajes. Solo tiene que publicar
sus mensajes en temas que no sean temas de Basic Ingest.
319
AWS IoT Guía del desarrollador
Referencia de la SQL de AWS IoT
política con $aws/rules/rule-name/*. De lo contrario, los dispositivos y las aplicaciones podrán seguir
utilizando las conexiones existentes con AWS IoT Core.
Cuando el mensaje llega al motor de reglas, no existe diferencia alguna en la ejecución o en la gestión de
los errores entre reglas desencadenadas desde Basic Ingest y las desencadenadas a través suscripciones
al agente de mensajes.
Puede, por supuesto, crear reglas para usarlas con Basic Ingest. Tenga en cuenta lo siguiente:
SELECT
La cláusula SELECT admite Tipos de datos (p. 325), Operadores (p. 328), Funciones (p. 334),
Literales (p. 372), Instrucciones case (p. 372), Extensiones JSON (p. 373), Plantillas de
sustitución (p. 373) y Consultas de objetos anidados (p. 374).
FROM
El filtro de temas de mensajes de MQTT. La regla se activa para cada mensaje enviado a un tema de
MQTT que coincide con el filtro especificado aquí. Obligatorio para reglas que se activan mediante
mensajes que pasan por el agente de mensajes. Opcional para reglas que solo se activan mediante la
característica Basic Ingest (p. 319).
WHERE
Opcional. Agrega lógica condicional que determina si se llevan a cabo las acciones especificadas por
una regla.
La cláusula WHERE admite Tipos de datos (p. 325), Operadores (p. 328), Funciones (p. 334),
Literales (p. 372), Instrucciones case (p. 372), Extensiones JSON (p. 373), Plantillas de
sustitución (p. 373) y Consultas de objetos anidados (p. 374).
320
AWS IoT Guía del desarrollador
Cláusula SELECT
Un mensaje MQTT de ejemplo (también denominado carga de entrada) tiene este aspecto:
{
"color":"red",
"temperature":100
}
Si este mensaje se publica en el tema 'a/b', la regla se activa y se evalúa la instrucción SQL. La
instrucción SQL extrae el valor de la propiedad color si la propiedad "temperature" es superior a 50.
La cláusula WHERE especifica la condición temperature > 50. La palabra clave AS cambia el nombre
de la propiedad "color" a "rgb". El resultado (también denominado carga de salida) tiene este aspecto:
{
"rgb":"red"
}
Estos datos se reenvían después a la acción de la regla, que envía los datos para seguirlos procesando.
Para obtener más información sobre las acciones de las reglas, consulte Acciones de reglas de AWS
IoT (p. 292).
Cláusula SELECT
La cláusula SELECT de AWS IoT es básicamente la misma que la cláusula SELECT ANSI SQL con
algunas diferencias menores.
La cláusula SELECT admite Tipos de datos (p. 325), Operadores (p. 328), Funciones (p. 334),
Literales (p. 372), Instrucciones case (p. 372), Extensiones JSON (p. 373), Plantillas de
sustitución (p. 373) y Consultas de objetos anidados (p. 374).
Puede utilizar la cláusula SELECT para extraer información de los mensajes MQTT de entrada. También
puede utilizar SELECT * para recuperar toda la carga del mensaje de entrada. Por ejemplo:
Si la carga es un objeto JSON, puede hacer referencia a claves en el objeto. La carga de salida contiene el
par clave-valor. Por ejemplo:
Puede utilizar la palabra clave AS para cambiar el nombre de las claves. Por ejemplo:
Puede seleccionar varios elementos separándolos con una coma. Por ejemplo:
321
AWS IoT Guía del desarrollador
Cláusula SELECT
Puede seleccionar varios elementos incluido '*' para agregar elementos a la carga de entrada. Por ejemplo:
Puede utilizar la palabra clave "VALUE" para generar cargas de salida que no sean objetos JSON. Con la
versión 2015-10-08 de SQL, solo se puede seleccionar un elemento. Con la versión SQL 2016-03-23 o
posterior, también puede seleccionar una matriz para generar como objeto de nivel superior.
Example
Puede utilizar la sintaxis '.' para explorar objetos JSON anidados en la carga de entrada. Por ejemplo:
Puede utilizar funciones (consulte Funciones (p. 334)) para transformar la carga de entrada. Puede
utilizar paréntesis para realizar agrupaciones. Por ejemplo:
Si desea utilizar * para hacer referencia a la carga del mensaje como datos binarios sin procesar, debe
seguir estas reglas:
1. La instrucción SQL y las plantillas no deben hacer referencia a nombres JSON, salvo a *.
2. La instrucción SELECT debe incluir * como único elemento, o debe contener solo funciones, por
ejemplo:
Para las acciones de regla que no admiten la entrada de carga útil binaria, como la acción de Lambda,
debe decodificar las cargas útiles binarias. La acción de la regla de Lambda puede recibir datos binarios si
está codificado en base64 y en una carga JSON. Puede hacer esto cambiando la regla a:
322
AWS IoT Guía del desarrollador
Cláusula FROM
No puede utilizar la siguiente cláusula SELECT con cargas binarias porque hace referencia a
device_type en la cláusula WHERE.
No puede utilizar la cláusula SELECT siguiente con cargas binarias porque infringe la regla n.º 2.
Puede utilizar la siguiente cláusula SELECT con cargas binarias porque cumple con la regla n.º 1 o la regla
n.º 2.
No puede utilizar la siguiente regla de AWS IoT con cargas binarias porque infringe la regla n.º 1.
{
"sql": "SELECT * FROM 'a/b'"
"actions": [{
"republish": {
"topic":"device/${device_id}"
}
}]
}
Cláusula FROM
La cláusula FROM suscribe a su regla a un tema o un filtro de temas. Debe incluir el tema o el filtro de
temas entre comillas simples ('). La regla se activa para cada mensaje enviado a un tema de MQTT que
coincide con el filtro de temas especificado aquí. Un filtro de temas le permite suscribirse a un grupo de
temas similares.
Ejemplo:
La regla se suscribe a 'a/b', por lo que la carga de entrada se pasa a la regla. La carga de salida, que
se pasa a las acciones de regla, es: {t: 50}. La regla no está suscrita a 'a/c', por lo que la regla no se
activa para el mensaje publicado en 'a/c'.
Ejemplo de comodín #:
323
AWS IoT Guía del desarrollador
Cláusula WHERE
Puede utilizar el carácter comodín '#' (multinivel) para buscar coincidencias con uno o varios elementos de
ruta en particular:
La regla está suscrita a todos los temas que empiecen por 'a', por lo que se ejecutará tres veces y
enviará cargas de salida de {t: 50} (para a/b), {t: 60} (para a/c) y {t: 70} (para a/e/f) a sus
acciones. No está suscrita a 'b/x', por lo que la regla no se activa para el mensaje {temperature:
80}.
Ejemplo de comodín +:
Puede utilizar el carácter comodín '+' (nivel único) para buscar coincidencias con cualquier elemento de
ruta en particular:
La regla está suscrita a todos los temas que tengan dos elementos de ruta donde el primer elemento
sea 'a'. La regla se ejecuta para los mensajes enviados a 'a/b' y 'a/c', pero no para los mensajes
enviados a 'a/e/f' ni 'b/x'.
Cláusula WHERE
La cláusula WHERE determina si se llevan a cabo las acciones especificadas por una regla. Si la cláusula
WHERE se evalúa en true, se llevan a cabo las acciones de la regla. De lo contrario, las acciones de la
regla no se llevan a cabo.
La cláusula WHERE admite Tipos de datos (p. 325), Operadores (p. 328), Funciones (p. 334),
Literales (p. 372), Instrucciones case (p. 372), Extensiones JSON (p. 373), Plantillas de
sustitución (p. 373) y Consultas de objetos anidados (p. 374).
Ejemplo:
SQL: SELECT color AS my_color FROM 'a/b' WHERE temperature > 50 AND color <>
'red'.
En este caso, la regla se activa, pero las acciones especificadas por la regla no se llevarán a cabo. No
habrá carga de salida.
Puede utilizar funciones y operadores en la cláusula WHERE. Sin embargo, no puede hacer referencia
a ningún alias creado con la palabra clave AS en la cláusula SELECT. La cláusula WHERE se evalúa en
primer lugar para determinar si SELECT debe evaluarse.
324
AWS IoT Guía del desarrollador
Tipos de datos
Tipos de datos
El motor de reglas de AWS IoT admite todos los tipos de datos JSON.
{"foo":null, "bar":undefined}
{"foo":null}
325
AWS IoT Guía del desarrollador
Tipos de datos
Conversiones
En la tabla siguiente se muestra una lista de los resultados que se producen cuando un valor de un tipo se
convierte en otro tipo (cuando se da un valor de tipo incorrecto a una función). Por ejemplo, si a la función
de valor absoluto "abs" (que espera un valor Int o Decimal) se le da un valor String, esta función
intentará convertir el valor String en un valor Decimal, de acuerdo con estas reglas. En este caso, 'abs
("-5.123")' se trata como 'abs(-5.123)'.
Note
En valor decimal
Matriz Undefined.
Objeto Undefined.
Null Null.
En valor entero
326
AWS IoT Guía del desarrollador
Tipos de datos
Matriz Undefined.
Objeto Undefined.
Null Null.
En valor booleano
Matriz Undefined.
Objeto Undefined.
Null Undefined.
En cadena
327
AWS IoT Guía del desarrollador
Operadores
Null Undefined.
Operadores
Los operadores siguientes se pueden utilizar en las cláusulas SELECT y WHERE.
Operador AND
Devuelve un resultado Boolean. Realiza una operación AND lógica. Devuelve el valor true si los
operandos izquierdo y derecho son true. De lo contrario, devuelve el valor false. Se necesitan operandos
de tipo Boolean u operandos de cadena "true" o "false" que no distingan entre mayúsculas y minúsculas.
Operador AND
String/Boolean String/Boolean Si todas las cadenas son "true" o "false" (no se distingue entre
mayúsculas y minúsculas), se convierten en valores de tipo
Boolean y se procesan normalmente como boolean AND
boolean.
Operador OR
Devuelve un resultado Boolean. Realiza una operación OR lógica. Devuelve el valor true si el operando
izquierdo o el operando derecho es true. De lo contrario, devuelve el valor false. Se necesitan operandos
de tipo Boolean u operandos de cadena "true" o "false" que no distingan entre mayúsculas y minúsculas.
Operador OR
328
AWS IoT Guía del desarrollador
Operadores
String/Boolean String/Boolean Si todas las cadenas son "true" o "false" (no se distingue
entre mayúsculas y minúsculas), se convierten en valores
booleanos y se procesan normalmente como boolean OR
boolean.
Operador NOT
Devuelve un resultado Boolean. Realiza una operación NOT lógica. Devuelve true si el operado es false.
De lo contrario, devuelve true. Se necesita un operando Boolean o un operando de cadena "true" o "false"
que no distinga entre mayúsculas y minúsculas.
Operador NOT
Operando Salida
Operador >
Devuelve un resultado Boolean. Devuelve el valor true si el operando izquierdo es superior al operando
derecho. Los dos operandos se convierten en un valor Decimal y, a continuación, se comparan.
> operador
329
AWS IoT Guía del desarrollador
Operadores
Operador >=
Devuelve un resultado Boolean. Devuelve el valor true si el operando izquierdo es superior o igual al
operando derecho. Los dos operandos se convierten en un valor Decimal y, a continuación, se comparan.
>= operador
Operador <
Devuelve un resultado Boolean. Devuelve el valor true si el operando izquierdo es inferior al operando
derecho. Los dos operandos se convierten en un valor Decimal y, a continuación, se comparan.
Operador <
Operador <=
Devuelve un resultado Boolean. Devuelve el valor true si el operando izquierdo es inferior o igual al
operando derecho. Los dos operandos se convierten en un valor Decimal y, a continuación, se comparan.
330
AWS IoT Guía del desarrollador
Operadores
Operador <=
Operador <>
Devuelve un resultado Boolean. Devuelve el valor true si los operandos izquierdo y derecho no son
iguales. De lo contrario, devuelve el valor false.
Operador <>
Objeto Objeto True si las claves y los valores de cada operando no son
iguales. De lo contrario, devuelve false. El orden de las claves
y los valores no tiene importancia.
Operador =
Devuelve un resultado Boolean. Devuelve el valor true si los operandos izquierdo y derecho son iguales.
De lo contrario, devuelve el valor false.
331
AWS IoT Guía del desarrollador
Operadores
Operador =
Matriz Matriz True si los elementos de cada operando son iguales y están
en el mismo orden. De lo contrario, devuelve false.
Objeto Objeto True si las claves y los valores de cada operando son iguales.
De lo contrario, devuelve false. El orden de las claves y los
valores no tiene importancia.
Operador +
El símbolo "+" es un operador sobrecargado. Se puede utilizar para la concatenación o la adición de
cadenas.
Operador +
String Cualquier valor Convierte el operando derecho en una cadena que concatena
al final del operando izquierdo.
332
AWS IoT Guía del desarrollador
Operadores
Operador -
Resta el operando derecho del operando izquierdo.
Operador -
Operador *
Multiplica el operando izquierdo por el operando derecho.
Operador *
Operador /
Divide el operando izquierdo por el operando derecho.
333
AWS IoT Guía del desarrollador
Funciones
Operador /
Operador %
Devuelve el resto de la división del operando izquierdo por el operando derecho.
Operador %
Funciones
Puede utilizar las funciones integradas siguientes en las cláusulas SELECT o WHERE de sus expresiones
SQL.
abs(Decimal)
Devuelve el valor absoluto de un número. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
334
AWS IoT Guía del desarrollador
Funciones
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
Accountid()
Devuelve el ID de la cuenta que posee esta regla como un valor de tipo String. Es compatible con la
versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
accountid() = "123456789012"
acos(Decimal)
Devuelve el coseno inverso de un número en radianes. Los argumentos Decimal se redondean con doble
precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
335
AWS IoT Guía del desarrollador
Funciones
asin(Decimal)
Devuelve el seno inverso de un número en radianes. Los argumentos Decimal se redondean con doble
precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
atan(Decimal)
Devuelve la tangente inversa de un número en radianes. Los argumentos Decimal se redondean con
doble precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y
versiones posteriores.
Boolean Undefined.
336
AWS IoT Guía del desarrollador
Funciones
Matriz Undefined.
Objeto Undefined.
Null Undefined.
atan2(Decimal, decimal)
Devuelve el ángulo, en radianes, entre el eje x positivo y el punto (x, y) definido en los dos argumentos. El
ángulo es positivo para los ángulos en sentido contrario a las agujas del reloj (plano medio superior y > 0)
y es negativo para los ángulos que siguen el sentido de las agujas del reloj (plano medio inferior y < 0). Los
argumentos Decimal se redondean con doble precisión antes de aplicar la función. Es compatible con la
versión 2015-10-08 de SQL y versiones posteriores.
aws_lambda(functionArn, inputJson)
Llama a la función de Lambda especificada que pasa inputJson a la función de Lambda y devuelve el
JSON generado por la función de Lambda.
Argumentos
Argumento Descripción
337
AWS IoT Guía del desarrollador
Funciones
--function-name
Nombre de la función de Lambda cuya política de recursos está actualizando mediante la adición de
un nuevo permiso.
--region
La entidad principal que obtiene el permiso. Debe ser iot.amazonaws.com para que AWS IoT
pueda llamar a una función de Lambda.
--source-arn
El ARN de la regla. Puede utilizar el comando de la CLI get-topic-rule para obtener el ARN de una
regla.
--source-account
La acción Lambda que desea permitir en esta instrucción. Para permitir que AWS IoT invoque una
función de Lambda, especifique lambda:InvokeFunction.
Note
Si agrega un permiso para una entidad de seguridad de AWS IoT sin proporcionar el ARN
de origen, cualquier cuenta de AWS que cree una regla con la acción de Lambda podrá
desencadenar reglas para invocar la función Lambda desde AWS IoT. Para obtener más
información, consulte Lambda Permission Model.
{
"attribute1": 21,
"attribute2": "value"
}
La función aws_lambda se puede utilizar para llamar a funciones de Lambda de la siguiente manera:
SELECT
aws_lambda("arn:aws:lambda:us-east-1:account_id:function:lambda_function",
{"payload":attribute1}) as output FROM 'a/b'
Si desea pasar la carga del mensaje MQTT completa, puede especificar la carga JSON mediante '*'. Por
ejemplo:
SELECT
aws_lambda("arn:aws:lambda:us-east-1:account_id:function:lambda_function", *) as output
FROM 'a/b'
338
AWS IoT Guía del desarrollador
Funciones
El motor de reglas limita la duración de la ejecución de las funciones de Lambda. Las llamadas a
funciones de Lambda desde las reglas deben completarse en 2000 milisegundos.
bitand(Int, int)
Ejecuta una operación AND bit a bit en las representaciones de bits de los dos argumentos Int(-
convertidos). Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: bitand(13, 5) = 5
bitor(Int, int)
Realiza una operación OR bit a bit de las representaciones de bit de los dos argumentos. Es compatible
con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: bitor(8, 5) = 13
339
AWS IoT Guía del desarrollador
Funciones
bitxor(Int, int)
Ejecuta una operación XOR bit a bit en las representaciones de bits de los dos argumentos Int(-
convertidos). Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:bitor(13, 5) = 8
bitnot(Int)
Ejecuta una operación NOT bit a bit en las representaciones de bits del argumento Int (convertido). Es
compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: bitnot(13) = 2
Decimal Int, una operación NOT bit a bit del argumento. El valor
Decimal se redondea al valor Int inferior más cercano.
String Int, una operación NOT bit a bit del argumento. Las
cadenas se convierten en decimales y se redondean al
valor Int inferior más cercano. Si se produce un error en
la conversión, el resultado obtenido es Undefined.
Cast()
Convierte un valor de un tipo de datos a otro tipo. Cast se comporta básicamente como las conversiones
estándar, salvo que puede convertir números en valores booleanos o viceversa. Si AWS IoT no puede
determinar cómo convertir un tipo en otro, el resultado es Undefined. Es compatible con la versión
2015-10-08 de SQL y versiones posteriores. Formato: cast(valor as tipo).
Ejemplo:
340
AWS IoT Guía del desarrollador
Funciones
Las siguientes palabras clave pueden aparecer después de "as" cuando se llama a cast:
Reglas de conversión:
Conversión en decimal
Matriz Undefined.
Objeto Undefined.
Null Undefined.
341
AWS IoT Guía del desarrollador
Funciones
Conversión en entero
Matriz Undefined.
Objeto Undefined.
Null Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
342
AWS IoT Guía del desarrollador
Funciones
Conversión en cadenas
Null Undefined.
ceil(Decimal)
Redondea el valor Decimal indicado al valor Int superior más cercano. Es compatible con la versión
2015-10-08 de SQL y versiones posteriores.
Ejemplos:
ceil(1.2) = 2
ceil(-1.2) = -1
343
AWS IoT Guía del desarrollador
Funciones
chr(String)
Devuelve el carácter ASCII que corresponde al argumento Int determinado. Es compatible con la versión
2015-10-08 de SQL y versiones posteriores.
Ejemplos:
chr(65) = "A".
chr(49) = "1".
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
Clientid()
Devuelve el ID del cliente MQTT que envía el mensaje o n/a si el mensaje no se ha enviado por MQTT.
Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
clientid() = "123456789012"
Concat()
Concatena matrices o cadenas. Esta función acepta cualquier cantidad de argumentos y devuelve un valor
String o un valor Array. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
concat() = Undefined.
concat(1) = "1".
344
AWS IoT Guía del desarrollador
Funciones
concat("he","is","man") = "heisman"
0 Undefined.
cos(Decimal)
Devuelve el coseno de un número en radianes. Los argumentos Decimal se redondean con doble
precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Ejemplo:
cos(0) = 1.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
345
AWS IoT Guía del desarrollador
Funciones
cosh(Decimal)
Devuelve el coseno hiperbólico de un número en radianes. Los argumentos Decimal se redondean con
doble precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y
versiones posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
encode(value, encodingScheme)
Utilice la función encode para codificar la carga, que puede estar constituida por datos que no son JSON,
en su representación de cadena basada en el esquema de codificación. Es compatible con la versión SQL
2016-03-23 y versiones posteriores.
value
Cualquiera de las expresiones válidas, tal y como se define en Referencia de la SQL de AWS
IoT (p. 320). Puede especificar * para codificar toda la carga, con independencia de si está en
formato JSON o no. Si suministra una expresión, el resultado de la evaluación se convierte en una
cadena antes de codificarla.
encodingScheme
Una cadena literal que representa el esquema de codificación que desea utilizar. En la actualidad, solo
se admite 'base64'.
endswith(String, string)
Devuelve un valor Boolean que indica si el primer argumento String termina con el segundo argumento
String. Si alguno de los argumentos es Null o Undefined, el resultado es Undefined. Es compatible
con la versión 2015-10-08 de SQL y versiones posteriores.
346
AWS IoT Guía del desarrollador
Funciones
exp(Decimal)
Devuelve e elevado al argumento Decimal. Los argumentos Decimal se redondean con doble precisión
antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Ejemplo: exp(1) = e.
floor(Decimal)
Redondea a la baja el valor Decimal indicado al valor Int más cercano. Es compatible con la versión
2015-10-08 de SQL y versiones posteriores.
Ejemplos:
floor(1.2) = 1
floor(-1.2) = -2
347
AWS IoT Guía del desarrollador
Funciones
Get
Extrae un valor de un tipo de recopilación (array, string, object). No se aplica ninguna conversión al primer
argumento. La conversión se aplica tal y como se documenta en la tabla del segundo argumento. Es
compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
get("abc", 1) = "b"
tableName
Nombre de la tabla de particiones. Para obtener más información, consulte .Claves de DynamoDB
348
AWS IoT Guía del desarrollador
Funciones
partitionKeyValue
Valor de la clave de partición utilizada para identificar un registro. Para obtener más información,
consulte .Claves de DynamoDB
sortKeyName
Opcional. Nombre de la clave de ordenación. Este parámetro solo es necesario si la tabla DynamoDB
consultada utiliza una clave compuesta. Para obtener más información, consulte .Claves de
DynamoDB
SortKeyValue
Opcional. Valor de la clave de ordenación. Este parámetro solo es necesario si la tabla DynamoDB
consultada utiliza una clave compuesta. Para obtener más información, consulte .Claves de
DynamoDB
roleArn
El ARN de un rol de IAM que concede acceso a la tabla de DynamoDB. El motor de reglas asume
este rol para acceder a la tabla DynamoDB en su nombre. Evite usar un rol excesivamente permisivo.
Otorgue al rol solo los permisos requeridos por la regla. A continuación se muestra un ejemplo de
política que concede acceso a una tabla DynamoDB.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "dynamodb:GetItem",
"Resource": "arn:aws:dynamodb:aws-region:account-id:table/table-name"
}
]
}}
Como ejemplo de cómo puede usar get_dynamodb(), supongamos que tiene una tabla DynamoDB que
contiene el ID de dispositivo e información de ubicación para todos los dispositivos conectados a AWS IoT.
La siguiente instrucción SELECT utiliza la función get_dynamodb() para recuperar la ubicación del ID de
dispositivo especificado:
• Puede llamar a get_dynamodb() un máximo de una vez por instrucción SQL. Llamar a
get_dynamodb() varias veces en una sola instrucción SQL hace que la regla termine sin
invocar ninguna acción.
• Si get_dynamodb() devuelve más de 8 KB de datos, no se puede invocar la acción de la
regla.
get_thing_shadow(thingName, roleARN)
Muestra la sombra del elemento especificado. Es compatible con la versión SQL 2016-03-23 y versiones
posteriores.
thingName
349
AWS IoT Guía del desarrollador
Funciones
roleArn
Ejemplo:
WHERE get_thing_shadow("MyThing","arn:aws:iam::123456789012:role/
AllowsThingShadowAccess") .state.reported.alarm = 'ON'
Funciones de hash
AWS IoT ofrece las siguientes funciones de hash:
• md2
• md5
• sha1
• sha224
• sha256
• sha384
• sha512
Todas las funciones de hash esperan un argumento de cadena. El resultado es el valor con hash de dicha
cadena. Las conversiones de cadena estándar se aplican a los argumentos que no son cadenas. Todas
las funciones de hash son compatibles con la versión 2015-10-08 de SQL y con versiones posteriores.
Ejemplos:
md2("hello") = "a9046c73e00331af68917d3804f70655"
md5("hello") = "5d41402abc4b2a76b9719d911017c592"
indexof(String, string)
Devuelve el primer índice (basado en 0) del segundo argumento como subcadena del primer argumento.
Se espera que ambos argumentos sean cadenas. Los argumentos que no sean cadenas están sujetos
a las reglas de conversión estándar de cadenas. Esta función no se aplica a matrices, únicamente a
cadenas. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
indexof("abcd", "bc") = 1
isNull()
Devuelve verdadero si el argumento es el valor Null. Es compatible con la versión 2015-10-08 de SQL y
versiones posteriores.
Ejemplos:
isNull(5) = false.
isNull(Null) = true.
350
AWS IoT Guía del desarrollador
Funciones
Int false
Decimal false
Boolean false
String false
Array false
Object false
Null true
Undefined false
isUndefined()
Devuelve verdadero si el argumento tiene el valor Undefined. Es compatible con la versión SQL
2016-03-23 y versiones posteriores.
Ejemplos:
isUndefined(5) = false.
isUndefined(floor([1,2,3]))) = true.
Int false
Decimal false
Boolean false
String false
Array false
Object false
Null false
Undefined true
length(String)
Devuelve el número de caracteres de la cadena suministrada. Se aplican las reglas de conversión
estándar a los argumentos que no sean String. Es compatible con la versión 2015-10-08 de SQL y
versiones posteriores.
Ejemplos:
length("hi") = 2
length(false) = 5
351
AWS IoT Guía del desarrollador
Funciones
ln(Decimal)
Devuelve el logaritmo natural del argumento. Los argumentos Decimal se redondean con doble precisión
antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Ejemplo: ln(e) = 1.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
log(Decimal)
Devuelve el logaritmo decimal del argumento. Los argumentos Decimal se redondean con doble precisión
antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
352
AWS IoT Guía del desarrollador
Funciones
lower(String)
Muestra la versión en minúsculas del valor String indicado. Los argumentos que no son cadenas se
convierten en cadenas con las reglas de conversión estándar. Es compatible con la versión 2015-10-08 de
SQL y versiones posteriores.
Ejemplos:
lower("HELLO") = "hello".
lower(["HELLO"]) = "[\"hello\"]".
lpad(String, int)
Devuelve el argumento String, rellenado en el lado izquierdo con el número de espacios especificado
por el segundo argumento. El argumento Int debe estar comprendido entre 0 y 1000. Si el valor
proporcionado se encuentra fuera de este rango válido, el argumento se establece en el valor válido más
cercano (0 o 1000). Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
lpad(1, 3) = "1"
ltrim(String)
Elimina todos los espacios en blanco del principio (tabuladores y espacios) del valor String
proporcionado. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
353
AWS IoT Guía del desarrollador
Funciones
Ejemplo:
Null Undefined.
machinelearning_predict(modelId)
Utilice la función machinelearning_predict para realizar predicciones con los datos de un mensaje
MQTT basado en un modelo Amazon Machine Learning (Amazon ML). Es compatible con la versión
2015-10-08 de SQL y versiones posteriores. Los argumentos de la función machinelearning_predict
son:
modelId
El ID del modelo en el que se ejecutará la predicción. El punto de enlace en tiempo real del modelo
debe estar activado.
roleArn
Los datos que van a transmitirse a la API de previsión Amazon ML. Debe representarse como un
objeto JSON de capa única. Si el registro es un objeto JSON de varias capas, el registro se aplana
serializando sus valores. Por ejemplo, el JSON siguiente:
se convertiría en:
354
AWS IoT Guía del desarrollador
Funciones
predictedLabel
El algoritmo utilizado por Amazon ML para realizar las predicciones. El valor debe ser SGD.
predictedScores
mod(Decimal, decimal)
Devuelve el resto de la división del primer argumento por el segundo argumento. Es igual que
remainder(Decimal, decimal) (p. 361). También puede utilizar "%" como un operador infijo para la misma
funcionalidad modulo. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: mod(8, 3) = 2.
nanvl(AnyValue, AnyValue)
Devuelve el primer argumento si es un Decimal válido. De lo contrario, se devuelve el segundo
argumento. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: Nanvl(8, 3) = 8.
355
AWS IoT Guía del desarrollador
Funciones
Newuuid()
Devuelve un UUID aleatorio de 16 bytes. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
numbytes(String)
Devuelve el número de bytes de la codificación UTF-8 de la cadena proporcionada. Se aplican las reglas
de conversión estándar a los argumentos que no sean String. Es compatible con la versión 2015-10-08
de SQL y versiones posteriores.
Ejemplos:
numbytes("hi") = 2
numbytes("€") = 3
Principal()
Devuelve la entidad principal que utiliza el dispositivo para la autenticación. La entidad principal que se
devuelve depende de cómo se publicó el mensaje de activación. En la siguiente tabla se describe la
entidad principal devuelta para cada método y protocolo de publicación.
SDK de dispositivos de AWS IoT MQTT a través de WebSocket Usuario o rol de IAM
En los siguientes ejemplos se muestran los distintos tipos de valores devueltos por principal:
356
AWS IoT Guía del desarrollador
Funciones
pattern
(String) Un patrón de fecha y hora que se ajusta al formato estándar ISO 8601. (En concreto, la
función admite formatos Joda-Time).
timestamp
(Long) La hora que se va a formatear en milisegundos a partir del formato de hora Unix. Consulte la
función Timestamp() (p. 369).
timezone
Ejemplos:
Cuando este mensaje se publica en el tema "A/B", la carga {"ts": "1970.01.01 AD at 21:46:40
CST"} se envía al bucket de S3:
{
"ruleArn": "arn:aws:iot:us-east-2:ACCOUNT_ID:rule/RULE_NAME",
"topicRulePayload": {
"sql": "SELECT parse_time("yyyy.MM.dd G 'at' HH:mm:ss z", 100000000, "America/
Belize" ) as ts FROM 'A/B'",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [
{
"s3": {
"roleArn": "arn:aws:iam::ACCOUNT_ID:rule:role/ROLE_NAME",
"bucketName": "BUCKET_NAME",
"key": "KEY_NAME"
}
}
],
"ruleName": "RULE_NAME"
}
}
Cuando este mensaje se publica en el tema "A/B", una carga similar a {"ts": "2017.06.09 AD at
17:19:46 UTC"} (pero con la fecha y hora actuales) se envía al bucket de S3:
{
"ruleArn": "arn:aws:iot:us-east-2:ACCOUNT_ID:rule/RULE_NAME",
"topicRulePayload": {
"sql": "SELECT parse_time("yyyy.MM.dd G 'at' HH:mm:ss z", timestamp() ) as ts FROM
'A/B'",
"awsIotSqlVersion": "2016-03-23",
"ruleDisabled": false,
"actions": [
{
"s3": {
"roleArn": "arn:aws:iam::ACCOUNT_ID:rule:role/ROLE_NAME",
"bucketName": "BUCKET_NAME",
"key": "KEY_NAME"
357
AWS IoT Guía del desarrollador
Funciones
}
}
],
"ruleName": "RULE_NAME"
}
}
parse_time() se puede usar también como una plantilla de sustitución. Por ejemplo, cuando este
mensaje se publica en el tema "A/B", la carga se envía al bucket de S3 con la clave = "2017":
{
"ruleArn": "arn:aws:iot:us-east-2:ACCOUNT_ID:rule/RULE_NAME",
"topicRulePayload": {
"sql": "SELECT * FROM 'A/B'",
"awsIotSqlVersion": "2016-03-23",
"ruleDisabled": false,
"actions": [
{
"s3": {
"roleArn": "arn:aws:iam::ACCOUNT_ID:rule:role/ROLE_NAME",
"bucketName": BUCKET_NAME,
"key": "${parse_time("yyyy", timestamp(), "UTC")}"
}
}
],
"ruleName": "RULE_NAME"
}
}
power(Decimal, decimal)
Devuelve el primer argumento elevado al segundo argumento. Los argumentos Decimal se redondean
con doble precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y
versiones posteriores. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Rand()
Devuelve un valor pseudoaleatorio, distribuido de forma uniforme entre 0,0 y 1,0. Es compatible con la
versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
rand() = 0.8231909191640703
358
AWS IoT Guía del desarrollador
Funciones
regexp_matches(String, string)
Devuelve verdadero si la cadena (primer argumento) contiene una coincidencia para la expresión regular
(segundo argumento).
Ejemplo:
Primer argumento:
Null Undefined.
Segundo argumento:
Tiene que ser una expresión regex válida. Los tipos que no son cadenas se convierten en valores de tipo
String mediante reglas de conversión estándar. En función del tipo, es posible que la cadena obtenida
no sea una expresión regular válida. Si el argumento (convertido) no es un regex válido, el resultado es
Undefined.
Ejemplo:
Primer argumento:
359
AWS IoT Guía del desarrollador
Funciones
Null Undefined.
Segundo argumento:
Tiene que ser una expresión regex válida. Los tipos que no son cadenas se convierten en valores de tipo
String mediante reglas de conversión estándar. En función del tipo, es posible que la cadena obtenida
no sea una expresión regular válida. Si el argumento (convertido) no es una expresión regex válida, el
resultado es Undefined.
Tercer argumento:
Debe ser una cadena de sustitución de regex válida. (Puede hacer referencia a grupos de capturas).
Los tipos que no son cadenas se convierten en valores de tipo String mediante reglas de conversión
estándar. Si el argumento (convertido) no es una cadena de sustitución de regex válida, el resultado es
Undefined.
regexp_substr(String, string)
Busca la primera coincidencia del segundo parámetro (regex) en el primer parámetro. Hace referencia a
los grupos de captura con "$". Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
Primer argumento:
360
AWS IoT Guía del desarrollador
Funciones
Null Undefined.
Segundo argumento:
Tiene que ser una expresión regex válida. Los tipos que no son cadenas se convierten en valores de tipo
String mediante reglas de conversión estándar. En función del tipo, es posible que la cadena obtenida
no sea una expresión regular válida. Si el argumento (convertido) no es una expresión regex válida, el
resultado es Undefined.
Tercer argumento:
Debe ser una cadena de sustitución de regex válida. (Puede hacer referencia a grupos de capturas).
Los tipos que no son cadenas se convierten en valores de tipo String mediante reglas de conversión
estándar. Si el argumento no es una cadena de sustitución de regex válida, el resultado es Undefined.
remainder(Decimal, decimal)
Devuelve el resto de la división del primer argumento por el segundo argumento. Es igual que
mod(Decimal, decimal) (p. 355). También puede utilizar "%" como un operador infijo para la misma
funcionalidad modulo. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: remainder(8, 3) = 2.
Ejemplo:
361
AWS IoT Guía del desarrollador
Funciones
Null Undefined.
rpad(String, int)
Devuelve el argumento de cadena, rellenado en el lado derecho con el número de espacios especificado
en el segundo argumento. El argumento Int debe estar comprendido entre 0 y 1000. Si el valor
proporcionado se encuentra fuera de este rango válido, el argumento se establece en el valor válido más
cercano (0 o 1000). Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
rpad(1, 3) = "1".
String Int El
valor
String
se
rellena
en el
lado
derecho
con un
número
de
espacios
igual al
valor
Int
proporcionado.
String Decimal El
argumento
Decimal
se
redondea
al
362
AWS IoT Guía del desarrollador
Funciones
String String El
segundo
argumento
se
convierte
en un
valor
Decimal
que se
redondea
al
valor
Int
inferior
más
cercano.
El
valor
String
se
rellena
en el
lado
derecho
con un
número
de
espacios
igual al
valor
Int.
363
AWS IoT Guía del desarrollador
Funciones
round(Decimal)
Redondea el valor Decimal indicado al valor Int más cercano. Si el valor Decimal está a la misma
distancia de dos valores Int, (por ejemplo, 0,5), el valor Decimal se redondea al valor superior. Es
compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo: Round(1.2) = 1.
Round(1.5) = 2.
Round(1.7) = 2.
Round(-1.1) = -1.
Round(-1.5) = -2.
Int El argumento.
364
AWS IoT Guía del desarrollador
Funciones
rtrim(String)
Elimina todos los espacios en blanco del final (tabuladores y espacios) del valor String proporcionado. Es
compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
Null Undefined.
sign(Decimal)
Devuelve el signo del número especificado. Cuando el signo del argumento es positivo, se devuelve 1.
Cuando el signo del argumento es negativo, se devuelve -1. Si el argumento es 0, se devuelve 0. Es
compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplos:
sign(-7) = -1.
sign(0) = 0.
sign(13) = 1.
365
AWS IoT Guía del desarrollador
Funciones
sin(Decimal)
Devuelve el seno de un número en radianes. Los argumentos Decimal se redondean con doble precisión
antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
Undefined Undefined.
sinh(Decimal)
Devuelve el seno hiperbólico de un número. Los valores Decimal se redondean con doble precisión antes
de la aplicación de la función. El resultado es un valor Decimal de doble precisión. Es compatible con la
versión 2015-10-08 de SQL y versiones posteriores.
366
AWS IoT Guía del desarrollador
Funciones
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
Si los argumentos proporcionados no son (String, Int) ni (String, Int, Int), se les aplican las
conversiones estándar para intentar convertirlos en los tipos adecuados. Si no es posible convertirlos, el
resultado de la función será Undefined. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Ejemplos:
substring("012345", 0) = "012345".
substring("012345", 2) = "2345".
substring(123, 2) = "3".
substring("012345", 1, 3) = "12".
substring("012345", 3, 1) = "".
sql_version()
Devuelve la versión de SQL especificada en esta regla. Es compatible con la versión 2015-10-08 de SQL y
versiones posteriores.
Ejemplo:
367
AWS IoT Guía del desarrollador
Funciones
sql_version() = "2016-03-23"
sqrt(Decimal)
Devuelve la raíz cuadrada de un número. Los argumentos Decimal se redondean con doble precisión
antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
startswith(String, string)
Devuelve Boolean, si el primer argumento de cadena comienza con el segundo argumento de cadena.
Si alguno de los argumentos es Null o Undefined, el resultado es Undefined. Es compatible con la
versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
startswith("ranger","ran") = true
tan(Decimal)
Devuelve la tangente de un número en radianes. Los valores Decimal se redondean con doble precisión
antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
368
AWS IoT Guía del desarrollador
Funciones
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
tanh(Decimal)
Devuelve la tangente hiperbólica de un número en radianes. Los valores Decimal se redondean con doble
precisión antes de la aplicación de la función. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Boolean Undefined.
Matriz Undefined.
Objeto Undefined.
Null Undefined.
Timestamp()
Devuelve la marca de hora actual en milisegundos desde las 00:00:00 UTC (hora universal coordinada),
jueves 1 de enero de 1970, según lo observado por el motor de reglas de AWS IoT. Es compatible con la
versión 2015-10-08 de SQL y versiones posteriores.
369
AWS IoT Guía del desarrollador
Funciones
topic(Decimal)
Devuelve el tema al que se ha enviado el mensaje que activó la regla. Si no se especifica ningún
parámetro, se devuelve todo el tema. El parámetro Decimal se utiliza para especificar un segmento
de tema concreto. 1 designa el primer segmento. Para el tema foo/bar/baz, topic(1) devuelve foo,
topic(2) devuelve bar y así sucesivamente. Es compatible con la versión 2015-10-08 de SQL y versiones
posteriores.
Ejemplos:
topic() = "things/myThings/thingOne"
topic(1) = "things"
Cuando se usa Basic Ingest (p. 319), el prefijo inicial del tema ($aws/rules/rule-name) no está
disponible para la función topic(). Por ejemplo, con el tema:
$aws/rules/BuildingManager/Buildings/Building5/Floor2/Room201/Lights
topic() = "Buildings/Building5/Floor2/Room201/Lights"
topic(3) = "Floor2"
Traceid()
Devuelve el ID de seguimiento (UUID) del mensaje MQTT o Undefined si el mensaje no se ha enviado
por MQTT. Es compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
traceid() = "12345678-1234-1234-1234-123456789012"
trunc(Decimal, int)
Trunca el primer argumento según el número del valor Decimal especificado por el segundo argumento.
Si el segundo argumento es inferior a cero, se establece en cero. Si el segundo argumento es superior
a 34, se establece en 34. Los ceros del final se eliminan del resultado. Es compatible con la versión
2015-10-08 de SQL y versiones posteriores.
Ejemplos:
trunc(2.3, 0) = 2.
trunc(2.3123, 2) = 2.31.
trunc(2.888, 2) = 2,88.
trunc(2.00, 5) = 2.
370
AWS IoT Guía del desarrollador
Funciones
trim(String)
Elimina todos los espacios en blanco del principio y del final del valor String proporcionado. Es
compatible con la versión 2015-10-08 de SQL y versiones posteriores.
Ejemplo:
Null Undefined.
upper(String)
Muestra la versión en mayúsculas del valor String indicado. Los argumentos que no sean String
se convierten en String mediante las reglas de conversión estándar. Es compatible con la versión
2015-10-08 de SQL y versiones posteriores.
Ejemplos:
upper("hello") = "HELLO"
upper(["hello"]) = "[\"HELLO\"]"
371
AWS IoT Guía del desarrollador
Literales
Literales
Puede especificar directamente objetos literales en las cláusulas SELECT y WHERE de su regla SQL, lo
que puede ser útil para pasar información.
Note
Los literales solo están disponibles cuando se utiliza SQL versión 2016-03-23 o versiones
posteriores.
Se utiliza una sintaxis de objeto JSON (pares clave-valor separados con comas, donde las claves son
cadenas y los valores son de tipo JSON escritos entre llaves {}). Por ejemplo:
También puede especificar directamente matrices en las cláusulas SELECT y WHERE de su regla SQL, lo
que le permite agrupar información. Se utiliza una sintaxis JSON (elementos separados con comas entre
corchetes [] para crear un literal de Array). Por ejemplo:
Instrucciones case
Las instrucciones case se pueden utilizar para ejecutar bifurcaciones, como una instrucción switch o
instrucciones if/else.
Sintaxis:
La expresión v se evalúa y se compara con todas las expresiones t[i]. Si se encuentra una coincidencia,
la expresión r[i] correspondiente se convierte en el resultado de la instrucción case. Si hay más de una
posible coincidencia, se selecciona la primera de ellas. Si no hay ninguna coincidencia, se usa la expresión
re de la instrucción else como resultado. Si no hay ninguna coincidencia ni instrucción else, el resultado de
la instrucción case es Undefined. Por ejemplo:
Instrucción SQL: SELECT CASE color WHEN 'green' THEN 'go' WHEN 'yellow' THEN
'caution' WHEN 'red' THEN 'stop' ELSE 'you are not at a stop light' END as
instructions FROM 'a/b'
Las instrucciones case necesitan como mínimo una cláusula WHEN. No se necesita una cláusula ELSE.
372
AWS IoT Guía del desarrollador
Extensiones JSON
Note
Extensiones JSON
Puede utilizar las extensiones siguientes de la sintaxis ANSI SQL para facilitar el trabajo con objetos JSON
anidados.
"." "."
Este operador tiene acceso a los miembros de los objetos y las funciones JSON integrados, exactamente
igual que en ANSI SQL y en JavaScript. Por ejemplo:
Operador *
Funciona igual que el comodín * en ANSI SQL. Solo se utiliza en la cláusula SELECT y crea un objeto
JSON nuevo que contiene los datos del mensaje. Si la carga del mensaje no tiene el formato JSON, *
devuelve toda la carga del mensaje como bytes sin procesar. Por ejemplo:
{
"deviceid" : "iot123",
"temp" : 54.98,
"humidity" : 32.43,
"coords" : {
"latitude" : 47.615694,
"longitude" : -122.3359976
}
}
En el ejemplo siguiente se aplica una función a un valor de atributo de una carga JSON:
{
"temp": 54.98,
"hashed_id": "e37f81fb397e595c4aeb5645b8cbbbd1"
}
Plantillas de sustitución
Puede utilizar una plantilla de sustitución para aumentar los datos JSON que se devuelven cuando se
activa una regla y AWS IoT realiza una acción. La sintaxis de una plantilla de sustitución es ${expresión},
donde expresión puede ser cualquier expresión compatible con AWS IoT en cláusulas SELECT o WHERE.
Esto incluye funciones, operadores e información presente en la carga del mensaje original.
373
AWS IoT Guía del desarrollador
Consultas de objetos anidados
Important
Dado que las expresiones en plantillas de sustitución se evalúan por separado de la declaración
"SELECT...", no se puede hacer referencia a un alias creado con la cláusula AS. Solo puede
hacer referencia a la información presente en la carga original, además de a las funciones y
operadores compatibles.
Para obtener más información acerca de las expresiones admitidas, consulte Referencia de la SQL de
AWS IoT (p. 320).
Las plantillas de sustitución aparecen en los parámetros de acción dentro de una regla:
{
"sql": "SELECT *, timestamp() AS timestamp FROM 'my/iot/topic'",
"ruleDisabled": false,
"actions": [{
"republish": {
"topic": "${topic()}/republish",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}]
}
{
"deviceid": "iot123",
"temp": 54.98,
"humidity": 32.43,
"coords": {
"latitude": 47.615694,
"longitude": -122.3359976
}
}
Esta regla publica el siguiente JSON en my/iot/topic/republish, que AWS IoT utiliza para sustituir
${topic()}/republish:
{
"deviceid": "iot123",
"temp": 54.98,
"humidity": 32.43,
"coords": {
"latitude": 47.615694,
"longitude": -122.3359976
},
"timestamp": 1579637878451
}
{
"e": [
374
AWS IoT Guía del desarrollador
Versiones de SQL
Example
{
"sensors": [
"temperature",
"light",
"acidity"
]
}
Example
Usando el mismo mensaje MQTT, también puede consultar un valor específico dentro de un objeto
anidado con la siguiente regla.
{
"temperature": [
{
"v": 22.5
}
]
}
Example
{
"temperature": 22.5
}
Versiones de SQL
El motor de reglas de AWS IoT utiliza una sintaxis similar a SQL para seleccionar los datos de los
mensajes de MQTT. Las instrucciones SQL se interpretan según la versión de SQL especificada en
375
AWS IoT Guía del desarrollador
Versiones de SQL
la propiedad awsIotSqlVersion de un documento JSON que describe la regla. Para obtener más
información acerca de la estructura de los documentos de reglas JSON, consulte Creación de una
regla (p. 288). La propiedad awsIotSqlVersion le permite especificar la versión del motor de reglas
SQL de AWS IoT que desea utilizar. Cuando se implementa una nueva versión, puede continuar utilizando
una versión anterior o cambiar la regla para utilizar la nueva versión. Las reglas actuales seguirán
utilizando la versión con la que se crearon.
En el siguiente ejemplo de JSON se muestra cómo especificar la versión de SQL mediante la propiedad
awsIotSqlVersion:
{
"sql": "expression",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
"republish": {
"topic": "my-mqtt-topic",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}]
}
{
"a": {"b":"c"},
"arr":[1,2,3,4]
}
Y la regla siguiente:
376
AWS IoT Guía del desarrollador
Versiones de SQL
[1,2,3,4]
377
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
Contenido
• Flujo de datos del servicio de sombra del dispositivo (p. 378)
• Documentos del servicio de sombra del dispositivo (p. 386)
• Uso de sombras (p. 389)
• API RESTful de sombra de dispositivo (p. 398)
• Temas MQTT de sombra (p. 400)
• Sintaxis de los documentos de sombra del dispositivo (p. 407)
• Mensajes de error relacionados con las sombras (p. 411)
Para ilustrar la forma en que los dispositivos y las aplicaciones se comunican con el servicio Device
Shadow, en esta sección le ayudamos a usar el cliente MQTT de AWS IoT y la CLI de AWS para simular
la comunicación entre una bombilla conectada a Internet, una aplicación y el servicio Device Shadow. En
los siguientes temas de MQTT de ejemplo se utiliza un dispositivo de su registro denominado myLightBulb.
Puede reemplazar este valor por su propio nombre de dispositivo.
El servicio Device Shadow utiliza temas MQTT para facilitar las comunicaciones entre las aplicaciones y
los dispositivos. Para ver cómo funciona, utilice el cliente MQTT de AWS IoT para suscribirse a los temas
MQTT siguientes con QoS 1:
$aws/things/myLightBulb/shadow/update/accepted
El servicio Device Shadow envía mensajes a este tema cuando se realiza correctamente una
actualización de la sombra del dispositivo.
$aws/things/myLightBulb/shadow/update/rejected
El servicio Device Shadow envía mensajes a este tema cuando se rechaza una actualización de la
sombra del dispositivo.
$aws/things/myLightBulb/shadow/update/delta
El servicio Device Shadow envía mensajes a este tema cuando se detecta una diferencia entre las
secciones reported y desired de la sombra del dispositivo. Para obtener más información, consulte /
update/delta (p. 403).
378
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
$aws/things/myLightBulb/shadow/get/accepted
El servicio Device Shadow envía mensajes a este tema cuando se presenta correctamente una
solicitud para obtener la sombra del dispositivo.
$aws/things/myLightBulb/shadow/get/rejected
El servicio Device Shadow envía mensajes a este tema cuando se rechaza una solicitud para obtener
la sombra del dispositivo.
$aws/things/myLightBulb/shadow/delete/accepted
El servicio Device Shadow envía mensajes a este tema cuando se elimina la sombra del dispositivo.
$aws/things/myLightBulb/shadow/delete/rejected
El servicio Device Shadow envía mensajes a este tema cuando se rechaza una solicitud para eliminar
la sombra del dispositivo.
$aws/things/myLightBulb/shadow/update/documents
El servicio Device Shadow publica un documento de estado en este tema cuando se realiza
correctamente una actualización en la sombra del dispositivo.
Para obtener más información acerca de todos los temas MQTT que utiliza el servicio Device Shadow,
consulte Temas MQTT de sombra (p. 400).
Note
Le recomendamos que se suscriba a los temas .../rejected para ver los errores que envía el
servicio Device Shadow.
Cuando la bombilla está online, se envía su estado actual al servicio Device Shadow transmitiendo un
mensaje MQTT al tema $aws/things/myLightBulb/shadow/update.
Note
Las sombras de dispositivo se crean la primera vez que se intenta actualizarlo. El servicio de
sombra de dispositivo detectará que no existe una sombra y creará una. Si la sombra existe, se
actualizará.
Para simular esto, utilice el cliente MQTT de AWS IoT para publicar el siguiente mensaje en el tema $aws/
things/myLightBulb/shadow/update:
{
"state": {
"reported": {
"color": "red"
}
}
}
{
"messageNumber": 4,
"payload": {
"state": {
"reported": {
"color": "red"
379
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
}
},
"metadata": {
"reported": {
"color": {
"timestamp": 1469564492
}
}
},
"version": 1,
"timestamp": 1469564492
},
"qos": 0,
"timestamp": 1469564492848,
"topic": "$aws/things/myLightBulb/shadow/update/accepted"
}
Este mensaje indica que el servicio Device Shadow recibió la solicitud UPDATE y actualizó la sombra
del dispositivo. Si la sombra no existe, se crea. De lo contrario, la sombra se actualiza con los datos del
mensaje. Si no ve un mensaje publicado en $aws/things/myLightBulb/shadow/update/accepted,
consulte la suscripción a $aws/things/myLightBulb/shadow/update/rejected para ver los
mensajes de error.
{
"previous":null,
"current":{
"state":{
"reported":{
"color":"red"
}
},
"metadata":{
"reported":{
"color":{
"timestamp":1483467764
}
}
},
"version":1
},
"timestamp":1483467764
}
Los mensajes se publican en el tema /update/documents siempre que se realiza correctamente una
actualización de una sombra del dispositivo. Para obtener más información sobre el contenido de los
mensajes publicados en este tema, consulte Temas MQTT de sombra (p. 400).
Una aplicación que interactúa con la bombilla pasa a estar online y solicita el estado actual de la bombilla.
La aplicación envía un mensaje vacío al tema $aws/things/myLightBulb/shadow/get. Para
simularlo, utilice el cliente MQTT de AWS IoT para publicar un mensaje vacío ("") en el tema $aws/
things/myLightBulb/shadow/get.
El servicio Device Shadow responde publicando la sombra del dispositivo solicitada en el tema $aws/
things/myLightBulb/shadow/get/accepted:
{
"messageNumber": 1,
"payload": {
380
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
"state": {
"reported": {
"color": "red"
}
},
"metadata": {
"reported": {
"color": {
"timestamp": 1469564492
}
}
},
"version": 1,
"timestamp": 1469564571
},
"qos": 0,
"timestamp": 1469564571533,
"topic": "$aws/things/myLightBulb/shadow/get/accepted"
}
La aplicación muestra esta información para el usuario y este solicita un cambio de color de la bombilla
(de rojo a verde). Para ello, la aplicación publica un mensaje en el tema $aws/things/myLightBulb/
shadow/update:
{
"state": {
"desired": {
"color": "green"
}
}
}
Para simularlo, utilice el cliente MQTT de AWS IoT para publicar el mensaje anterior en el tema $aws/
things/myLightBulb/shadow/update.
{
"messageNumber": 5,
"payload": {
"state": {
"desired": {
"color": "green"
}
},
"metadata": {
"desired": {
"color": {
"timestamp": 1469564658
}
}
},
"version": 2,
"timestamp": 1469564658
},
"qos": 0,
"timestamp": 1469564658286,
"topic": "$aws/things/myLightBulb/shadow/update/accepted"
381
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
y al tema $aws/things/myLightBulb/shadow/update/delta:
{
"messageNumber": 1,
"payload": {
"version": 2,
"timestamp": 1469564658,
"state": {
"color": "green"
},
"metadata": {
"color": {
"timestamp": 1469564658
}
}
},
"qos": 0,
"timestamp": 1469564658309,
"topic": "$aws/things/myLightBulb/shadow/update/delta"
}
El servicio Device Shadow publica un mensaje en este tema cuando acepta una actualización de la sombra
y, como resultado de esta, dicha sombra contiene valores distintos para el estado deseado y el estado
notificado.
{
"previous":{
"state":{
"reported":{
"color":"red"
}
},
"metadata":{
"reported":{
"color":{
"timestamp":1483467764
}
}
},
"version":1
},
"current":{
"state":{
"desired":{
"color":"green"
},
"reported":{
"color":"red"
}
},
"metadata":{
"desired":{
"color":{
"timestamp":1483468612
}
},
"reported":{
"color":{
382
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
"timestamp":1483467764
}
}
},
"version":2
},
"timestamp":1483468612
}
{
"state":{
"reported":{
"color": "green"
},
"desired": null
}
}
{
"messageNumber": 6,
"payload": {
"state": {
"reported": {
"color": "green"
},
"desired": null
},
"metadata": {
"reported": {
"color": {
"timestamp": 1469564801
}
},
"desired": {
"timestamp": 1469564801
}
},
"version": 3,
"timestamp": 1469564801
},
"qos": 0,
"timestamp": 1469564801673,
"topic": "$aws/things/myLightBulb/shadow/update/accepted"
}
y al tema $aws/things/myLightBulb/shadow/update/documents:
{
"previous":{
"state":{
"reported":{
"color":"red"
}
},
383
AWS IoT Guía del desarrollador
Flujo de datos del servicio de sombra del dispositivo
"metadata":{
"reported":{
"color":{
"timestamp":1483470355
}
}
},
"version":3
},
"current":{
"state":{
"reported":{
"color":"green"
}
},
"metadata":{
"reported":{
"color":{
"timestamp":1483470364
}
}
},
"version":4
},
"timestamp":1483470364
}
La aplicación solicita el estado actual al servicio Device Shadow y muestra los datos del estado más
reciente. Para simularlo, ejecute el comando siguiente:
Note
En Windows, omita el && cat "output.txt" que muestra el contenido del archivo output.txt
a la consola. Puede abrir el archivo en el Bloc de notas o en cualquier editor de texto para ver el
contenido de la sombra.
{
"state":{
"reported":{
"color":"green"
}
},
"metadata":{
"reported":{
"color":{
"timestamp":1469564801
}
}
},
"version":3,
"timestamp":1469564864}
Para eliminar la sombra del dispositivo, publique un mensaje vacío en el tema $aws/things/
myLightBulb/shadow/delete. AWS IoT responderá publicando un mensaje en el tema $aws/
things/myLightBulb/shadow/delete/accepted:
384
AWS IoT Guía del desarrollador
Detección de un objeto conectado
"version" : 1,
"timestamp" : 1488565234
}
En la actualidad, el servicio Device Shadow de AWS IoT no tiene en cuenta los mensajes LWT
enviados a los temas reservados de AWS IoT (temas que comienzan por $), pero los clientes
suscritos y el motor de reglas de AWS IoT siguen procesándolos. Para que el servicio Device
Shadow reciba mensajes LWT, registre un mensaje LWT en un tema no reservado y cree una
regla que vuelva a publicar el mensaje en el tema reservado. El siguiente ejemplo muestra cómo
crear una regla que escuche mensajes del tema my/things/myLightBulb/update y los
vuelva a publicar en $aws/things/myLightBulb/shadow/update.
{
"rule": {
"ruleDisabled": false,
"sql": "SELECT * FROM 'my/things/myLightBulb/update'",
"description": "Turn my/things/ into $aws/things/",
"actions": [{
"republish": {
"topic": "$$aws/things/myLightBulb/shadow/update",
"roleArn": "arn:aws:iam::123456789012:role/aws_iot_republish"
}
}]
}
}
Cuando un dispositivo se conecta, registra un LWT que establece la configuración de conexión en false:
{
"state": {
"reported": {
"connected":"false"
}
}
}
{
"state": {
"reported": {
"connected":"true"
}
}
}
385
AWS IoT Guía del desarrollador
Documentos del servicio de sombra del dispositivo
"state": {
"reported": {
"connected":"false"
}
}
}
Contenido
• Propiedades del documento (p. 386)
• Control de versiones de sombra del dispositivo (p. 387)
• Token de cliente (p. 387)
• Ejemplo de documento (p. 387)
• Secciones vacías (p. 388)
• Matrices (p. 388)
state
desired
El estado deseado del objeto. Las aplicaciones pueden escribir en esta parte del documento para
actualizar el estado de un objeto, sin tener que conectarse directamente a un objeto.
reported
El estado notificado del objeto. Los objetos escriben en esta parte del documento para informar de
su nuevo estado. Las aplicaciones leen esta parte del documento para determinar el estado de un
objeto.
metadata
Información acerca de los datos almacenados en la sección state del documento. Esto incluye las
marcas de tiempo, según la fecha de inicio Unix, para cada atributo de la sección state, lo que le
permite determinar cuándo se actualizaron.
Note
Los metadatos no contribuyen al tamaño de documento para establecer los límites del
servicio o el precio. Para obtener más información, consulte AWS IoT Service Limits.
timestamp
Indica cuándo AWS IoT transmitió el mensaje. Con la marca de tiempo que figura en el mensaje
y las marcas de tiempo para los atributos individuales que se muestran en la sección desired o
reported, un objeto puede determinar la edad de un elemento actualizado, aunque no disponga de
un reloj interno.
386
AWS IoT Guía del desarrollador
Control de versiones de sombra del dispositivo
clientToken
Una cadena única del dispositivo que le permite asociar respuestas a solicitudes en un entorno de
MQTT.
version
La versión del documento. Cada vez que el documento se actualiza, su número de versión se
incrementa. Se utiliza para garantizar que la versión del documento que se actualiza sea la más
reciente.
Para obtener más información, consulte Sintaxis de los documentos de sombra del dispositivo (p. 407).
• Un cliente puede recibir un error si intenta sobrescribir una sombra con una versión más antigua. Se
informa al cliente de que debe volver a sincronizarlo para poder actualizar la sombra de un dispositivo.
• Un cliente puede decidir omitir un mensaje recibido si su versión es anterior a la que tiene almacenada.
En algunos casos, un cliente puede omitir la correlación de versiones no presentando una versión.
Token de cliente
Puede utilizar un token de cliente con mensajes basados en MQTT para verificar que el mismo token de
cliente esté contenido en una solicitud y en la respuesta a dicha solicitud. De esta forma se garantiza que
la respuesta y la solicitud estén asociadas.
Note
El token de cliente no puede ser superior a 64 bytes. Un token de cliente que es superior a 64
bytes provocará una respuesta 400 (solicitud errónea) y un mensaje de error clientToken no
válido.
Ejemplo de documento
A continuación, se muestra un ejemplo de documento de sombra:
{
"state" : {
"desired" : {
"color" : "RED",
"sequence" : [ "RED", "GREEN", "BLUE" ]
},
"reported" : {
"color" : "GREEN"
}
},
"metadata" : {
"desired" : {
"color" : {
"timestamp" : 12345
},
"sequence" : {
387
AWS IoT Guía del desarrollador
Secciones vacías
"timestamp" : 12345
}
},
"reported" : {
"color" : {
"timestamp" : 12345
}
}
},
"version" : 10,
"clientToken" : "UniqueClientToken",
"timestamp": 123456789
}
Secciones vacías
Un documento de sombra contiene una sección desired solo si tiene un estado deseado. Por ejemplo, el
documento siguiente es un documento de estado válido sin sección desired:
{
"reported" : { "temp": 55 }
}
{
"desired" : { "color" : "RED" }
}
Si una actualización produce la nulidad de las secciones desired o reported, la sección se elimina
del documento. Para eliminar la sección desired de un documento (como respuesta, por ejemplo, a un
dispositivo que actualiza su estado), establezca la sección deseada en null:
{
"state": {
"reported": {
"color": "red"
},
"desired": null
}
}
También es posible que un documento de sombra no contenga las secciones desired o reported. En
tal caso, el documento de sombra estará vacío. Por ejemplo, el documento siguiente es válido:
{
}
Matrices
Las sombras son compatibles con las matrices, pero las tratan como valores normales, en el sentido de
que la actualización de una matriz sustituye toda la matriz. No es posible actualizar parte de una matriz.
Estado inicial:
388
AWS IoT Guía del desarrollador
Uso de sombras
Actualizar:
{
"desired" : { "colors" : ["RED"] }
}
Estado final:
{
"desired" : { "colors" : ["RED"] }
}
Las matrices no pueden tener valores nulos. Por ejemplo, la matriz siguiente no es válida y se rechazará.
{
"desired" : {
"colors" : [ null, "RED", "GREEN" ]
}
}
Uso de sombras
AWS IoT proporciona tres métodos para trabajar con la sombra de un dispositivo:
UPDATE
Crea la sombra de un dispositivo si este no existe o bien la actualiza con los datos suministrados
en la solicitud. Los datos se almacenan con la marca de tiempo para indicar la fecha de su última
actualización. Se envían mensajes a todos los suscriptores con la diferencia entre el estado desired
o reported (delta). Los objetos o las aplicaciones que reciben un mensaje pueden ejecutar una
acción en función de la diferencia entre los estados desired o reported. Por ejemplo, un dispositivo
puede actualizar su estado al estado deseado, o una aplicación puede actualizar su interfaz de usuario
para mostrar el cambio de estado del dispositivo.
GET
Recupera el último estado almacenado en la sombra del dispositivo (por ejemplo, durante el arranque
de un dispositivo para recuperar la configuración y el último estado de funcionamiento). Este método
devuelve todo el documento JSON, incluidos los metadatos.
DELETE
Elimina la sombra de un dispositivo, incluido todo su contenido. Esto elimina el documento JSON del
almacén de datos. No se puede restaurar la sombra de un dispositivo tras eliminarla, pero se puede
crear otra con el mismo nombre.
389
AWS IoT Guía del desarrollador
Actualización de la sombra
Actualización de la sombra
Puede actualizar la sombra de un dispositivo mediante la API RESTful UpdateThingShadow (p. 399)
o publicando en el tema /update (p. 401). Las actualizaciones afectan únicamente a los campos
especificados en la solicitud.
Estado inicial:
{
"state": {
"reported" : {
"color" : { "r" :255, "g": 255, "b": 0 }
}
}
}
{
"state": {
"desired" : {
"color" : { "r" : 10 },
"engine" : "ON"
}
}
}
El dispositivo recibe el estado desired en el tema /update/delta que se activa mediante el mensaje
/update anterior y, a continuación, ejecuta los cambios deseados. Cuando termina, el dispositivo debe
confirmar el estado actualizado a través de la sección reported del documento JSON de la sombra.
Estado final:
{
"state": {
"reported" : {
"color" : { "r" : 10, "g" : 255, "b": 0 },
"engine" : "ON"
}
}
}
Ejemplo de documento:
{
"state": {
"desired": {
"lights": {
"color": "RED"
390
AWS IoT Guía del desarrollador
Recuperación de un documento de sombra
},
"engine": "ON"
},
"reported": {
"lights": {
"color": "GREEN"
},
"engine": "ON"
}
},
"metadata": {
"desired": {
"lights": {
"color": {
"timestamp": 123456
},
"engine": {
"timestamp": 123456
}
}
},
"reported": {
"lights": {
"color": {
"timestamp": 789012
}
},
"engine": {
"timestamp": 789012
}
},
"version": 10,
"timestamp": 123456789
}
}
Respuesta:
{
"state": {
"desired": {
"lights": {
"color": "RED"
},
"engine": "ON"
},
"reported": {
"lights": {
"color": "GREEN"
},
"engine": "ON"
},
"delta": {
"lights": {
"color": "RED"
}
}
},
"metadata": {
"desired": {
"lights": {
"color": {
"timestamp": 123456
},
},
391
AWS IoT Guía del desarrollador
Recuperación de un documento de sombra
"engine": {
"timestamp": 123456
}
},
"reported": {
"lights": {
"color": {
"timestamp": 789012
}
},
"engine": {
"timestamp": 789012
}
},
"delta": {
"lights": {
"color": {
"timestamp": 123456
}
}
}
},
"version": 10,
"timestamp": 123456789
}
Bloqueo optimista
Puede utilizar la versión del documento de estado para asegurarse de que actualiza la versión más
reciente del documento de sombra de un dispositivo. Cuando se suministra una versión con una solicitud
de actualización, el servicio rechaza la solicitud con un código de respuesta de conflicto HTTP 409 si la
versión actual del documento de estado no coincide con la versión suministrada.
Por ejemplo:
Documento inicial:
{
"state" : {
"desired" : { "colors" : ["RED", "GREEN", "BLUE" ] }
},
"version" : 10
}
{
"state": {
"desired": {
"colors": [
"BLUE"
]
}
},
"version": 9
}
Resultado:
409 Conflict
392
AWS IoT Guía del desarrollador
Eliminación de datos
{
"state": {
"desired": {
"colors": [
"BLUE"
]
}
},
"version": 10
}
Estado final:
{
"state": {
"desired": {
"colors": [
"BLUE"
]
}
},
"version": 11
}
Eliminación de datos
Puede eliminar datos de la sombra de un dispositivo publicando en el tema /update (p. 401) y definiendo
los campos que se van a suprimir con el valor nulo. Todo campo que tenga el valor null se eliminará del
documento.
Estado inicial:
{
"state": {
"desired" : {
"lights": { "color": "RED" },
"engine" : "ON"
},
"reported" : {
"lights" : { "color": "GREEN" },
"engine" : "OFF"
}
}
}
{
"state": {
"desired": null,
"reported": {
"engine": null
}
}
}
Estado final:
393
AWS IoT Guía del desarrollador
Eliminación de una sombra
{
"state": {
"reported" : {
"lights" : { "color" : "GREEN" }
}
}
}
Puede eliminar todos los datos de la sombra de un dispositivo estableciendo su estado en el valor null.
Por ejemplo, si envía el mensaje siguiente, se eliminarán todos los datos de estado, pero la sombra del
dispositivo permanecerá.
{
"state": null
}
La sombra del dispositivo sigue existiendo, aunque su estado sea null. La versión de la sombra del
dispositivo se incrementará cuando se produzca la siguiente actualización.
Estado inicial:
{
"state": {
"desired" : {
"lights": { "color": "RED" },
"engine" : "ON"
},
"reported" : {
"lights" : { "color": "GREEN" },
"engine" : "OFF"
}
}
}
Estado final:
Estado delta
El estado delta es un tipo de estado virtual que contiene la diferencia entre los estados desired y
reported. Los campos de la sección desired que no están incluidos en la sección reported se
incluyen en el delta. Los campos que están en la sección reported y no están en la sección desired no
se incluyen en el delta. El delta contiene metadatos, y sus valores son iguales a los metadatos del campo
desired. Por ejemplo:
394
AWS IoT Guía del desarrollador
Estado delta
{
"state": {
"desired": {
"color": "RED",
"state": "STOP"
},
"reported": {
"color": "GREEN",
"engine": "ON"
},
"delta": {
"color": "RED",
"state": "STOP"
}
},
"metadata": {
"desired": {
"color": {
"timestamp": 12345
},
"state": {
"timestamp": 12345
},
"reported": {
"color": {
"timestamp": 12345
},
"engine": {
"timestamp": 12345
}
},
"delta": {
"color": {
"timestamp": 12345
},
"state": {
"timestamp": 12345
}
}
},
"version": 17,
"timestamp": 123456789
}
}
Cuando los objetos anidados difieren, el delta contiene la ruta de acceso a la raíz.
{
"state": {
"desired": {
"lights": {
"color": {
"r": 255,
"g": 255,
"b": 255
}
}
},
"reported": {
"lights": {
"color": {
"r": 255,
"g": 0,
"b": 255
395
AWS IoT Guía del desarrollador
Observación de los cambios de estado
}
}
},
"delta": {
"lights": {
"color": {
"g": 255
}
}
}
},
"version": 18,
"timestamp": 123456789
}
El servicio Device Shadow calcula la diferencia iterando por cada campo con el estado desired y
comparándolo con el estado reported.
Las matrices se tratan como valores. Si una matriz de la sección desired no coincide con la matriz de la
sección reported, toda la matriz deseada se copia en el delta.
• $aws/things/nombre de objeto/shadow/update/accepted
• $aws/things/nombre de objeto/shadow/update/delta
El mensaje enviado al tema update/delta está destinado al objeto cuyo estado se actualiza. Este
mensaje contiene únicamente la diferencia entre las secciones desired y reported del documento
de sombra del dispositivo. Tras recibir este mensaje, el dispositivo debe decidir si realizará el cambio
solicitado. Si cambia el estado del dispositivo, este debe publicar su nuevo estado actual en el tema $aws/
things/thing-name/shadow/update.
Los dispositivos y aplicaciones pueden suscribirse a uno de estos temas para recibir una notificación
cuando el estado del documento cambie.
{
"state" : {
"reported" : { "color" : "blue" }
},
396
AWS IoT Guía del desarrollador
Recorte de mensajes de sombra
"version" : 10,
"timestamp": 123456777
}
Actualización 1:
{
"state": { "desired" : { "color" : "RED" } },
"version": 10,
"timestamp": 123456777
}
Actualización 2:
{
"state": { "desired" : { "color" : "GREEN" } },
"version": 11,
"timestamp": 123456778
}
{
"state": {
"reported": { "color" : "GREEN" }
},
"version": 12,
"timestamp": 123456779
}
{
"state": {
"color": "RED"
},
"version": 11,
"timestamp": 123456778
}
{
"state": { "color" : "GREEN" },
"version": 12,
"timestamp": 123456779
}
El dispositivo puede recibir estos mensajes de forma desordenada. Dado que el estado de estos mensajes
es acumulable, un dispositivo puede descartar con toda seguridad todos los mensajes cuyo número de
versión sea anterior a la del mensaje del cual se hace un seguimiento. Si el dispositivo recibe el delta de la
versión 12 antes que el de la versión 11, puede descartar sin problemas el mensaje de la versión 11.
397
AWS IoT Guía del desarrollador
API RESTful
{
"sql": "SELECT state, version FROM '$aws/things/+/shadow/update/delta'",
"ruleDisabled": false,
"actions": [{
"republish": {
"topic": "${topic(3)}/delta",
"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
}
}]
}
La instrucción SELECT determina qué campos del mensaje se volverán a publicar en el tema especificado.
Se usa el comodín "+" para seleccionar todos los nombres de sombra. La regla especifica que todos
los mensajes coincidentes deben volver a publicarse en el tema especificado. En tal caso, la función
"topic()" se utiliza para especificar el tema en el que se vuelve a publicar. topic(3) toma el valor del
nombre de objeto del tema original. Para obtener más información sobre la creación de reglas, consulte
Reglas para AWS IoT (p. 285).
https://endpoint/things/thingName/shadow
El punto de enlace específico con su cuenta de AWS. Para recuperar su punto de enlace, ejecute el
comando describe-endpoint. El formato del punto de enlace es el siguiente:
identifier.iot.region.amazonaws.com
La API de RESTful de sombras sigue los mismos mapeos de puertos y protocolos HTTPS que se describe
en Protocolos (p. 276).
Acciones de API
• GetThingShadow (p. 398)
• UpdateThingShadow (p. 399)
• DeleteThingShadow (p. 400)
Note
Cuando utilice estas API, asegúrese de usar el puerto 8443, tal y como se describe en Protocolos,
mapeos de puertos y autenticación (p. 277).
GetThingShadow
Obtiene la sombra de objeto especificado.
El documento de estado de respuesta incluye el delta entre los estados desired y reported.
Solicitud
398
AWS IoT Guía del desarrollador
UpdateThingShadow
Respuesta
En caso de éxito, la respuesta incluye encabezados HTTP estándar, así como el código y el cuerpo
siguientes:
HTTP 200
BODY: response state document
Para obtener más información, consulte Ejemplo de documento de estado de respuesta (p. 408).
Autorización
Para recuperar una sombra, se necesita una política que permita al intermediario ejecutar la acción
iot:GetThingShadow. El servicio Device Shadow acepta dos formas de autenticación: Signature
Version 4 con credenciales de IAM o autenticación mutua TLS con un certificado de cliente.
A continuación, se muestra una política de ejemplo que permite a un intermediario recuperar la sombra de
un dispositivo:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "iot:GetThingShadow",
"Resource": ["arn:aws:iot:region:account:thing/thing"]
}]
}
UpdateThingShadow
Actualiza la sombra del objeto especificado.
Las actualizaciones solo afectan a los campos especificados en el documento de estado de la solicitud.
Todos los campos que tengan el valor null se eliminarán de la sombra del dispositivo.
Solicitud
La solicitud incluye los encabezados HTTP estándar, así como el URI y el cuerpo siguientes:
Para obtener más información, consulte Ejemplo de documento de estado de solicitud (p. 408).
Respuesta
En caso de éxito, la respuesta incluye encabezados HTTP estándar, así como el código y el cuerpo
siguientes:
HTTP 200
BODY: response state document
Para obtener más información, consulte Ejemplo de documento de estado de respuesta (p. 408).
Autorización
Para actualizar una sombra se necesita una política que permita al intermediario ejecutar la acción
iot:UpdateThingShadow. El servicio Device Shadow acepta dos formas de autenticación: Signature
Version 4 con credenciales de IAM o autenticación mutua TLS con un certificado de cliente.
399
AWS IoT Guía del desarrollador
DeleteThingShadow
A continuación, se muestra una política de ejemplo que permite a un intermediario actualizar la sombra de
un dispositivo:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "iot:UpdateThingShadow",
"Resource": ["arn:aws:iot:region:account:thing/thing"]
}]
}
DeleteThingShadow
Elimina la sombra de objeto especificado.
Solicitud
Respuesta
En caso de éxito, la respuesta incluye encabezados HTTP estándar, así como el código y el cuerpo
siguientes:
HTTP 200
BODY: Empty response state document
Autorización
Para eliminar la sombra de un dispositivo se necesita una política que permita al intermediario ejecutar
la acción iot:DeleteThingShadow. El servicio Device Shadow acepta dos formas de autenticación:
Signature Version 4 con credenciales de IAM o autenticación mutua TLS con un certificado de cliente.
A continuación, se muestra una política de ejemplo que permite a un intermediario eliminar la sombra de
un dispositivo:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "iot:DeleteThingShadow",
"Resource": ["arn:aws:iot:region:account:thing/thing"]
}]
}
400
AWS IoT Guía del desarrollador
/update
que evite las suscripciones de tipo comodín a los temas de sombra. Por ejemplo, evite suscribirse a filtros
de temas como $aws/things/thingName/shadow/#, ya que el número de temas que coinciden con
este filtro de temas puede aumentar a medida que AWS IoT incorpora nuevos temas de sombra. Para
consultar ejemplos de mensajes publicados en estos temas vaya a Flujo de datos del servicio de sombra
del dispositivo (p. 378).
A continuación se muestran los temas MQTT utilizados para interactuar con las sombras.
Temas
• /update (p. 401)
• /update/accepted (p. 402)
• /update/documents (p. 402)
• /update/rejected (p. 403)
• /update/delta (p. 403)
• /get (p. 404)
• /get/accepted (p. 405)
• /get/rejected (p. 405)
• /delete (p. 406)
• /delete/accepted (p. 406)
• /delete/rejected (p. 407)
/update
Publique un documento de estado de solicitud en este tema para actualizar la sombra del dispositivo:
$aws/things/thingName/shadow/update
Un cliente que intente actualizar el estado de un objeto debe enviar un documento de estado de solicitud
JSON como el siguiente:
{
"state" : {
"desired" : {
"color" : "red",
"power" : "on"
}
}
}
Un dispositivo que actualice su sombra enviará un documento de estado de solicitud JSON como el
siguiente:
{
"state" : {
"reported" : {
"color" : "red",
"power" : "on"
}
}
}
AWS IoT responde publicando en /update/accepted (p. 402) o en /update/rejected (p. 403).
Para obtener más información, consulte Documentos de estado de la solicitud (p. 408).
401
AWS IoT Guía del desarrollador
/update/accepted
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["iot:Publish"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/
update"]
}]
}
/update/accepted
AWS IoT publica un documento de estado de respuesta en este tema cuando acepta un cambio de la
sombra del dispositivo:
$aws/things/thingName/shadow/update/accepted
Para obtener más información, consulte Documentos de estado de la respuesta (p. 408).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
update/accepted"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/update/
accepted"]
}
]
}
/update/documents
AWS IoT publica un documento de estado en este tema siempre que se realiza una actualización correcta
de la sombra:
$aws/things/thingName/shadow/update/documents
El documento JSON contiene dos nodos principales: previous y current. El nodo previous incluye el
contenido del documento de sombra completo antes de realizar la actualización, mientras que current
contiene el documento de sombra completo después de realizar la actualización sin errores. Cuando se
actualiza (se crea) la sombra por primera vez, el nodo previous contiene null.
402
AWS IoT Guía del desarrollador
/update/rejected
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
update/documents"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/update/
accepted"]
}
]
}
/update/rejected
AWS IoT publica un documento de respuesta de error en este tema cuando rechaza un cambio de la
sombra del dispositivo:
$aws/things/thingName/shadow/update/rejected
Para obtener más información, consulte Documentos de respuesta de error (p. 411).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
update/rejected"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/update/
rejected"]
}
]
}
/update/delta
AWS IoT publica un documento de estado de respuesta en este tema cuando acepta un cambio de la
sombra del dispositivo y el documento de estado de solicitud contiene valores distintos para los estados
desired y reported:
403
AWS IoT Guía del desarrollador
/get
$aws/things/thingName/shadow/update/delta
Para obtener más información, consulte Documentos de estado de la respuesta (p. 408).
Detalles de la publicación
• Un mensaje publicado en update/delta incluye únicamente los atributos deseados que difieren entre
las secciones desired y reported. Contiene todos estos atributos, independientemente de si se
encuentran en el mensaje de actualización actual o si ya estaban almacenados en AWS IoT. No se
incluyen los atributos que no difieren entre las secciones desired y reported.
• Si un atributo se encuentra en la sección reported, pero no tiene equivalente en la sección desired,
no se incluye.
• Si un atributo se encuentra en la sección desired, pero no tiene equivalente en la sección reported,
se incluye.
• Si se elimina un atributo de la sección reported, pero sigue existiendo en la sección desired, se
incluye.
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
update/delta"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/update/
delta"]
}
]
}
/get
Publique un mensaje vacío en este tema para obtener la sombra de objeto:
$aws/things/thingName/shadow/get
AWS IoT responde publicando en /get/accepted (p. 405) o en /get/rejected (p. 405).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
404
AWS IoT Guía del desarrollador
/get/accepted
{
"Effect": "Allow",
"Action": [ "iot:Publish" ],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/get"]
}
]
}
/get/accepted
AWS IoT publica un documento de estado de respuesta en este tema cuando devuelve la sombra del
dispositivo:
$aws/things/thingName/shadow/get/accepted
Para obtener más información, consulte Documentos de estado de la respuesta (p. 408).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
get/accepted"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/get/
accepted"]
}
]
}
/get/rejected
AWS IoT publica un documento de respuesta de error en este tema cuando no puede devolver la sombra
del dispositivo:
$aws/things/thingName/shadow/get/rejected
Para obtener más información, consulte Documentos de respuesta de error (p. 411).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
405
AWS IoT Guía del desarrollador
/delete
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
get/rejected"]
},
{
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/get/
rejected"]
}
]
}
/delete
Para eliminar la sombra de un dispositivo, publique un mensaje vacío para eliminar el tema:
$aws/things/thingName/shadow/delete
AWS IoT responde publicando en /delete/accepted (p. 406) o en /delete/rejected (p. 407).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
delete"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/
delete"]
}
]
}
/delete/accepted
AWS IoT publica un mensaje en este tema cuando se elimina la sombra de un dispositivo:
$aws/things/thingName/shadow/delete/accepted
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
406
AWS IoT Guía del desarrollador
/delete/rejected
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
delete/accepted"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/delete/
accepted"]
}
]
}
/delete/rejected
AWS IoT publica un documento de respuesta de error en este tema cuando no puede eliminar la sombra
del dispositivo:
$aws/things/thingName/shadow/delete/rejected
Para obtener más información, consulte Documentos de respuesta de error (p. 411).
Política de ejemplo
A continuación, mostramos un ejemplo de la política requerida:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Subscribe"],
"Resource": ["arn:aws:iot:region:account:topicfilter/$aws/things/thingName/shadow/
delete/rejected"]
},
{
"Effect": "Allow",
"Action": ["iot:Receive"],
"Resource": ["arn:aws:iot:region:account:topic/$aws/things/thingName/shadow/delete/
rejected"]
}
]
}
Ejemplos
• Documentos de estado de la solicitud (p. 408)
407
AWS IoT Guía del desarrollador
Documentos de estado de la solicitud
{
"state": {
"desired": {
"attribute1": integer2,
"attribute2": "string2",
...
"attributeN": boolean2
},
"reported": {
"attribute1": integer1,
"attribute2": "string1",
...
"attributeN": boolean1
}
},
"clientToken": "token",
"version": version
}
• state — Las actualizaciones solo afectan a los campos especificados. Normalmente, utilizará la
propiedad desired o la propiedad reported, pero no ambas en la misma solicitud.
• desired: las propiedades de estado y los valores solicitados para actualizarlos en el dispositivo.
• reported: las propiedades de estado y los valores notificados por el dispositivo.
• clientToken: si se usa, puede hacer coincidir la solicitud y la respuesta correspondiente del token del
cliente.
• version — Si se utiliza, el servicio Device Shadow procesa la actualización solo si la versión
especificada coincide con la versión más reciente que tiene.
408
AWS IoT Guía del desarrollador
Documentos de estado de la respuesta
"timestamp": timestamp
},
...
"attributeN": {
"timestamp": timestamp
}
}
},
"timestamp": timestamp,
"clientToken": "token",
"version": version
}
409
AWS IoT Guía del desarrollador
Documentos de estado de la respuesta
},
"attribute2": {
"timestamp": timestamp
},
...
"attributeN": {
"timestamp": timestamp
}
},
"reported": {
"attribute1": {
"timestamp": timestamp
},
"attribute2": {
"timestamp": timestamp
},
...
"attributeN": {
"timestamp": timestamp
}
}
},
"version": version-1
},
"current": {
"state": {
"desired": {
"attribute1": integer2,
"attribute2": "string2",
...
"attributeN": boolean2
},
"reported": {
"attribute1": integer2,
"attribute2": "string2",
...
"attributeN": boolean2
}
},
"metadata": {
"desired": {
"attribute1": {
"timestamp": timestamp
},
"attribute2": {
"timestamp": timestamp
},
...
"attributeN": {
"timestamp": timestamp
}
},
"reported": {
"attribute1": {
"timestamp": timestamp
},
"attribute2": {
"timestamp": timestamp
},
...
"attributeN": {
"timestamp": timestamp
}
}
},
"version": version
410
AWS IoT Guía del desarrollador
Documentos de respuesta de error
},
"timestamp": timestamp,
"clientToken": "token"
}
{
"code": error-code,
"message": "error-message",
"timestamp": timestamp,
"clientToken": "token"
}
Para obtener más información, consulte Mensajes de error relacionados con las sombras (p. 411).
411
AWS IoT Guía del desarrollador
Mensajes de error
429 (demasiadas solicitudes) • El servicio Device Shadow generará este mensaje de error
cuando haya más de diez solicitudes en tránsito.
412
AWS IoT Guía del desarrollador
Conceptos clave de trabajos
Trabajos
Los trabajos de AWS IoT se pueden usar para definir un conjunto de operaciones remotas que se envían a
uno o más dispositivos conectados a AWS IoT o que se ejecutan en uno o más de esos dispositivos.
Tip
Para ver ejemplos de documentos de trabajo, vea el ejemplo jobs-agent.js en el AWS IoT SDK
para JavaScript.
Un trabajo es una operación remota que se envía a uno o varios dispositivos conectados a AWS IoT
y se ejecuta en ellos. Por ejemplo, puede definir un trabajo que indique a un conjunto de dispositivos
descargar e instalar actualizaciones de firmware y aplicaciones, reiniciar, rotar certificados o realizar
operaciones remotas de solución de problemas.
documento de trabajo
Para crear un trabajo, primero debe crear un documento de trabajo, que es una descripción de las
operaciones remotas que deben realizar los dispositivos.
Los documentos de trabajo son documentos JSON con codificación UTF-8 y deben contener
la información que necesitan los dispositivos para realizar un trabajo. Un documento de trabajo
contendrá una o más URL en las que el dispositivo puede descargar una actualización o cualquier otro
dato. El documento de trabajo puede almacenarse en un bucket de Amazon S3 o insertarse con el
comando que crea el trabajo.
destino
Cuando cree un trabajo, debe especificar una lista de destinos que son los dispositivos que deben
realizar las operaciones. Los destinos pueden ser objetos, grupos de objetos (p. 102) o ambos. El
servicio Jobs de AWS IoT envía un mensaje a cada destino para informarle de que hay un trabajo
disponible.
ejecución de trabajo
De forma predeterminada, un trabajo se envía a todos los destinos especificados al crearlo. Después
de que esos destinos finalicen el trabajo (o informen de que no pueden hacerlo), el trabajo se
completa.
trabajo continuo
Un trabajo continuo se envía a todos los destinos especificados al crearlo. Sigue ejecutándose y se
envía a todos los nuevos dispositivos (objetos) que se añaden al grupo de destino. Por ejemplo, puede
413
AWS IoT Guía del desarrollador
Conceptos clave de trabajos
usarse un trabajo continuo para incorporar o actualizar dispositivos a medida que se añaden a un
grupo. Puede hacer que un trabajo sea continuo estableciendo un parámetro opcional al crearlo.
despliegues
Puede especificar la rapidez con la que se notifica a los destinos la ejecución de un trabajo pendiente.
Esto le permite crear un despliegue por etapas para administrar mejor las actualizaciones, los reinicios
y otras operaciones.
Se puede añadir el campo siguiente a la solicitud CreateJob para especificar el número máximo de
destinos de trabajo de los que se informará por minuto. En este ejemplo se establece una tasa de
despliegue estática.
"jobExecutionRolloutConfig": {
"maximumPerMinute": "integer"
}
También puede definir una tasa de despliegue variable con el campo exponentialRate. En el
siguiente ejemplo se crea un despliegue que tiene una tasa exponencial.
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": integer,
"incrementFactor": integer,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": integer, // Set one or the other
"numberOfSucceededThings": integer // of these two values.
},
"maximumPerMinute": integer
}
}
Para obtener más información acerca de cómo configurar despliegues de trabajos, consulte la sección
sobre despliegue de trabajos y configuración de anulaciones.
abort
Puede crear un conjunto de condiciones para anular despliegues una vez se cumplan los criterios
que especifique. Para obtener más información, consulte Despliegue de trabajos y configuración de
anulaciones.
URL prefirmadas
Para permitir a un dispositivo acceso seguro y por tiempo limitado a los datos más allá de los incluidos
en el propio documento de trabajo, puede usar URL de Amazon S3 prefirmadas. Puede colocar sus
datos en un bucket de Amazon S3 y añadir un enlace de marcador de posición para los datos en el
documento de trabajo. Cuando el servicio Jobs recibe una solicitud de documento de trabajo, analiza
ese documento en busca de enlaces de marcador de posición y los sustituye por URL de Amazon S3
prefirmadas.
${aws:iot:s3-presigned-url:https://s3.amazonaws.com/bucket/key}
en donde bucket es el nombre del bucket y clave es el objeto en el bucket para el que se está
realizando la vinculación.
414
AWS IoT Guía del desarrollador
Administrar trabajos
En el Regiones de Pekín y Ningxia, las URL prefirmadas sólo funcionan si el propietario del recurso
tiene una licencia ICP. Para obtener más información, consulte Amazon Simple Storage Service en la
documentación Getting Started with AWS Services in China .
tiempos de espera
Los tiempos de espera de trabajos permiten recibir una notificación cada vez que la ejecución de un
trabajo se bloquea en el estado IN_PROGRESS durante un periodo de tiempo más largo de lo previsto.
Existen dos tipos de temporizadores: temporizadores en curso y temporizadores de pasos.
Al crear una tarea, puede establecer un valor para la propiedad inProgressTimeoutInMinutes del
objeto TimeoutConfig opcional. El temporizador en curso no se puede actualizar y se aplica a todas
las ejecuciones de trabajos para el trabajo. Cuando la ejecución de un trabajo permanece en estado
IN_PROGRESS durante un periodo superior a este intervalo, la ejecución del trabajo producirá un error
y cambiará al estado final TIMED_OUT. AWS IoT también publica una notificación MQTT.
El siguiente diagrama y la descripción ilustran las formas en las que los tiempos de espera en curso y
por pasos interactúan entre sí.
Job Creation (Creación de trabajo): CreateJob establece un temporizador en curso que vence
en veinte minutos. Este temporizador se aplica a todas las ejecuciones de trabajos y no se puede
actualizar.
Administrar trabajos
Puede utilizar la consola de AWS IoT, la API HTTPS de trabajos, la AWS Command Line Interface o
los SDK de AWS para crear y administrar trabajos. Para obtener más información, consulte API de
415
AWS IoT Guía del desarrollador
Administrar trabajos
administración y control de trabajo (p. 438), la referencia de comandos de la CLI de AWS: iot o SDK y
herramientas de AWS.
El objetivo principal de los trabajos es notificar a los dispositivos de una actualización de software o de
firmware. A la hora de enviar código a los dispositivos, la práctica recomendada es firmar el archivo
de código. Esto permite que los dispositivos detecten si el código se ha modificado en su tránsito. Las
instrucciones en la siguiente sección se han escrito partiendo del supuesto de que desea firmar con código
la actualización de software que está enviando a sus dispositivos.
Para obtener más información, consulte ¿Qué es Code Signing for AWS IoT?
Antes de crear un trabajo debe crear un documento del trabajo. Si utiliza la firma de código para AWS
IoT, debe cargar su documento de trabajo en un bucket de Amazon S3 con control de versiones. Para
obtener más información acerca de cómo crear un bucket de Amazon S3 y cargar archivos en él, consulte
la sección sobre comenzar a usar Amazon Simple Storage Service en la guía de introducción para Amazon
S3.
Su documento del trabajo puede contener una URL de Amazon S3 que apunte a su archivo de código
(u otro archivo). Las URL de Amazon S3 prefirmadas son válidas durante un tiempo limitado, por lo que
no se generan hasta que un dispositivo solicita un documento de trabajo. Dado que la URL prefirmada
no se ha creado cuando se crea el documento del trabajo, en su lugar se pone una URL de marcador de
posición en el documento de trabajo. La URL de marcador de posición tiene un aspecto similar al siguiente:
${aws:iot:s3-presigned-url:https://s3.region.amazonaws.com/<bucket>/<code
file>} donde bucket es el bucket de Amazon S3 que contiene el archivo de código y code file es la
clave de Amazon S3 del archivo de código.
Cuando un dispositivo solicita el documento de trabajo, AWS IoT genera la URL prefirmada y sustituye la
URL de marcador de posición por la URL prefirmada. El documento del trabajo se envía al dispositivo.
Al crear un trabajo que usa direcciones URL de Amazon S3 prefirmadas, debe proporcionar un rol de IAM
que conceda permiso para descargar archivos desde el bucket de Amazon S3 donde se guardan los datos
o las actualizaciones. El rol debe conceder permiso también para que AWS IoT asuma el rol.
Puede especificar un tiempo de espera opcional para la URL prefirmada. Para obtener más información,
consulte CreateJob (p. 454).
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"iot.amazonaws.com"
]
},
416
AWS IoT Guía del desarrollador
Creación y administración de trabajos (consola)
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your_S3_bucket/*"
}
]
}
El marcador de posición para el archivo de código deberá ser parecido al siguiente: ${aws:iot:s3-
presigned-url:https://s3.amazonaws.com/<my-s3-bucket>/<my-code-file>}.
Note
417
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
9. Cree o elija un perfil de firma con código. Si no va a firmar con código la actualización puede omitir
este paso.
10. En Pre-sign resource URLs (Prefirmar direcciones URL de recursos), elija I want to pre-sign my URLs
and have configured my job file (Quiero prefirmar mis direcciones URL y hacer que se configure el
archivo de mi trabajo. Si no va a firmar con código la actualización puede omitir este paso.
11. Elija un rol y un tiempo de caducidad para la URL prefirmada.
12. En Job type (Tipo de trabajo), elija la opción adecuada para la actualización y, a continuación,
seleccione Next (Siguiente).
13. Especifique los valores de configuración avanzada y, a continuación, seleccione Create (Crear).
Después de crear el trabajo, la consola genera una firma JSON y la coloca en su documento del trabajo.
Puede usar la consola de AWS IoT para ver el estado de un trabajo, cancelarlo o eliminarlo.
Creación de trabajos
Utilice el comando CreateJob para crear un trabajo de AWS IoT. El trabajo se pone en cola para la
ejecución en los destinos (objetos o grupos de objetos) que especifique. Para crear un trabajo de AWS
IoT necesita un documento de trabajo que pueda incluirse en el cuerpo de la solicitud o como un enlace a
un documento de Amazon S3. Si el trabajo incluye la descarga de archivos mediante direcciones URL de
Amazon S3 prefirmadas, necesita un ARN de rol de IAM que tenga permiso para descargar el archivo y
conceda permiso al servicio Jobs de AWS IoT para asumir el rol.
El documento de trabajo debe contener un marcador de posición de URL prefirmada para su archivo de
código, y el resultado de la firma JSON en un bucket de Amazon S3 con el comando start-signing-job,
encerrado en un elemento codesign:
{
"presign": "${aws:iot:s3-presigned-url:https://s3.region.amazonaws.com/bucket/image}",
"codesign": {
"rawPayloadSize": <image-file-size>,
"signature": <signature>,
"signatureAlgorithm": <signature-algorithm>,
"payloadLocation": {
"s3": {
"bucketName": <my-s3-bucket>,
"key": <my-code-file>,
"version": <code-file-version-id>
}
418
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
}
}
}
El parámetro timeout-config opcional especifica la cantidad de tiempo que cada dispositivo tiene para
finalizar su ejecución del trabajo. El temporizador comienza cuando el estado de ejecución del trabajo se
establece en IN_PROGRESS. Si el estado de ejecución del trabajo no se establece en otro estado final
antes de que se cumpla el plazo, se establecerá en TIMED_OUT.
El temporizador en curso no se puede actualizar y se aplica a todas las ejecuciones de trabajos para
el trabajo. Cuando la ejecución de un trabajo permanece en estado IN_PROGRESS durante un periodo
superior a este intervalo, la ejecución del trabajo producirá un error y cambiará al estado final TIMED_OUT.
AWS IoT también publica una notificación MQTT.
Para obtener más información acerca de cómo crear configuraciones sobre despliegues de trabajos y
anulaciones, consulte Despliegue de trabajos y configuración de anulaciones.
Note
Los documentos de Jobs que está especificados como archivos de Amazon S3 se recuperan en el
momento en el que crea el trabajo. Si cambia el contenido del archivo Amazon S3 que usó como
origen de su documento de trabajo después de haber creado el trabajo, no cambia lo que se envía
a los destinos del trabajo.
Actualización de un trabajo
Para actualizar un trabajo se utiliza el comando UpdateJob. Puede actualizar los campos description,
presignedUrlConfig, jobExecutionsRolloutConfig, abortConfig y timeoutConfig para un
trabajo.
419
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
Cancelación de un trabajo
Para cancelar un trabajo se utiliza el comando CancelJob. Al cancelar un trabajo, AWS IoT dejará de
desplegar nuevas ejecuciones de trabajos para el trabajo. También cancela la ejecución de cualquier
trabajo que se encuentre en estado QUEUED. AWS IoT deja las ejecuciones de los trabajos en estado final
intactas, ya que el dispositivo ya ha completado el trabajo. Si el estado de la ejecución de un trabajo es
IN_PROGRESS, también se mantendrá intacta a menos que se use el parámetro opcional --force.
{
"jobArn": "string",
"jobId": "string",
"description": "string"
}
Cuando se cancela un trabajo, se cancelan las ejecuciones de trabajos con estado QUEUED. Las
ejecuciones de trabajos en estado IN_PROGRESS se cancelarán si especifica el parámetro opcional --
force. Las ejecuciones de trabajo con un estado terminal no se cancelarán.
Warning
El estado de un trabajo cancelado o de una de sus ejecuciones de trabajos es a la larga coherente: AWS
IoT detiene lo antes posible la programación de nuevas ejecuciones de trabajos y las ejecuciones en
dispositivos de trabajos con estado QUEUED. Cambiar el estado de la ejecución de un trabajo a CANCELED
puede llevar algo de tiempo, según el número de dispositivos y otros factores.
Si un trabajo se cancela porque cumple los criterios definidos por un objeto AbortConfig, el servicio
añade valores rellenados automáticamente para los campos reasonCode y comment. Puede crear sus
propios valores reasonCode cuando el trabajo se cancela por iniciativa del usuario.
420
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
El siguiente comando muestra cómo cancelar la ejecución de un trabajo del trabajo 010 que se ejecuta en
myThing.
Si la ejecución del trabajo se encuentra en estado final, o si la ejecución del trabajo está en
estado IN_PROGRESS y el parámetro --force no está definido en true, el comando genera
InvalidStateTransitionException.
Eliminación de un trabajo
Puede utilizar el comando DeleteJob para eliminar un trabajo y sus ejecuciones. De forma predeterminada,
solo puede eliminar un trabajo en estado final (SUCCEEDED o CANCELED). En caso contrario, se produce
una excepción. Podrá eliminar un trabajo con estado IN_PROGRESS si el parámetro force está definido
en true.
Eliminar un trabajo podría llevar algún tiempo, en función del número de ejecuciones de trabajos creadas
para el trabajo y otros factores. Aunque el trabajo se esté eliminando, como estado del trabajo se
muestra DELETION_IN_PROGRESS. Si se intenta eliminar o cancelar un trabajo cuyo estado ya es
DELETION_IN_PROGRESS, se producirá un error.
Solo puede haber 10 trabajos con estado DELETION_IN_PROGRESS al mismo tiempo. De lo contrario, se
genera LimitExceededException.
421
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
{
"document": "{\n\t\"operation\":\"install\",\n\t\"url\":\"http://amazon.com/
firmWareUpate-01\",\n\t\"data\":\"${aws:iot:s3-presigned-url:https://s3.amazonaws.com/job-
test-bucket/datafile}\"\n}"
}
Note
Al usar este comando para recuperar un documento de trabajo, las URL de marcador de posición
no se sustituirán por URL de Amazon S3 prefirmadas. Cuando un dispositivo llama a la API de
MQTT GetPendingJobExecutions (p. 500), las URL de marcador de posición se sustituyen por
URL de Amazon S3 prefirmadas en el documento de trabajo.
Enumeración de trabajos
Puede utilizar el comando ListJobs para obtener una lista de todos los trabajos de su cuenta de AWS. Los
datos del trabajo y los datos de ejecución del trabajo se conservan durante un tiempo limitado. Ejecute el
siguiente comando para listar todos los trabajos de su cuenta de AWS:
El comando devuelve todos los trabajos en su cuenta ordenados por estado del trabajo:
{
"jobs": [
{
"status": "IN_PROGRESS",
"lastUpdatedAt": 1486687079.743,
"jobArn": "arn:aws:iot:us-east-1:123456789012:job/013",
"createdAt": 1486687079.743,
"targetSelection": "SNAPSHOT",
"jobId": "013"
},
{
"status": "SUCCEEDED",
"lastUpdatedAt": 1486685868.444,
"jobArn": "arn:aws:iot:us-east-1:123456789012:job/012",
"createdAt": 1486685868.444,
"completedAt": 148668789.690,
"targetSelection": "SNAPSHOT",
"jobId": "012"
},
{
"status": "CANCELED",
"lastUpdatedAt": 1486678850.575,
"jobArn": "arn:aws:iot:us-east-1:123456789012:job/011",
"createdAt": 1486678850.575,
"targetSelection": "SNAPSHOT",
"jobId": "011"
}
]
}
422
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
Descripción de un trabajo
Ejecute el comando DescribeJob para obtener el estado de un trabajo. El siguiente comando muestra
cómo describir un trabajo:
{
"documentSource": "https://s3.amazonaws.com/job-test-bucket/job-document.json",
"job": {
"status": "IN_PROGRESS",
"jobArn": "arn:aws:iot:us-east-1:123456789012:job/010",
"targets": [
"arn:aws:iot:us-east-1:123456789012:thing/myThing"
],
"jobProcessDetails": {
"numberOfCanceledThings": 0,
"numberOfFailedThings": 0,
"numberOfInProgressThings": 0,
"numberOfQueuedThings": 0,
"numberOfRejectedThings": 0,
"numberOfRemovedThings": 0,
"numberOfSucceededThings": 0,
"numberOfTimedOutThings": 0,
"processingTargets": [
arn:aws:iot:us-east-1:123456789012:thing/thingOne,
arn:aws:iot:us-east-1:123456789012:thinggroup/thinggroupOne,
arn:aws:iot:us-east-1:123456789012:thing/thingTwo,
arn:aws:iot:us-east-1:123456789012:thinggroup/thinggroupTwo
]
},
"presignedUrlConfig": {
"expiresInSec": 60,
"roleArn": "arn:aws:iam::123456789012:role/S3DownloadRole"
},
"jobId": "010",
"lastUpdatedAt": 1486593195.006,
"createdAt": 1486593195.006,
"targetSelection": "SNAPSHOT",
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": integer,
"incrementFactor": integer,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": integer, // Set one or the other
"numberOfSucceededThings": integer // of these two values.
},
"maximumPerMinute": integer
}
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": integer,
"thresholdPercentage": integer
}
]
},
"timeoutConfig": {
423
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
"inProgressTimeoutInMinutes": number
}
}
}
{
"executionSummaries": [
{
"thingArn": "arn:aws:iot:us-east-1:123456789012:thing/thingOne",
"jobExecutionSummary": {
"status": "QUEUED",
"lastUpdatedAt": 1486593196.378,
"queuedAt": 1486593196.378,
"executionNumber": 1234567890
}
},
{
"thingArn": "arn:aws:iot:us-east-1:123456789012:thing/thingTwo",
"jobExecutionSummary": {
"status": "IN_PROGRESS",
"lastUpdatedAt": 1486593345.659,
"queuedAt": 1486593196.378,
"startedAt": 1486593345.659,
"executionNumber": 4567890123
}
}
]
}
El comando devuelve una lista de ejecuciones de trabajo que se ejecutan o se han ejecutado en el objeto
especificado:
{
"executionSummaries": [
{
"jobExecutionSummary": {
"status": "QUEUED",
"lastUpdatedAt": 1486687082.071,
"queuedAt": 1486687082.071,
"executionNumber": 9876543210
},
424
AWS IoT Guía del desarrollador
Creación y administración de trabajos (CLI)
"jobId": "013"
},
{
"jobExecutionSummary": {
"status": "IN_PROGRESS",
"startAt": 1486685870.729,
"lastUpdatedAt": 1486685870.729,
"queuedAt": 1486685870.729,
"executionNumber": 1357924680
},
"jobId": "012"
},
{
"jobExecutionSummary": {
"status": "SUCCEEDED",
"startAt": 1486678853.415,
"lastUpdatedAt": 1486678853.415,
"queuedAt": 1486678853.415,
"executionNumber": 4357680912
},
"jobId": "011"
},
{
"jobExecutionSummary": {
"status": "CANCELED",
"startAt": 1486593196.378,
"lastUpdatedAt": 1486593196.378,
"queuedAt": 1486593196.378,
"executionNumber": 2143174250
},
"jobId": "010"
}
]
}
{
"execution": {
"jobId": "017",
"executionNumber": 4516820379,
"thingArn": "arn:aws:iot:us-east-1:123456789012:thing/thingOne",
"versionNumber": 123,
"createdAt": 1489084805.285,
"lastUpdatedAt": 1489086279.937,
"startedAt": 1489086279.937,
"status": "IN_PROGRESS",
"approximateSecondsBeforeTimedOut": 100,
"statusDetails": {
"status": "IN_PROGRESS",
"detailsMap": {
"percentComplete": "10"
}
}
425
AWS IoT Guía del desarrollador
Dispositivos y trabajos
}
}
De forma predeterminada, el estado de ejecución de los trabajos debe ser QUEUED o un estado final
(SUCCEEDED, FAILED, REJECTED, TIMED_OUT, REMOVED o CANCELED). En caso contrario, se produce un
error. Para eliminar la ejecución de un trabajo con estado IN_PROGRESS, puede establecer el parámetro
force en true.
Warning
Cuando se elimina la ejecución de un trabajo con estado IN_PROGRESS, el dispositivo que está
ejecutando el trabajo no puede obtener acceso a la información del trabajo ni actualizar el estado
de su ejecución. Actúe con precaución y asegúrese de que el dispositivo pueda recuperarse a un
estado válido.
Dispositivos y trabajos
Device communication with jobs
Los dispositivos pueden comunicarse con el servicio Jobs de AWS IoT mediante uno de estos
métodos:
• MQTT
• HTTP Signature Version 4
• HTTP TLS
La comunicación entre el servicio Jobs de AWS IoT y sus dispositivos puede realizarse a través
del protocolo MQTT. Los dispositivos se suscriben a temas MQTT para recibir notificaciones de
trabajos nuevos y respuestas del servicio Jobs de AWS IoT. Los dispositivos publican en temas MQTT
para consultar o actualizar el estado de una ejecución de trabajo. Cada dispositivo tiene su propio
tema MQTT general. Para obtener más información acerca de cómo publicar en temas de MQTT y
suscribirse a ellos, consulte Agente de mensajes de AWS IoT (p. 266).
Note
Debe utilizar el punto de enlace correcto al comunicarse con el servicio Jobs de AWS IoT a
través de MQTT. Utilice el comando DescribeEndpoint para buscarlo. Por ejemplo, si ejecuta
este comando:
426
AWS IoT Guía del desarrollador
Dispositivos y trabajos
{
"endpointAddress": "a1b2c3d4e5f6g7.iot.us-west-2.amazonaws.com"
}
Con este método, el dispositivo utiliza su propio certificado y su propia clave privada para
autenticarse en el servicio Jobs de AWS IoT.
• Recibir notificaciones cuando se añade o se quita una ejecución de trabajo de la lista de ejecuciones
de trabajo pendientes para un dispositivo mediante la suscripción al tema de MQTT $aws/
things/thing-name/jobs/notify, donde thing-name es el nombre del objeto asociado al
dispositivo.
• Recibir notificaciones cuando la siguiente ejecución de trabajo pendiente ha cambiado mediante la
suscripción al tema de MQTT $aws/things/thing-name/jobs/notify-next, donde thing-
name es el nombre del objeto asociado al dispositivo.
• Actualizar el estado de una ejecución de trabajo llamando a la API UpdateJobExecution (p. 514).
• Consultar el estado de una ejecución de trabajo llamando a la API DescribeJobExecution (p. 509).
• Recuperar una lista de ejecuciones de trabajo pendientes llamando a la API
GetPendingJobExecutions (p. 500).
• Recuperar la siguiente ejecución de trabajo pendiente llamando a la API
DescribeJobExecution (p. 509) con jobId $next.
• Obtener e iniciar la ejecución de trabajo pendiente siguiente llamando a la API
StartNextPendingJobExecution (p. 504).
El servicio Jobs de AWS IoT publica los mensajes de éxito y error en un tema de MQTT. El tema se
forma añadiendo accepted o rejected al tema utilizado para realizar la solicitud. Por ejemplo, si se
publica un mensaje de solicitud en el tema $aws/things/myThing/jobs/get, el servicio Jobs de
AWS IoT publica mensajes de éxito en el tema $aws/things/myThing/jobs/get/accepted y
publica los mensajes rechazados en el tema $aws/things/myThing/jobs/get/rejected.
Using HTTP Signature Version 4
La comunicación entre el servicio Jobs de AWS IoT y los dispositivos puede realizarse a través de
HTTP Signature Version 4 en el puerto 443. Este es el método utilizado por los SDK de AWS y la CLI.
Para obtener más información sobre estas herramientas, consulte la referencia de comandos de la CLI
de AWS: iot-jobs-data o SDK y herramientas de AWS y consulte la sección IotJobsDataPlane para su
idioma.
Note
Debe utilizar el punto de enlace correcto al comunicarse con el servicio Jobs de AWS IoT
a través de HTTP Signature Version 4 o con un SDK de AWS o un comando de la CLI
IotJobsDataPlane. Utilice el comando DescribeEndpoint para buscarlo. Por ejemplo, si
ejecuta este comando:
{
"endpointAddress": "a1b2c3d4e5f6g7.jobs.iot.us-west-2.amazonaws.com"
}
427
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
• DescribeJobExecution
La comunicación entre el servicio Jobs de AWS IoT y los dispositivos puede producirse a través de
HTTP TLS en el puerto 8443 utilizando un cliente de software de terceros que admita este protocolo.
Note
Debe utilizar el punto de enlace correcto al comunicarse con el servicio Jobs de AWS IoT
a través de HTTP TLS. Utilice el comando DescribeEndpoint para buscarlo. Por ejemplo, si
ejecuta este comando:
{
"endpointAddress": "a1b2c3d4e5f6g7.jobs.iot.us-west-2.amazonaws.com"
}
Con este método, el dispositivo utiliza la autenticación basada en certificados X.509 (por
ejemplo, utilizando su propio certificado y su propia clave privada).
• DescribeJobExecution
• GetPendingJobExecutions
• StartNextPendingJobExecution
• UpdateJobExecution
428
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
• $aws/things/MyThing/jobs/get/accepted
• $aws/things/MyThing/jobs/get/rejected
• $aws/things/MyThing/jobs/jobId/get/accepted
• $aws/things/MyThing/jobs/jobId/get/rejected
Si utiliza firma con código para AWS IoT, el código del dispositivo debe verificar la firma del archivo de
código. La firma se encuentra en el documento de trabajo, en la propiedad codesign. Para obtener más
información sobre cómo verificar una firma en un archivo de código, consulte el ejemplo de agente de
dispositivo.
1. Cuando un dispositivo está online, debe suscribirse al tema notify-next del dispositivo.
2. Llame a la API de MQTT de DescribeJobExecution (p. 509) con jobId $next para obtener
el siguiente trabajo, su documento de trabajo y otros detalles, incluido el estado guardado en
statusDetails. Si el documento de trabajo tiene una forma en archivo de código, debe verificar
la firma antes de seguir procesando la solicitud del trabajo.
3. Llame a la API de MQTT de UpdateJobExecution (p. 514) para actualizar el estado del trabajo.
También puede combinar este paso y el anterior en una llamada. El dispositivo puede llamar a
StartNextPendingJobExecution (p. 504).
4. Si lo prefiere, puede añadir un temporizador de pasos estableciendo un valor
para stepTimeoutInMinutes si llama a UpdateJobExecution (p. 514) o
StartNextPendingJobExecution (p. 504).
5. Realice las acciones especificadas por el documento de trabajo con la API de MQTT de
UpdateJobExecution (p. 514) para informar del progreso del trabajo.
6. Siga monitorizando la ejecución del trabajo llamando a la API de MQTT
DescribeJobExecution (p. 509) con este jobId. Si la ejecución de trabajo se cancela o se elimina
al mismo tiempo que el dispositivo está ejecutando el trabajo, el dispositivo debería ser capaz de
recuperarse a un estado válido.
7. Llame a la API de MQTT de UpdateJobExecution (p. 514) cuando termine con el trabajo para
actualizar el estado del trabajo e informar del éxito o error.
8. El siguiente trabajo disponible para su ejecución (si lo hubiera) cambiará, puesto que el estado
de la ejecución del trabajo ha cambiado a estado final. Se notifica al dispositivo que la siguiente
ejecución de trabajo pendiente ha cambiado. En este momento, el dispositivo debe continuar
como se describe en el paso 2.
1. Cuando un dispositivo está online, debe suscribirse al tema notify del objeto.
2. Llame a la API de MQTT de GetPendingJobExecutions (p. 500) para obtener una lista de
ejecuciones de trabajo pendientes.
3. Si la lista contiene una o más ejecuciones de trabajo, elija una.
4. Llame a la API de MQTT DescribeJobExecution (p. 509) para obtener el documento de trabajo y
otros detalles, incluido cualquier estado guardado en statusDetails.
429
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
5. Llame a la API de MQTT de UpdateJobExecution (p. 514) para actualizar el estado del trabajo.
Si el campo includeJobDocument está establecido en true en este comando, el dispositivo
puede omitir el paso anterior y recuperar el documento de trabajo en este momento.
6. Si lo prefiere, puede añadir un temporizador de pasos estableciendo un valor para
stepTimeoutInMinutes si llama a UpdateJobExecution (p. 514).
7. Realice las acciones especificadas por el documento de trabajo con la API de MQTT de
UpdateJobExecution (p. 514) para informar del progreso del trabajo.
8. Siga monitorizando la ejecución del trabajo llamando a la API de MQTT
DescribeJobExecution (p. 509) con este jobId. Si la ejecución de trabajo se cancela o se elimina
al mismo tiempo que el dispositivo está ejecutando el trabajo, el dispositivo debería ser capaz de
recuperarse a un estado válido.
9. Llame a la API de MQTT de UpdateJobExecution (p. 514) cuando termine con el trabajo para
actualizar el estado del trabajo e informar del éxito o error.
Si el dispositivo continúa online, se le notificarán todas las ejecuciones de trabajo pendientes cuando
una nueva ejecución de trabajo pendiente esté disponible. Cuando se produzca esto, el dispositivo
podrá seguir como se describe en el paso 2.
Cuando se crea un trabajo nuevo, el servicio Jobs de AWS IoT publica un mensaje en el tema $aws/
things/thing-name/jobs/notify para cada dispositivo de destino.
More Information(1)
{
"timestamp":1476214217017,
"jobs":{
"QUEUED":[{
"jobId":"0001",
"queuedAt":1476214216981,
"lastUpdatedAt":1476214216981,
"versionNumber" : 1
}]
}
}
Para obtener más información sobre la ejecución de un trabajo, el dispositivo llama a la API de MQTT
DescribeJobExecution (p. 509) con el campo includeJobDocument establecido en true (el valore
predeterminado).
More Information(2)
Si la solicitud es correcta, el servicio Jobs de AWS IoT publica un mensaje en el tema $aws/things/
MyThing/jobs/0023/get/accepted:
430
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
{
"clientToken" : "client-001",
"timestamp" : 1489097434407,
"execution" : {
"approximateSecondsBeforeTimedOut": number,
"jobId" : "023",
"status" : "QUEUED",
"queuedAt" : 1489097374841,
"lastUpdatedAt" : 1489097374841,
"versionNumber" : 1,
"jobDocument" : {
< contents of job document >
}
}
}
Note
El dispositivo ahora tiene el documento de trabajo que puede usar para realizar las operaciones remotas
para el trabajo. Si el documento de trabajo contiene una URL prefirmada de Amazon S3 el dispositivo
puede usar esa URL para descargar los archivos necesarios para el trabajo.
{
"status":"IN_PROGRESS",
"statusDetails": {
"progress":"50%"
},
"expectedVersion":"1",
"clientToken":"client001"
}
{
"clientToken":"client001",
"timestamp":1476289222841
}
431
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
permite al dispositivo actualizar el estado de ejecución del trabajo. Esta solicitud también devuelve el
documento de trabajo cuando hay una ejecución de trabajo pendiente.
Por ejemplo:
{
"status":"SUCCEEDED",
"statusDetails": {
"progress":"100%"
},
"expectedVersion":"2",
"clientToken":"client-001"
}
{
"status":"FAILED",
"statusDetails": {
"errorCode":"101",
"errorMsg":"Unable to install update"
},
"expectedVersion":"2",
"clientToken":"client-001"
}
Note
Cuando el servicio Jobs de AWS IoT recibe esta actualización, publica un mensaje en el tema $aws/
things/MyThing/jobs/notify para indicar que la ejecución del trabajo se ha completado:
{
"timestamp":1476290692776,
"jobs":{}
432
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
Trabajos adicionales
Additional jobs
Si hay otras ejecuciones de trabajo pendientes para el dispositivo, se incluyen en el mensaje publicado
en $aws/things/MyThing/jobs/notify.
More Information(5)
Por ejemplo:
{
"timestamp":1476290692776,
"jobs":{
"QUEUED":[{
"jobId":"0002",
"queuedAt":1476290646230,
"lastUpdatedAt":1476290646230
}],
"IN_PROGRESS":[{
"jobId":"0003",
"queuedAt":1476290646230,
"lastUpdatedAt":1476290646230
}]
}
}
Notificaciones de trabajos
El servicio Jobs de AWS IoT publica mensajes de MQTT para temas reservados cuando los trabajos están
pendientes o cuando cambia la primera ejecución del trabajo en la lista. Los dispositivos pueden realizar
un seguimiento de los trabajos pendientes suscribiéndose a estos temas.
Las notificaciones de trabajo se publican en temas MQTT como cargas JSON. Existen dos tipos de
notificaciones:
• Una ListNotification contiene una lista de no más de 10 ejecuciones de trabajos pendientes. Las
ejecuciones de trabajo de esta lista tienen valores de estado IN_PROGRESS o QUEUED. Se almacenan
por estado (ejecuciones de trabajo IN_PROGRESS antes que las ejecuciones de trabajo QUEUED) y, a
continuación, por las veces que se incluyeron en la cola.
Una ListNotification se publica siempre que se cumple uno de los siguientes criterios.
• Se pone en cola una nueva ejecución de trabajo o se cambia a un estado no terminal (IN_PROGRESS
o QUEUED).
• Una ejecución de trabajo antigua cambia a un estado terminal (FAILED, SUCCEEDED, CANCELED,
TIMED_OUT, REJECTED o REMOVED).
• NextNotification contiene información resumida sobre la ejecución del trabajo a continuación en la
cola.
Se publica una NextNotification siempre que cambia la ejecución del primer trabajo de la lista.
• Se añade a la lista una nueva ejecución del trabajo como QUEUED y se coloca el primero en la lista.
• El estado de la ejecución de un trabajo existente que no estaba en el primer lugar en la lista cambia
de QUEUED a IN_PROGRESS y pasa a colocarse en primer lugar en la lista. (Esto sucede cuando no
hay otras ejecuciones de trabajos de IN_PROGRESS en la lista o cuando la ejecución del trabajo cuyo
433
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
estado cambia de QUEUED a IN_PROGRESS estaba en la cola antes que cualquier otra ejecución de
trabajo de IN_PROGRESS de la lista.)
• El estado de la ejecución del trabajo existente que se encuentra en el primer lugar de la lista cambia a
un estado terminal y se quita de la lista.
Para obtener más información acerca de cómo publicar en temas de MQTT y suscribirse a ellos, consulte
Agente de mensajes de AWS IoT (p. 266).
Note
Las notificaciones no están disponibles cuando se usa HTTP Signature Version 4 o HTTP TLS
para comunicarse con trabajos.
Job pending
El servicio Jobs de AWS IoT publica un mensaje en un tema de MQTT cuando se añade un trabajo
a la lista de ejecuciones de trabajos pendientes para un objeto o se quita un trabajo de dicha lista, o
cuando cambia la primera ejecución del trabajo en la lista:
• $aws/things/thingName/jobs/notify
• $aws/things/thingName/jobs/notify-next
More Information(6)
$aws/things/thingName/jobs/notify:
{
"timestamp" : 10011,
"jobs" : {
"IN_PROGRESS" : [ {
"jobId" : "other-job",
"queuedAt" : 10003,
"lastUpdatedAt" : 10009,
"executionNumber" : 1,
"versionNumber" : 1
} ],
"QUEUED" : [ {
"jobId" : "this-job",
"queuedAt" : 10011,
"lastUpdatedAt" : 10011,
"executionNumber" : 1,
"versionNumber" : 0
} ]
}
}
$aws/things/thingName/jobs/notify-next:
{
"timestamp" : 10011,
"execution" : {
"jobId" : "other-job",
"status" : "IN_PROGRESS",
"queuedAt" : 10009,
"lastUpdatedAt" : 10009,
"versionNumber" : 1,
"executionNumber" : 1,
"jobDocument" : {"c":"d"}
434
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
}
}
Los valores del estado de ejecución de trabajo posibles son QUEUED, IN_PROGRESS, FAILED,
SUCCEEDED, CANCELED, TIMED_OUT, REJECTED y REMOVED.
La siguiente serie de ejemplos muestra las notificaciones que se publican en cada tema a medida que
se crean las ejecuciones de trabajo y se cambian de un estado a otro.
En primer lugar se crea un trabajo llamado job1. La notificación se publica en el tema jobs/notify:
{
"timestamp": 1517016948,
"jobs": {
"QUEUED": [
{
"jobId": "job1",
"queuedAt": 1517016947,
"lastUpdatedAt": 1517016947,
"executionNumber": 1,
"versionNumber": 1
}
]
}
}
{
"timestamp": 1517016948,
"execution": {
"jobId": "job1",
"status": "QUEUED",
"queuedAt": 1517016947,
"lastUpdatedAt": 1517016947,
"versionNumber": 1,
"executionNumber": 1,
"jobDocument": {
"operation": "test"
}
}
}
Cuando se crea otro trabajo (job2), esta notificación se publica en el tema jobs/notify:
{
"timestamp": 1517017192,
"jobs": {
"QUEUED": [
{
"jobId": "job1",
"queuedAt": 1517016947,
"lastUpdatedAt": 1517016947,
"executionNumber": 1,
"versionNumber": 1
},
{
"jobId": "job2",
"queuedAt": 1517017191,
"lastUpdatedAt": 1517017191,
"executionNumber": 1,
"versionNumber": 1
435
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
}
]
}
}
Cuando se añade un tercer trabajo (job3), esta notificación se publica en el tema jobs/notify:
{
"timestamp": 1517017906,
"jobs": {
"IN_PROGRESS": [
{
"jobId": "job1",
"queuedAt": 1517016947,
"lastUpdatedAt": 1517017472,
"startedAt": 1517017472,
"executionNumber": 1,
"versionNumber": 2
}
],
"QUEUED": [
{
"jobId": "job2",
"queuedAt": 1517017191,
"lastUpdatedAt": 1517017191,
"executionNumber": 1,
"versionNumber": 1
},
{
"jobId": "job3",
"queuedAt": 1517017905,
"lastUpdatedAt": 1517017905,
"executionNumber": 1,
"versionNumber": 1
}
]
}
}
Cuando job1 finaliza, su estado cambia a SUCCEEDED y se publica esta notificación en el tema
jobs/notify:
{
"timestamp": 1517186269,
"jobs": {
"QUEUED": [
{
"jobId": "job2",
"queuedAt": 1517017191,
"lastUpdatedAt": 1517017191,
"executionNumber": 1,
"versionNumber": 1
},
{
"jobId": "job3",
"queuedAt": 1517017905,
436
AWS IoT Guía del desarrollador
Programación de dispositivos para trabajar con trabajos
"lastUpdatedAt": 1517017905,
"executionNumber": 1,
"versionNumber": 1
}
]
}
}
En este punto, job1 se ha eliminado de la cola y el siguiente trabajo que ejecutar es job2. La
notificación se publica en el tema jobs/notify-next:
{
"timestamp": 1517186269,
"execution": {
"jobId": "job2",
"status": "QUEUED",
"queuedAt": 1517017191,
"lastUpdatedAt": 1517017191,
"versionNumber": 1,
"executionNumber": 1,
"jobDocument": {
"operation": "test"
}
}
}
Si job3 tiene que empezar a ejecutarse antes que job2 (lo cual no se recomienda), el estado de
job3 puede cambiarse a IN_PROGRESS. Si esto sucede, job2 deja de ser el siguiente en la cola y se
publica esta notificación en el tema jobs/notify-next:
{
"timestamp": 1517186779,
"execution": {
"jobId": "job3",
"status": "IN_PROGRESS",
"queuedAt": 1517017905,
"startedAt": 1517186779,
"lastUpdatedAt": 1517186779,
"versionNumber": 2,
"executionNumber": 1,
"jobDocument": {
"operation": "test"
}
}
}
{
"timestamp": 1517189392,
"jobs": {
"IN_PROGRESS": [
{
"jobId": "job3",
"queuedAt": 1517017905,
"lastUpdatedAt": 1517186779,
"startedAt": 1517186779,
"executionNumber": 1,
437
AWS IoT Guía del desarrollador
Uso de las API de trabajos de AWS IoT
"versionNumber": 2
}
]
}
}
Si job3 (que aún está en curso) se elimina de forma forzada, esta notificación se publica en el tema
jobs/notify:
{
"timestamp": 1517189551,
"jobs": {}
}
{
"timestamp": 1517189551
}
Por lo general, las de administración y control de trabajos utilizan una API de protocolo HTTPS. Los
dispositivos pueden usar una API de protocolo HTTPS o MQTT. (La API de HTTPS se ha diseñado para
un volumen reducido de llamadas normalmente cuando se crean trabajos y se hace un seguimiento de
ellos. Normalmente, abre una conexión para una solicitud única y, a continuación, cierra la conexión
después de que se reciba la respuesta. La API de MQTT permite el sondeo largo. Se ha diseñado para
cantidades grandes de tráfico que pueden escalar millones de dispositivos).
Note
Cada API HTTPS de Jobs de AWS IoT tiene un comando correspondiente que le permite llamar
a la API desde la AWS CLI. Los comandos están en minúsculas, con guiones entre las palabras
que conforman el nombre de la API. Por ejemplo, puede invocar la API CreateJob en la CLI
escribiendo lo siguiente:
Tarea
Job data type
438
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Syntax (1)
{
"jobArn": "string",
"jobId": "string",
"status": "IN_PROGRESS|CANCELED|SUCCEEDED",
"forceCanceled": boolean,
"targetSelection": "CONTINUOUS|SNAPSHOT",
"comment": "string",
"targets": ["string"],
"description": "string",
"createdAt": timestamp,
"lastUpdatedAt": timestamp,
"completedAt": timestamp,
"jobProcessDetails": {
"processingTargets": ["string"],
"numberOfCanceledThings": long,
"numberOfSucceededThings": long,
"numberOfFailedThings": long,
"numberOfRejectedThings": long,
"numberOfQueuedThings": long,
"numberOfInProgressThings": long,
"numberOfRemovedThings": long,
"numberOfTimedOutThings": long
},
"presignedUrlConfig": {
"expiresInSec": number,
"roleArn": "string"
},
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": integer,
"incrementFactor": integer,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": integer, // Set one or the other
"numberOfSucceededThings": integer // of these two values.
},
"maximumPerMinute": integer
}
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": integer,
"thresholdPercentage": integer
}
]
},
"timeoutConfig": {
"inProgressTimeoutInMinutes": long
}
}
Description (1)
jobArn
439
AWS IoT Guía del desarrollador
API de administración y control de trabajo
status
Una lista de grupos de objetos y objetos de AWS IoT a los que debe enviarse el trabajo.
description
El tiempo, en segundos, desde la fecha de inicio, cuando se actualizó el trabajo por última vez.
completedAt
Una lista de los grupos de objeto y objetos de AWS IoT que ejecutan actualmente el trabajo.
numberOfCanceledThings
El número de objetos de AWS IoT que están esperando la ejecución del trabajo.
numberOfInProgressThings
El número de objetos de AWS IoT que ya no están programados para ejecutar el trabajo
porque se han eliminado o quitado del grupo que era un destino del trabajo.
440
AWS IoT Guía del desarrollador
API de administración y control de trabajo
numberOfTimedOutThings
Tiempo (en segundos) durante el que las URL prefirmadas son válidas. Los valores válidos
son 60-3600. El valor predeterminado es 3600 segundos. Cuando el servicio Jobs de AWS
IoT recibe una solicitud de MQTT para el documento de trabajo, se generan URL prefirmadas.
roleArn
El ARN del rol de IAM que concede permiso para descargar archivos de un bucket de
Amazon S3. El rol debe conceder permiso también para que AWS IoT descargue los
archivos. Para obtener más información acerca de cómo crear y configurar el rol, consulte
Creación de trabajos (p. 418).
jobExecutionRolloutConfig
El número máximo de objetos (dispositivos) a los que se envía el trabajo para su ejecución,
por minuto.
exponentialRate
El umbral del número de objetos con éxito que iniciará el aumento en la tasa de
despliegue.
abortConfig
441
AWS IoT Guía del desarrollador
API de administración y control de trabajo
action
El tipo de error de ejecución de trabajo para definir una regla para iniciar un trabajo de
anulación.
minNumberOfExecutedThings
El umbral como porcentaje del total de objetos ejecutados que inicia la anulación de un
trabajo.
timeoutConfig
Opcional. Especifica la cantidad de tiempo que cada dispositivo tiene para finalizar su ejecución
del trabajo. El temporizador se pone en marcha cuando el estado de ejecución del trabajo se
establece en IN_PROGRESS. Si el estado de ejecución del trabajo no se establece en otro estado
terminal antes de que se cumpla el plazo, se establecerá en TIMED_OUT.
inProgressTimeoutInMinutes
Especifica la cantidad de tiempo, en minutos, que tiene este dispositivo para finalizar la
ejecución de este trabajo. Un temporizador se inicia o reinicia, siempre que el estado de
ejecución del trabajo se especifica como IN_PROGRESS con este campo relleno. Si el
estado de ejecución del trabajo no se ha establecido en un estado terminal antes de que el
temporizador venza, o antes de que se envíe otra actualización de estado de ejecución del
trabajo con este campo rellenado, el estado se establece en TIMED_OUT.
JobSummary
JobSummary data type
{
"jobArn": "string",
"jobId": "string",
"status": "IN_PROGRESS|CANCELED|SUCCEEDED",
"targetSelection": "CONTINUOUS|SNAPSHOT",
"thingGroupId": "string",
"createdAt": timestamp,
"lastUpdatedAt": timestamp,
"completedAt": timestamp
}
Description (2)
jobArn
442
AWS IoT Guía del desarrollador
API de administración y control de trabajo
targetSelection
JobExecution
JobExection data type
{
"approximateSecondsBeforeTimedOut": 50,
"executionNumber": 1234567890,
"forceCanceled": true|false,
"jobId": "string",
"lastUpdatedAt": timestamp,
"queuedAt": timestamp,
"startedAt": timestamp,
"status": "QUEUED|IN_PROGRESS|FAILED|SUCCEEDED|CANCELED|TIMED_OUT|REJECTED|
REMOVED",
"forceCanceled": boolean,
"statusDetails": {
"detailsMap": {
"string": "string" ...
},
"status": "string"
},
"thingArn": "string",
"versionNumber": 123
}
Description (3)
approximateSecondsBeforeTimedOut
El número estimado de segundos restantes antes de que el estado de ejecución del trabajo
cambie a TIMED_OUT. El intervalo de tiempo de espera puede estar en cualquier momento entre
1 minuto y 7 días (1 a 10 080 minutos). El tiempo de espera de ejecución de trabajo real puede
producirse hasta un máximo de 60 segundos más tarde que la duración estimada.
443
AWS IoT Guía del desarrollador
API de administración y control de trabajo
jobId
Un número que identifica la ejecución de este trabajo en este dispositivo. Se puede utilizar
después en comandos que devuelven o actualizan la información de ejecución de trabajo.
thingArn
El tiempo, en segundos, desde la fecha de inicio, cuando se puso en cola la ejecución de trabajo.
lastUpdatedAt
El tiempo, en segundos, desde la fecha de inicio, cuando se actualizó la ejecución de trabajo por
última vez.
startedAt
JobExecutionSummary
JobExecutionSummary data type
{
"executionNumber": 1234567890,
"queuedAt": timestamp,
"lastUpdatedAt": timestamp,
"startedAt": timestamp,
"status": "QUEUED|IN_PROGRESS|FAILED|SUCCEEDED|CANCELED|TIMED_OUT|REJECTED|REMOVED"
}
Description (4)
executionNumber
El tiempo, en segundos, desde la fecha de inicio, cuando se puso en cola la ejecución de trabajo.
lastUpdatedAt
El tiempo, en segundos, desde la fecha de inicio, cuando se actualizó la ejecución de trabajo por
última vez.
444
AWS IoT Guía del desarrollador
API de administración y control de trabajo
startAt
JobExecutionSummaryForJob
JobExecutionSummaryForJob data type
{
"executionSummaries": [
{
"thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyThing",
"jobExecutionSummary": {
"status": "IN_PROGRESS",
"lastUpdatedAt": 1549395301.389,
"queuedAt": 1541526002.609,
"executionNumber": 1
}
},
...
]
}
Description (5)
thingArn
JobExecutionSummaryForThing
JobExecutionSummaryForThing data type
{
"executionSummaries": [
{
"jobExecutionSummary": {
"status": "IN_PROGRESS",
"lastUpdatedAt": 1549395301.389,
"queuedAt": 1541526002.609,
"executionNumber": 1
},
"jobId": "MyThingJob"
445
AWS IoT Guía del desarrollador
API de administración y control de trabajo
},
...
]
}
Description (6)
jobId
{
"endpointAddress": "unique-.jobs.iot.us-west-2.amazonaws.com"
}
AssociateTargetsWithJob
AssociateTargetsWithJob command
Asocia un grupo con un trabajo continuo. Para obtener más información, consulte
CreateJob (p. 454). Deben cumplirse los siguientes criterios:
HTTPS (1)
Solicitud:
POST /jobs/jobId/targets
{
"targets": [ "string" ],
"comment": "string"
}
jobId
446
AWS IoT Guía del desarrollador
API de administración y control de trabajo
targets
Una lista de ARN del grupo de objetos que definen los destinos del trabajo.
comment
Opcional. Una cadena de comentario que describe el motivo por el que el trabajo se asoció con
los destinos.
Respuesta:
{
"jobArn": "string",
"jobId": "string",
"description": "string"
}
jobArn
CLI (1)
Sinopsis:
cli-input-json formato:
{
"targets": [
"string"
],
"jobId": "string",
"comment": "string"
}
Campos cli-input-json:
TargetArn string
447
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Patrón: [a-zA-Z0-9_-]+
Salida:
{
"jobArn": "string",
"jobId": "string",
"description": "string"
}
Patrón: [a-zA-Z0-9_-]+
Longitud máx.: 2028
patrón: [^\\p{C}]+
CancelJob
CancelJob command
Cancela un trabajo.
HTTPS (2)
Solicitud:
PUT /jobs/jobId/cancel
{
"force": boolean,
"comment": "string",
"reasonCode": "string"
}
448
AWS IoT Guía del desarrollador
API de administración y control de trabajo
jobId
[Opcional] Si true, se cancelan las ejecuciones de trabajos con estado IN_PROGRESS y QUEUED.
Si no, solo se cancelan las ejecuciones de trabajos con estado QUEUED. El valor predeterminado
es false.
Warning
La cancelación de un trabajo con estado IN_PROGRESS hará que un dispositivo que esté
ejecutando el trabajo no pueda actualizar su estado de ejecución. Actúe con precaución
y asegúrese de que cada dispositivo que ejecute un trabajo que se cancela sea capaz de
recuperarse a un estado válido.
comment
[Opcional] Una cadena de comentario que describe el motivo por el que se canceló el trabajo.
reasonCode
[Opcional] Una cadena de código de motivo que explica por qué se ha cancelado el trabajo. Si un
trabajo se cancela porque cumple las condiciones definidas por abortConfig, este campo se
rellena automáticamente.
Respuesta:
{
"jobArn": "string",
"jobId": "string",
"description": "string"
}
jobArn
El ARN de trabajo.
jobId
CLI (2)
Sinopsis:
cli-input-json formato:
449
AWS IoT Guía del desarrollador
API de administración y control de trabajo
"jobId": "string",
"force": boolean,
"comment": "string"
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
La cancelación de un
trabajo con estado
IN_PROGRESS hará
que un dispositivo
que esté ejecutando
el trabajo no pueda
actualizar su estado
de ejecución. Actúe
con precaución y
asegúrese de que
cada dispositivo que
ejecute un trabajo que
se cancela sea capaz
de recuperarse a un
estado válido.
patrón: [^\\p{C}]+
Salida:
{
"jobArn": "string",
"jobId": "string",
"description": "string"
450
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Patrón: [a-zA-Z0-9_-]+
Longitud máx.: 2028
patrón: [^\\p{C}]+
CancelJobExecution
CancelJobExecution command
Solicitud:
PUT /things/thingName/jobs/jobId/cancel
{
"force": boolean,
"expectedVersion": "string",
"statusDetails": {
"string": "string"
...
}
}
thingName
La cancelación de un trabajo con estado IN_PROGRESS hará que un dispositivo que esté
ejecutando el trabajo no pueda actualizar su estado de ejecución. Actúe con precaución
y asegúrese de que cada dispositivo que ejecute un trabajo que se cancela sea capaz de
recuperarse a un estado válido.
451
AWS IoT Guía del desarrollador
API de administración y control de trabajo
expectedVersion
Opcional. La versión actual esperada de la ejecución de trabajos. Cada vez que actualiza
la ejecución de trabajos, aumenta su versión. Si la versión de la ejecución del trabajo
almacenada en el servicio Jobs de AWS IoT no coincide, la actualización se rechaza con un error
VersionConflictException y se devuelve un código ErrorResponse con los datos de
estado de la ejecución del trabajo actual. (Esto hace que no sea necesario realizar una solicitud
DescribeJobExecution aparte para obtener los datos de estado de ejecución del trabajo).
statusDetails
Opcional. Un conjunto de pares nombre-valor que describen el estado de ejecución del trabajo.
Respuesta:
{
}
CLI (3)
Sinopsis:
cli-input-json formato:
{
"jobId": "string",
"thingName": "string",
"force": boolean,
"expectedVersion": long,
"statusDetails": {
"string": "string"
}
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
Patrón: [a-zA-Z0-9:_-]+
452
AWS IoT Guía del desarrollador
API de administración y control de trabajo
La cancelación de un
trabajo con estado
IN_PROGRESS hará
que un dispositivo
que esté ejecutando
el trabajo no pueda
actualizar su estado
de ejecución. Actúe
con precaución y
asegúrese de que
cada dispositivo que
ejecute un trabajo que
se cancela sea capaz
de recuperarse a un
estado válido.
453
AWS IoT Guía del desarrollador
API de administración y control de trabajo
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
patrón: [^\\p{C}]*+
Salida:
Ninguna
CreateJob
CreateJob command
Crea un trabajo. Puede proporcionar el documento de trabajo como enlace a un archivo en un bucket
de Amazon S3 (parámetro documentSource) o en el cuerpo de la solicitud (parámetro document).
Un trabajo puede tener un valor TimeoutConfig opcional que establece el valor del temporizador en
curso. El temporizador en curso no se puede actualizar y se aplica a todas las ejecuciones del trabajo.
• El argumento targets debe ser una lista de ARN de grupo de objetos u objetos válidos. Todos los
objetos y grupos de objetos deben estar en la cuenta de AWS.
• El argumento documentSource debe ser una URL de Amazon S3 válida para un
documento de trabajo. Las URL de Amazon S3 tienen la siguiente forma: https://
s3.amazonaws.com/bucketName/objectName.
• El documento almacenado en la URL especificada por el argumento documentSource debe ser un
documento JSON con codificación UTF-8.
• El tamaño del documento de trabajo está limitado a 32 KB debido al límite del tamaño de un
mensaje MQTT (128 KB) y el cifrado.
• jobId debe ser exclusivo dentro de su cuenta de AWS.
HTTPS (4)
Solicitud:
454
AWS IoT Guía del desarrollador
API de administración y control de trabajo
PUT /jobs/jobId
{
"targets": [ "string" ],
"document": "string",
"documentSource": "string",
"description": "string",
"presignedUrlConfigData": {
"roleArn": "string",
"expiresInSec": "integer"
},
"targetSelection": "CONTINUOUS|SNAPSHOT",
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": integer,
"incrementFactor": integer,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": integer, // Set one or the other
"numberOfSucceededThings": integer // of these two values.
},
"maximumPerMinute": integer
}
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": integer,
"thresholdPercentage": integer
}
]
},
"timeoutConfig": {
"inProgressTimeoutInMinutes": long
}
}
jobId
Un identificador de trabajo, que debe ser exclusivo para su cuenta de AWS. Recomendamos
utilizar un UUID. Aquí pueden utilizarse caracteres alfanuméricos, "-" y "_".
targets
Una lista de ARN de grupo de objetos u objetos que define los destinos del trabajo.
document
El ARN del rol de IAM que contiene permisos para acceder al bucket de Amazon S3. Este es
el bucket que contiene los datos que los dispositivos descargan con las URL de Amazon S3
455
AWS IoT Guía del desarrollador
API de administración y control de trabajo
prefirmadas. Este rol debe también conceder el permiso de AWS IoT para asumir el rol. Para
obtener más información, consulte Creación de trabajos (p. 418).
expiresInSec
Tiempo (en segundos) durante el que las URL prefirmadas son válidas. Los valores válidos
son 60-3600. El valor predeterminado es 3600 segundos. Cuando el servicio Jobs de AWS
IoT recibe una solicitud de MQTT para el documento de trabajo, se generan URL prefirmadas.
targetSelection
El número máximo de objetos al que se enviará el trabajo para la ejecución (por minuto).
Los valores válidos son de 1 a 1000. Si no se especifica, el valor predeterminado es 1000.
El número real de objetos que recibe el objeto puede ser inferior durante cualquier intervalo
de minutos determinado (debido a la latencia del sistema), pero no es superior al valor
especificado.
exponentialRate
Los criterios para iniciar el aumento en la tasa de despliegue de un trabajo. Los valores
establecidos para numberOfNotifiedThings o numberOfSucceededThings, pero
no ambos.
numberOfNotifiedThings
El umbral del número de objetos con éxito que iniciará el aumento en la tasa de
despliegue.
abortConfig
456
AWS IoT Guía del desarrollador
API de administración y control de trabajo
failureType
El tipo de error de ejecución de trabajo para definir una regla para iniciar un trabajo de
anulación.
minNumberOfExecutedThings
El umbral como porcentaje del total de objetos ejecutados que inicia la anulación de un
trabajo.
timeoutConfig
Opcional. Especifica la cantidad de tiempo que cada dispositivo tiene para finalizar su ejecución
del trabajo. El temporizador se pone en marcha cuando el estado de ejecución del trabajo se
establece en IN_PROGRESS. Si el estado de ejecución del trabajo no se establece en otro estado
terminal antes de que se cumpla el plazo, se establecerá en TIMED_OUT.
inProgressTimeoutInMinutes
Especifica la cantidad de tiempo, en minutos, que tiene este dispositivo para finalizar la
ejecución de este trabajo. Un temporizador se inicia o reinicia, siempre que el estado de
ejecución del trabajo se especifica como IN_PROGRESS con este campo relleno. Si el
estado de ejecución del trabajo no se ha establecido en un estado terminal antes de que el
temporizador venza, o antes de que se envíe otra actualización de estado de ejecución del
trabajo con este campo rellenado, el estado se establece en TIMED_OUT.
Respuesta:
{
"jobArn": "string",
"jobId": "string",
"description": "string"
}
jobArn
CLI (4)
Sinopsis:
457
AWS IoT Guía del desarrollador
API de administración y control de trabajo
[--job-executions-rollout-config <value>] \
[--abort-config <value>] \
[--timeout-config <value>] \
[--document-parameters <value>] \
[--cli-input-json <value>] \
[--generate-cli-skeleton]
cli-input-json formato:
{
"jobId": "string",
"targets": [
"string"
],
"documentSource": "string",
"document": "string",
"description": "string",
"presignedUrlConfig": {
"roleArn": "string",
"expiresInSec": long
},
"targetSelection": "string",
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": integer,
"incrementFactor": integer,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": integer, // Set one or the other
"numberOfSucceededThings": integer // of these two values.
},
"maximumPerMinute": integer
}
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": integer,
"thresholdPercentage": integer
}
]
},
"timeoutConfig": {
"inProgressTimeoutInMinutes": long
},
"documentParameters": {
"string": "string"
}
}
Campos cli-input-json:
458
AWS IoT Guía del desarrollador
API de administración y control de trabajo
TargetArn string
Longitud máx.: 32768
Longitud máx.: 2028
patrón: [^\\p{C}]+
459
AWS IoT Guía del desarrollador
API de administración y control de trabajo
460
AWS IoT Guía del desarrollador
API de administración y control de trabajo
461
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Valor: ParameterValue
ParameterKey string
Patrón: [a-zA-Z0-9:_-]+
ParameterValue string
patrón: [^\\p{C}]+
Salida:
{
"jobArn": "string",
"jobId": "string",
"description": "string"
}
Patrón: [a-zA-Z0-9_-]+
462
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Longitud máx.: 2028
patrón: [^\\p{C}]+
DeleteJob
DeleteJob command
La eliminación de un trabajo puede tardar tiempo, en función del número de ejecuciones de trabajo
creadas para el trabajo y otros factores diversos. Aunque el trabajo se está eliminando, el estado del
trabajo se muestra como "DELETION_IN_PROGRESS". Si se intenta eliminar o cancelar un trabajo
cuyo estado ya es DELETION_IN_PROGRESS, se producirá un error.
HTTPS (5)
Sintaxis de la solicitud:
DELETE /jobs/jobId?force=force
La eliminación
de un trabajo
con estado
"IN_PROGRESS"
hace que un
dispositivo
que esté
ejecutando
463
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Errores:
InvalidRequestException
El contenido de la solicitud no es válido. Por ejemplo, se devuelve este código cuando una
solicitud UpdateJobExecution contiene detalles de estado no válido. El mensaje contiene detalles
acerca del error.
464
AWS IoT Guía del desarrollador
API de administración y control de trabajo
CLI (5)
Sinopsis:
cli-input-json formato:
{
"jobId": "string",
"force": boolean
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
La eliminación de un
trabajo con estado
IN_PROGRESS hace
que un dispositivo
que esté ejecutando
el trabajo no
pueda acceder a
la información del
trabajo o actualizar el
estado de ejecución
del trabajo. Actúe
con precaución y
asegúrese de que
cada dispositivo que
ejecute un trabajo que
se elimine sea capaz
de recuperarse a un
estado válido.
465
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Salida:
Ninguna
DeleteJobExecution
DeleteJobExecution command
Sintaxis de la solicitud:
DELETE /things/thingName/jobs/jobId/executionNumber/executionNumber?force=force
La eliminación
de la
ejecución de
un trabajo
466
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Errores:
InvalidRequestException
El contenido de la solicitud no es válido. Por ejemplo, se devuelve este código cuando una
solicitud UpdateJobExecution contiene detalles de estado no válido. El mensaje contiene detalles
acerca del error.
Una actualización intentó cambiar la ejecución de trabajo a un estado que no es válido debido al
estado actual de la ejecución de trabajo (por ejemplo, un intento de cambiar una solicitud con un
estado SUCCEEDED a un estado IN_PROGRESS). En este caso, el cuerpo del mensaje de error
también contiene el campo executionState.
467
AWS IoT Guía del desarrollador
API de administración y control de trabajo
CLI (6)
Sinopsis:
cli-input-json formato:
{
"jobId": "string",
"thingName": "string",
"executionNumber": long,
"force": boolean
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
Patrón: [a-zA-Z0-9:_-]+
La eliminación de
la ejecución de un
trabajo con estado
IN_PROGRESS hará
468
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Salida:
Ninguna
DescribeJob
DescribeJob command
Solicitud:
GET /jobs/jobId
jobId
Respuesta:
{
"documentSource": "string",
"job": Job
}
documentSource
CLI (7)
Sinopsis:
469
AWS IoT Guía del desarrollador
API de administración y control de trabajo
cli-input-json formato:
{
"jobId": "string"
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
Salida:
{
"documentSource": "string",
"job": {
"jobArn": "string",
"jobId": "string",
"targetSelection": "string",
"status": "string",
"forceCanceled": boolean,
"comment": "string",
"targets": [
"string"
],
"description": "string",
"presignedUrlConfig": {
"roleArn": "string",
"expiresInSec": long
},
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": integer,
"incrementFactor": integer,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": integer, // Set one or the other
"numberOfSucceededThings": integer // of these two values.
},
"maximumPerMinute": integer
}
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": integer,
"thresholdPercentage": integer
}
]
},
"createdAt": "timestamp",
"lastUpdatedAt": "timestamp",
"completedAt": "timestamp",
"jobProcessDetails": {
"processingTargets": [
"string"
470
AWS IoT Guía del desarrollador
API de administración y control de trabajo
],
"numberOfCanceledThings": "integer",
"numberOfSucceededThings": "integer",
"numberOfFailedThings": "integer",
"numberOfRejectedThings": "integer",
"numberOfQueuedThings": "integer",
"numberOfInProgressThings": "integer",
"numberOfRemovedThings": "integer",
"numberOfTimedOutThings": "integer"
},
"documentParameters": {
"string": "string"
},
"timeoutConfig": {
"inProgressTimeoutInMinutes": number
}
}
}
Patrón: [a-zA-Z0-9_-]+
471
AWS IoT Guía del desarrollador
API de administración y control de trabajo
patrón: [^\\p{C}]+
TargetArn string
Longitud máx.: 2028
patrón: [^\\p{C}]+
472
AWS IoT Guía del desarrollador
API de administración y control de trabajo
473
AWS IoT Guía del desarrollador
API de administración y control de trabajo
ProcessingTargetName string
474
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Valor: ParameterValue
ParameterKey string
Patrón: [a-zA-Z0-9:_-]+
ParameterValue string
patrón: [^\\p{C}]+
475
AWS IoT Guía del desarrollador
API de administración y control de trabajo
DescribeJobExecution
DescribeJobExecution command
Obtiene los detalles de una ejecución de trabajo. El estado de la ejecución del trabajo debe ser
SUCCEEDED o FAILED.
HTTPS (8)
Solicitud:
GET /things/thingName/jobs/jobId?executionNumber=executionNumber
jobId
Respuesta:
{
"execution": { JobExecution }
}
476
AWS IoT Guía del desarrollador
API de administración y control de trabajo
execution
CLI (8)
Sinopsis:
cli-input-json formato:
{
"jobId": "string",
"thingName": "string",
"executionNumber": long
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
Patrón: [a-zA-Z0-9:_-]+
Salida:
{
"execution": {
"approximateSecondsBeforeTimedOut": "number"
"jobId": "string",
"status": "string",
"forceCanceled": boolean,
"statusDetails": {
"detailsMap": {
"string": "string"
}
},
"thingArn": "string",
477
AWS IoT Guía del desarrollador
API de administración y control de trabajo
"queuedAt": "timestamp",
"startedAt": "timestamp",
"lastUpdatedAt": "timestamp",
"executionNumber": long,
"versionNumber": long
}
}
approximateSecondsBeforeTimedOut
long El número estimado de
segundos restantes antes de
que el estado de ejecución del
trabajo cambie a TIMED_OUT.
El intervalo de tiempo de
espera puede estar en
cualquier momento entre 1
minuto y 7 días (1 a 10 080
minutos). El tiempo de espera
de ejecución de trabajo real
puede producirse hasta un
máximo de 60 segundos más
tarde que la duración estimada.
Este valor no se incluye si
la ejecución del trabajo ha
alcanzado un estado terminal.
Patrón: [a-zA-Z0-9_-]+
Valor: DetailsValue
478
AWS IoT Guía del desarrollador
API de administración y control de trabajo
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
patrón: [^\\p{C}]*+
GetJobDocument
GetJobDocument command
Las URL de marcador de posición no se reemplazan por las URL de Amazon S3 prefirmadas
en el documento devuelto. Las URL prefirmadas se generan solo cuando el servicio Jobs de
AWS IoT recibe una solicitud a través de MQTT.
479
AWS IoT Guía del desarrollador
API de administración y control de trabajo
HTTPS (9)
Solicitud:
GET /jobs/jobId/job-document
jobId
Respuesta:
{
"document": "string"
}
document
CLI (9)
Sinopsis:
cli-input-json formato:
{
"jobId": "string"
}
Campos cli-input-json:
Patrón: [a-zA-Z0-9_-]+
Salida:
{
"document": "string"
}
480
AWS IoT Guía del desarrollador
API de administración y control de trabajo
ListJobExecutionsForJob
ListExecutionsForJob command
Solicitud:
GET /jobs/jobId/things?status=status&maxResults=maxResults&nextToken=nextToken
jobId
Opcional. Un filtro que le permite buscar trabajos que tienen el estado especificado: QUEUED,
IN_PROGRESS, SUCCEEDED, FAILED, TIMED_OUT, REJECTED, REMOVED o CANCELED.
maxResults
Respuesta:
{
"executionSummaries": [ JobExecutionSummary ... ]
}
executionSummaries
CLI (10)
Sinopsis:
cli-input-json formato:
481
AWS IoT Guía del desarrollador
API de administración y control de trabajo
{
"jobId": "string",
"status": "string",
"maxResults": "integer",
"nextToken": "string"
}
Campos cli-input-json:
Nombre Tipo Descripción
Patrón: [a-zA-Z0-9_-]+
enum: QUEUED |
IN_PROGRESS | SUCCEEDED
| FAILED | TIMED_OUT |
REJECTED | REMOVED |
CANCELED
Salida:
{
"executionSummaries": [
{
"thingArn": "string",
"jobExecutionSummary": {
"status": "string",
"queuedAt": "timestamp",
"startedAt": "timestamp",
"lastUpdatedAt": "timestamp",
"executionNumber": long
}
}
],
"nextToken": "string"
}
482
AWS IoT Guía del desarrollador
API de administración y control de trabajo
JobExecutionSummaryForJob JobExecutionSummaryForJob
ListJobExecutionsForThing
ListJobExecutionsForThing command
Solicitud:
483
AWS IoT Guía del desarrollador
API de administración y control de trabajo
GET /things/thingName/jobs?status=status&maxResults=maxResults&nextToken=nextToken
thingName
Un filtro opcional que le permite buscar trabajos que tienen el estado especificado: QUEUED,
IN_PROGRESS, SUCCEEDED, FAILED, TIMED_OUT, REJECTED, REMOVED o CANCELED.
maxResults
Respuesta:
{
"executionSummaries": [ JobExecutionSummary ... ]
}
executionSummaries
Una lista de los objetos JobExecutionSummary (p. 444) para las ejecuciones de trabajo
asociadas al objeto especificado.
CLI (11)
Sinopsis:
cli-input-json formato:
{
"thingName": "string",
"status": "string",
"maxResults": "integer",
"nextToken": "string"
}
Campos cli-input-json:
Nombre Tipo Descripción
Patrón: [a-zA-Z0-9:_-]+
484
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Salida:
{
"executionSummaries": [
{
"jobId": "string",
"jobExecutionSummary": {
"status": "string",
"queuedAt": "timestamp",
"startedAt": "timestamp",
"lastUpdatedAt": "timestamp",
"executionNumber": long
}
}
],
"nextToken": "string"
}
JobExecutionSummaryForThing JobExecutionSummaryForThing
Patrón: [a-zA-Z0-9_-]+
485
AWS IoT Guía del desarrollador
API de administración y control de trabajo
ListJobs
ListJobs command
Solicitud:
GET /jobs?
status=status&targetSelection=targetSelection&thingGroupName=thingGroupName&thingGroupId=thingGroup
status
Opcional. Un filtro que le permite buscar trabajos que tienen el estado especificado:
IN_PROGRESS, CANCELED o SUCCEEDED.
targetSelection
Opcional. Un filtro que le permite buscar trabajos que tienen el valor targetSelection
especificado: CONTINUOUS o SNAPSHOT.
486
AWS IoT Guía del desarrollador
API de administración y control de trabajo
thingGroupName
Opcional. Un filtro que le permite buscar trabajos que tienen el nombre de grupo de objetos
especificado como un destino.
thingGroupId
Opcional. Un filtro que le permite buscar trabajos que tienen el ID de grupo de objetos
especificado como un destino.
maxResults
Respuesta:
{
"jobs": [ JobSummary ... ],
}
jobs
Una lista de objetos JobSummary (p. 442), uno para cada trabajo de la cuenta de AWS que
coincide con los criterios de filtrado especificados.
CLI (12)
Sinopsis:
cli-input-json formato:
{
"status": "string",
"targetSelection": "string",
"maxResults": "integer",
"nextToken": "string",
"thingGroupName": "string",
"thingGroupId": "string"
}
Campos cli-input-json:
487
AWS IoT Guía del desarrollador
API de administración y control de trabajo
Patrón: [a-zA-Z0-9:_-]+
Patrón: [a-zA-Z0-9-]+
Salida:
{
"jobs": [
{
"jobArn": "string",
"jobId": "string",
"thingGroupId": "string",
"targetSelection": "string",
"status": "string",
"createdAt": "timestamp",
"lastUpdatedAt": "timestamp",
"completedAt": "timestamp"
}
],
488
AWS IoT Guía del desarrollador
API de administración y control de trabajo
"nextToken": "string"
}
Miembro: JobSummary
JobSummary JobSummary
Patrón: [a-zA-Z0-9_-]+
Patrón: [a-zA-Z0-9-]+
489
AWS IoT Guía del desarrollador
API de administración y control de trabajo
UpdateJob
UpdateJob command
Actualiza los campos admitidos del trabajo especificado. Los valores actualizados de
timeoutConfig surten efecto solo en ejecuciones recientemente en curso. Las ejecuciones en curso
en ese momento siguen haciéndolo con la antigua configuración de tiempo de espera.
HTTPS (13)
Solicitud:
PATCH /jobs/jobId
{
"description": "string",
"presignedUrlConfig": {
"expiresInSec": number,
"roleArn": "string"
},
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": number,
"incrementFactor": number,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": number,
"numberOfSucceededThings": number
},
"maximumPerMinute": number
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": number,
"thresholdPercentage": number
}
]
},
"timeoutConfig": {
"inProgressTimeoutInMinutes": number
}
}
jobId
Un identificador de trabajo que debe ser exclusivo para su cuenta de AWS. Recomendamos
utilizar un UUID. Aquí pueden utilizarse caracteres alfanuméricos, "-" y "_".
490
AWS IoT Guía del desarrollador
API de administración y control de trabajo
description
El ARN del rol de IAM que contiene permisos para acceder al bucket de Amazon S3. Este es
el bucket que contiene los datos que los dispositivos descargan con las URL de Amazon S3
prefirmadas. Este rol debe también conceder el permiso de AWS IoT para asumir el rol. Para
obtener más información, consulte Creación de trabajos (p. 418).
expiresInSec
Tiempo (en segundos) durante el que las URL prefirmadas son válidas. Los valores válidos
son 60-3600. El valor predeterminado es 3600 segundos. Cuando el servicio Jobs de AWS
IoT recibe una solicitud de MQTT para el documento de trabajo, se generan URL prefirmadas.
jobExecutionRolloutConfig
El número máximo de objetos al que se enviará el trabajo para la ejecución (por minuto). Los
valores válidos son de 1 a 1000. Si no se especifica, el valor predeterminado es 1000. El
número real de objetos que recibe el trabajo puede ser inferior durante cualquier intervalo de
minutos determinado (por la latencia del sistema), pero no es superior al valor especificado.
exponentialRate
El número mínimo de objetos a los que se notificará un trabajo pendiente, por minuto,
al empezar a desplegarse un trabajo. Este parámetro le permite definir la tasa inicial del
despliegue.
incrementFactor
Los criterios para iniciar el aumento en la tasa de despliegue de un trabajo. Los valores
establecidos para numberOfNotifiedThings o numberOfSucceededThings, pero
no ambos.
numberOfNotifiedThings
El umbral del número de objetos con éxito que iniciará el aumento en la tasa de
despliegue.
abortConfig
491
AWS IoT Guía del desarrollador
API de administración y control de trabajo
action
El tipo de error de ejecución de trabajo para definir una regla para iniciar un trabajo de
anulación.
minNumberOfExecutedThings
El umbral como porcentaje del total de objetos ejecutados que inicia la anulación de un
trabajo.
timeoutConfig
Opcional. Especifica la cantidad de tiempo que cada dispositivo tiene para finalizar su ejecución
del trabajo. El temporizador se pone en marcha cuando el estado de ejecución del trabajo se
establece en IN_PROGRESS. Si el estado de ejecución del trabajo no se establece en otro estado
terminal antes de que se cumpla el plazo, se establecerá en TIMED_OUT.
inProgressTimeoutInMinutes
Especifica la cantidad de tiempo, en minutos, que tiene este dispositivo para finalizar la
ejecución de este trabajo. Un temporizador se inicia o reinicia, siempre que el estado de
ejecución del trabajo se especifica como IN_PROGRESS con este campo relleno. Si el
estado de ejecución del trabajo no se ha establecido en un estado terminal antes de que el
temporizador venza, o antes de que se envíe otra actualización de estado de ejecución del
trabajo con este campo rellenado, el estado se establece en TIMED_OUT.
Respuesta:
HTTP/1.1 200
Si la acción se realiza correctamente, el servicio devuelve una respuesta HTTP 200 con un cuerpo
HTTP vacío.
CLI (13)
Sinopsis:
cli-input-json formato:
{
"description": "string",
"presignedUrlConfig": {
"expiresInSec": number,
"roleArn": "string"
},
"jobExecutionsRolloutConfig": {
492
AWS IoT Guía del desarrollador
API de administración y control de trabajo
"exponentialRate": {
"baseRatePerMinute": number,
"incrementFactor": number,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": number,
"numberOfSucceededThings": number
}
},
"maximumPerMinute": number
},
"abortConfig": {
"criteriaList": [
{
"action": "string",
"failureType": "string",
"minNumberOfExecutedThings": number,
"thresholdPercentage": number
}
]
},
"timeoutConfig": {
"inProgressTimeoutInMinutes": number
}
}
Campos cli-input-json:
Longitud máx.: 2028
patrón: [^\\p{C}]+
493
AWS IoT Guía del desarrollador
API de administración y control de trabajo
494
AWS IoT Guía del desarrollador
API de administración y control de trabajo
495
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Valor: ParameterValue
ParameterKey string
Patrón: [a-zA-Z0-9:_-]+
ParameterValue string
patrón: [^\\p{C}]+
Salida:
HTTP/1.1 200
Si la acción se realiza correctamente, el servicio devuelve una respuesta HTTP 200 con un cuerpo
HTTP vacío.
JobExecution
JobExecution data type
{
"jobId" : "string",
"thingName" : "string",
"jobDocument" : "string",
"status": "QUEUED|IN_PROGRESS|FAILED|SUCCEEDED|CANCELED|TIMED_OUT|REJECTED|
REMOVED",
"statusDetails": {
"string": "string"
},
"queuedAt" : "timestamp",
"startedAt" : "timestamp",
"lastUpdatedAt" : "timestamp",
"versionNumber" : "number",
"executionNumber": long
}
496
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Description (7)
jobId
El tiempo, en segundos, desde la fecha de inicio, cuando se puso en cola la ejecución de trabajo.
startedAt
El tiempo, en segundos, desde la fecha de inicio, cuando se actualizó la ejecución de trabajo por
última vez.
versionNumber
La versión de la ejecución de trabajos. Las versiones de ejecución de trabajo aumentan cada vez
que un dispositivo las actualiza.
executionNumber
JobExecutionState
JobExecutionState data type
{
"status": "QUEUED|IN_PROGRESS|FAILED|SUCCEEDED|CANCELED|TIMED_OUT|REJECTED|
REMOVED",
"statusDetails": {
"string": "string"
...
}
"versionNumber": "number"
}
497
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Description (8)
status
La versión de la ejecución de trabajos. Las versiones de ejecución de trabajo aumentan cada vez
que un dispositivo las actualiza.
JobExecutionSummary
JobExecutionSummary data type
{
"jobId": "string",
"queuedAt": timestamp,
"startedAt": timestamp,
"lastUpdatedAt": timestamp,
"versionNumber": "number",
"executionNumber": long
}
Description (9)
jobId
El tiempo, en segundos, desde la fecha de inicio, cuando se puso en cola la ejecución de trabajo.
startedAt
El tiempo, en segundos, desde la fecha de inicio, cuando se actualizó la ejecución de trabajo por
última vez.
versionNumber
498
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
ErrorResponse
ErrorResponse data type
Contiene información acerca de un error que se produjo durante una operación del servicio Jobs de
AWS IoT.
Syntax (10)
{
"code": "ErrorCode",
"message": "string",
"clientToken": "string",
"timestamp": timestamp,
"executionState": JobExecutionState
}
Description (10)
code
La solicitud se envió a un tema en el espacio de nombres de Jobs de AWS IoT que no está
asignado a ninguna API.
InvalidJson
El contenido de la solicitud no es válido. Por ejemplo, se devuelve este código cuando una
solicitud UpdateJobExecution contiene detalles de estado no válido. El mensaje contiene
detalles acerca del error.
InvalidStateTransition
Una actualización intentó cambiar la ejecución de trabajo a un estado que no es válido debido
al estado actual de la ejecución de trabajo (por ejemplo, un intento de cambiar una solicitud
con un estado SUCCEEDED a un estado IN_PROGRESS). En este caso, el cuerpo del
mensaje de error también contiene el campo executionState.
ResourceNotFound
La solicitud se ha limitado.
TerminalStateReached
Se produce cuando un comando para describir un trabajo se realiza en un trabajo que está en
un estado terminal.
499
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
message
Una cadena arbitraria utilizada para correlacionar una solicitud con su respuesta.
timestamp
Un objeto JobExecutionState (p. 497). Este campo se incluye solo cuando el campo code tiene
el valor InvalidStateTransition o VersionMismatch. Esto hace que no sea necesario en
esos casos realizar una solicitud DescribeJobExecution independiente para obtener los datos
de estado de ejecución de trabajo actuales.
Comandos de dispositivos
Los siguientes comandos están disponibles a través de los protocolos MQTT y HTTPS.
GetPendingJobExecutions
GetPendingJobExecutions command
Obtiene la lista de todos los trabajos para un objeto que no está en un estado terminal.
MQTT (12)
Carga de solicitud:
{ "clientToken": "string" }
clientToken
• $aws/things/thingName/jobs/get/accepted y
• $aws/things/thingName/jobs/get/rejected o
• $aws/things/thingName/jobs/get/# para ambos.
Carga de respuesta:
{
"inProgressJobs" : [ JobExecutionSummary ... ],
"queuedJobs" : [ JobExecutionSummary ... ],
"timestamp" : 1489096425069,
"clientToken" : "client-001"
}
inProgressJobs
500
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
queuedJobs
HTTPS (12)
Solicitud:
GET /things/thingName/jobs
thingName
Respuesta:
{
"inProgressJobs" : [ JobExecutionSummary ... ],
"queuedJobs" : [ JobExecutionSummary ... ]
}
inProgressJobs
CLI (12)
Sinopsis:
cli-input-json formato:
{
"thingName": "string"
}
Campos cli-input-json:
501
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Salida:
{
"inProgressJobs": [
{
"jobId": "string",
"queuedAt": long,
"startedAt": long,
"lastUpdatedAt": long,
"versionNumber": long,
"executionNumber": long
}
],
"queuedJobs": [
{
"jobId": "string",
"queuedAt": long,
"startedAt": long,
"lastUpdatedAt": long,
"versionNumber": long,
"executionNumber": long
}
]
}
JobExecutionSummary JobExecutionSummary
Patrón: [a-zA-Z0-9_-]+
502
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
JobExecutionSummary JobExecutionSummary
Patrón: [a-zA-Z0-9_-]+
503
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
StartNextPendingJobExecution
StartNextPendingJobExecution command
Obtiene e inicia la siguiente ejecución de trabajo pendiente para un objeto (estado IN_PROGRESS o
QUEUED).
MQTT (13)
Carga de solicitud:
{
"statusDetails": {
"string": "job-execution-state"
...
},
"stepTimeoutInMinutes": long,
"clientToken": "string"
}
statusDetails
Especifica la cantidad de tiempo que tiene este dispositivo para finalizar la ejecución de este
trabajo. Si el estado de ejecución del trabajo no se ha establecido en un estado terminal antes
de que este temporizador venza o antes de que se restablezca el temporizador (llamando a
UpdateJobExecution, estableciendo el estado en IN_PROGRESS y especificando un valor
de tiempo de espera nuevo en el campo stepTimeoutInMinutes) el estado de ejecución se
establece automáticamente en TIMED_OUT. Configurar este tiempo de espera no tiene ningún
efecto en el tiempo de espera de la ejecución de ese trabajo que se pueda haber especificado
cuando se creó el trabajo (CreateJob con el campo timeoutConfig).
clientToken
• $aws/things/thingName/jobs/start-next/accepted y
504
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
• $aws/things/thingName/jobs/start-next/rejected o
• $aws/things/thingName/jobs/start-next/# para ambos.
Carga de respuesta:
{
"execution" : JobExecutionData,
"timestamp" : timestamp,
"clientToken" : "string"
}
execution
{
"execution" : {
"jobId" : "022",
"thingName" : "MyThing",
"jobDocument" : "< contents of job document >",
"status" : "IN_PROGRESS",
"queuedAt" : 1489096123309,
"lastUpdatedAt" : 1489096123309,
"versionNumber" : 1,
"executionNumber" : 1234567890
},
"clientToken" : "client-1",
"timestamp" : 1489088524284,
}
timestamp
HTTPS (13)
Solicitud:
PUT /things/thingName/jobs/$next
{
"statusDetails": {
"string": "string"
...
},
"stepTimeoutInMinutes": long
}
thingName
505
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
stepTimeOutInMinutes
Especifica la cantidad de tiempo que tiene este dispositivo para finalizar la ejecución de este
trabajo. Si el estado de ejecución del trabajo no se ha establecido en un estado terminal antes
de que este temporizador venza o antes de que se restablezca el temporizador (llamando a
UpdateJobExecution, estableciendo el estado en IN_PROGRESS y especificando un valor
de tiempo de espera nuevo en el campo stepTimeoutInMinutes) el estado de ejecución se
establece automáticamente en TIMED_OUT. Configurar este tiempo de espera no tiene ningún
efecto en el tiempo de espera de la ejecución de ese trabajo que se pueda haber especificado
cuando se creó el trabajo (CreateJob con el campo timeoutConfig).
Respuesta:
{
"execution" : JobExecution
}
execution
{
"execution" : {
"jobId" : "022",
"thingName" : "MyThing",
"jobDocument" : "< contents of job document >",
"status" : "IN_PROGRESS",
"queuedAt" : 1489096123309,
"lastUpdatedAt" : 1489096123309,
"versionNumber" : 1,
"executionNumber" : 1234567890
},
"clientToken" : "client-1",
"timestamp" : 1489088524284,
}
CLI (13)
Sinopsis:
cli-input-json formato:
{
"thingName": "string",
"statusDetails": {
"string": "string"
},
"stepTimeoutInMinutes": long
}
506
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Campos cli-input-json:
Patrón: [a-zA-Z0-9:_-]+
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
patrón: [^\\p{C}]*+
Salida:
507
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
"execution": {
"jobId": "string",
"thingName": "string",
"status": "string",
"statusDetails": {
"string": "string"
},
"queuedAt": long,
"startedAt": long,
"lastUpdatedAt": long,
"versionNumber": long,
"executionNumber": long,
"jobDocument": "string"
}
}
Patrón: [a-zA-Z0-9_-]+
Patrón: [a-zA-Z0-9:_-]+
Valor: DetailsValue
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
patrón: [^\\p{C}]*+
508
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
DescribeJobExecution
DescribeJobExecution command
Puede establecer jobId en $next para devolver la siguiente ejecución de trabajo pendiente para un
objeto (estado IN_PROGRESS o QUEUED).
MQTT (14)
Carga de solicitud:
{
"executionNumber": long,
"includeJobDocument": boolean,
"clientToken": "string"
}
thingName
509
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
También puede usar $next para devolver la siguiente ejecución de trabajo pendiente para un
objeto (estado IN_PROGRESS o QUEUED). En este caso, las ejecuciones de trabajo con el
estado IN_PROGRESS se devuelven en primer lugar. Las ejecuciones de trabajo se devuelven en
el orden en el que se crearon.
executionNumber
• $aws/things/thingName/jobs/jobId/get/accepted y
• $aws/things/thingName/jobs/jobId/get/rejected o
• $aws/things/thingName/jobs/jobId/get/# para ambos.
Carga de respuesta:
{
"execution" : JobExecutionData,
"timestamp": "timestamp",
"clientToken": "string"
}
execution
HTTPS (14)
Solicitud:
GET /things/thingName/jobs/jobId?
executionNumber=executionNumber&includeJobDocument=includeJobDocument
thingName
510
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
También puede usar $next para devolver la siguiente ejecución de trabajo pendiente para un
objeto (estado IN_PROGRESS o QUEUED). En este caso, las ejecuciones de trabajo con el
estado IN_PROGRESS se devuelven en primer lugar. Las ejecuciones de trabajo se devuelven en
el orden en el que se crearon.
includeJobDocument
Respuesta:
{
"execution" : JobExecution,
}
execution
CLI (14)
Sinopsis:
cli-input-json formato:
{
"jobId": "string",
"thingName": "string",
"includeJobDocument": boolean,
"executionNumber": long
}
Campos cli-input-json:
511
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Salida:
{
"execution": {
"jobId": "string",
"thingName": "string",
"status": "string",
"statusDetails": {
"string": "string"
},
"queuedAt": long,
"startedAt": long,
"lastUpdatedAt": long,
"versionNumber": long,
"executionNumber": long,
"jobDocument": "string"
}
}
Patrón: [a-zA-Z0-9_-]+
512
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Patrón: [a-zA-Z0-9:_-]+
Valor: DetailsValue
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
patrón: [^\\p{C}]*+
513
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
UpdateJobExecution
UpdateJobExecution command
Actualiza el estado de una ejecución de trabajo. Si lo prefiere, puede crear un temporizador de pasos
estableciendo un valor para la propiedad stepTimeoutInMinutes. Si no actualiza el valor de esta
propiedad ejecutando UpdateJobExecution otra vez, la ejecución del trabajo agotará el tiempo de
espera cuando venza el temporizador de pasos.
MQTT (15)
Carga de solicitud:
{
"status": "job-execution-state",
"statusDetails": {
"string": "string"
...
},
"expectedVersion": "number",
"executionNumber": long,
"includeJobExecutionState": boolean,
"includeJobDocument": boolean,
"stepTimeoutInMinutes": long,
"clientToken": "string"
}
status
La versión actual esperada de la ejecución de trabajos. Cada vez que actualiza la ejecución de
trabajos, aumenta su versión. Si la versión de la ejecución del trabajo almacenada en el servicio
Jobs de AWS IoT no coincide, la actualización se rechaza con un error VersionMismatch y se
devuelve un código ErrorResponse (p. 499) con los datos de estado de la ejecución del trabajo
actual. (Esto hace que no sea necesario realizar una solicitud DescribeJobExecution aparte
para obtener los datos de estado de ejecución del trabajo).
514
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
executionNumber
Especifica la cantidad de tiempo que tiene este dispositivo para finalizar la ejecución de este
trabajo. Si el estado de ejecución del trabajo no se ha establecido en un estado terminal antes de
que este temporizador venza o antes de que se restablezca el temporizador (llamando otra vez
a UpdateJobExecution, estableciendo el estado en IN_PROGRESS y especificando un valor
de tiempo de espera nuevo en este campo), el estado de ejecución del trabajo se establece en
TIMED_OUT. Configurar o restablecer este tiempo de espera no tiene ningún efecto en el tiempo
de espera de la ejecución del trabajo que se pueda haber especificado cuando se creó el trabajo
(utilizando CreateJob con el campo timeoutConfig).
clientToken
• $aws/things/thingName/jobs/jobId/update/accepted y
• $aws/things/thingName/jobs/jobId/update/rejected o
• $aws/things/thingName/jobs/jobId/update/# para ambos.
Carga de respuesta:
{
"executionState": JobExecutionState,
"jobDocument": "string",
"timestamp": timestamp,
"clientToken": "string"
}
executionState
515
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
HTTPS (15)
Solicitud:
POST /things/thingName/jobs/jobId
{
"status": "job-execution-state",
"statusDetails": {
"string": "string"
...
},
"expectedVersion": "number",
"includeJobExecutionState": boolean,
"includeJobDocument": boolean,
"stepTimeoutInMinutes": long,
"executionNumber": long
}
thingName
Opcional. Un conjunto de pares nombre-valor que describen el estado de ejecución del trabajo. Si
no se especifica, statusDetails no se modifica.
expectedVersion
Opcional. La versión actual esperada de la ejecución de trabajos. Cada vez que actualiza
la ejecución de trabajos, aumenta su versión. Si la versión de la ejecución del trabajo
almacenada en el servicio Jobs de AWS IoT no coincide, la actualización se rechaza con un
error VersionMismatch y se devuelve un código ErrorResponse (p. 499) con los datos de
estado de la ejecución del trabajo actual. (Esto hace que no sea necesario realizar una solicitud
DescribeJobExecution aparte para obtener los datos de estado de ejecución del trabajo).
includeJobExecutionState
Especifica la cantidad de tiempo que tiene este dispositivo para finalizar la ejecución de este
trabajo. Si el estado de ejecución del trabajo no se ha establecido en un estado terminal antes de
que este temporizador venza o antes de que se restablezca el temporizador (llamando otra vez
a UpdateJobExecution, estableciendo el estado en IN_PROGRESS y especificando un valor
de tiempo de espera nuevo en este campo), el estado de ejecución del trabajo se establece en
TIMED_OUT. Configurar o restablecer este tiempo de espera no tiene ningún efecto en el tiempo
de espera de la ejecución del trabajo que se pueda haber especificado cuando se creó el trabajo
(utilizando CreateJob con el campo timeoutConfig).
516
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
executionNumber
Respuesta:
{
"executionState": JobExecutionState,
"jobDocument": "string"
}
executionState
CLI (15)
Sinopsis:
cli-input-json formato:
{
"jobId": "string",
"thingName": "string",
"status": "string",
"statusDetails": {
"string": "string"
},
"stepTimeoutInMinutes": number,
"expectedVersion": long,
"includeJobExecutionState": boolean,
"includeJobDocument": boolean,
"executionNumber": long
}
Campos cli-input-json:
517
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Patrón: [a-zA-Z0-9:_-]+
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
patrón: [^\\p{C}]*+
518
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
stepTimeoutInMinutes
long
Especifica la cantidad
de tiempo que tiene este
dispositivo para finalizar la
ejecución de este trabajo. Si el
estado de ejecución del trabajo
no se ha establecido en un
estado terminal antes de que
este temporizador venza o
antes de que se restablezca
el temporizador (llamando otra
vez a UpdateJobExecution,
estableciendo el estado en
IN_PROGRESS y especificando
un valor de tiempo de espera
nuevo en este campo), el
estado de ejecución del trabajo
se establece en TIMED_OUT.
Configurar o restablecer este
tiempo de espera no tiene
ningún efecto en el tiempo
de espera de la ejecución
del trabajo que se pueda
haber especificado cuando
se creó el trabajo (utilizando
CreateJob con el campo
timeoutConfig).
519
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
Salida:
{
"executionState": {
"status": "string",
"statusDetails": {
"string": "string"
},
"versionNumber": long
},
"jobDocument": "string"
}
Valor: DetailsValue
DetailsKey string
Patrón: [a-zA-Z0-9:_-]+
DetailsValue string
520
AWS IoT Guía del desarrollador
API de MQTT y HTTPS de dispositivo de trabajo
JobExecutionsChanged
JobExecutionsChanged message
Se envía cuando se añade una ejecución de trabajo a la lista de ejecuciones de trabajo pendientes
para un objeto, o cuando se quita de dicha lista.
MQTT (16)
Tema: $aws/things/thingName/jobs/notify
Carga de mensaje:
{
"jobs" : {
"JobExecutionState": [ JobExecutionSummary (p. 444) ... ]
},
"timestamp": timestamp,
}
HTTPS (16)
No disponible.
CLI (16)
No disponible.
NextJobExecutionChanged
NextJobExecutionChanged message
Tema: $aws/things/thingName/jobs/notify-next
Carga de mensaje:
521
AWS IoT Guía del desarrollador
Despliegue de trabajos y configuración de anulaciones
{
"execution" : JobExecution (p. 443),
"timestamp": timestamp,
}
HTTPS (17)
No disponible.
CLI (17)
No disponible.
{
...
"jobExecutionsRolloutConfig": {
"exponentialRate": {
"baseRatePerMinute": 50,
"incrementFactor": 2,
"rateIncreaseCriteria": {
"numberOfNotifiedThings": 1000, // Set one or the other
"numberOfSucceededThings": 1000 // of these two values.
},
"maximumPerMinute": 1000
...
}
El parámetro baseRatePerMinute especifica la tasa según la cual se ejecutan los trabajos hasta llegar al
umbral numberOfNotifiedThings o numberOfSucceededThings.
522
AWS IoT Guía del desarrollador
Uso de configuraciones de anulaciones
de despliegues de trabajos
El parámetro maximumPerMinute especifica el límite superior de la tasa según la cual pueden producirse
las ejecuciones de los trabajos. Los valores válidos están comprendidos entre 1 y 1000. Este parámetro es
necesario al transferir un objeto ExponentialRate. En un despliegue según una tasa variable, este valor
establece el límite superior de la tasa de despliegue de trabajos.
Un despliegue de trabajos con la configuración anterior se iniciaría según una tasa de 50 ejecuciones de
trabajos por minuto. Continuaría según esa tasa hasta que bien 1000 objetos hayan recibido notificaciones
de ejecución de trabajos (si se ha especificado un valor para numberOfNotifiedThings) o se
hayan producido correctamente 1000 ejecuciones de trabajos (si se ha especificado un valor para
numberOfSucceededThings).
En la siguiente tabla se muestra cómo se produciría el despliegue durante los primeros cuatro incrementos.
{
...
"jobExecutionsRolloutConfig": {
"maximumPerMinute": 1000
...
}
El parámetro maximumPerMinute especifica el límite superior de la tasa según la cual pueden producirse
las ejecuciones de los trabajos. Los valores válidos están comprendidos entre 1 y 1000. Este parámetro es
opcional. Si no especifica un valor, se utiliza el valor predeterminado de 1000.
"abortConfig": {
"criteriaList": [
{
"action": "CANCEL",
"failureType": "FAILED",
"minNumberOfExecutedThings": 100,
"thresholdPercentage": 20
},
{
"action": "CANCEL",
523
AWS IoT Guía del desarrollador
Límites de los trabajos
"failureType": "TIMED_OUT",
"minNumberOfExecutedThings": 200,
"thresholdPercentage": 50
}
]
}
El parámetro action especifica la acción que se debe realizar cuando se han cumplido los criterios de
anulación. Este parámetro es necesario, y CANCEL es el único valor válido.
El parámetro failureType especifica qué tipos de error deben activar la anulación de un trabajo. Los
valores válidos son FAILED, REJECTED, TIMED_OUT y ALL.
Suprimir ejecuciones de trabajos afecta al valor de cálculo del total de ejecuciones realizadas.
Cuando se anula un trabajo, el servicio crea valores comment y reasonCode automáticos para
diferenciar una cancelación promovida por un usuario de una de anulación de un trabajo.
524
AWS IoT Guía del desarrollador
Conceptos de tunelización segura
Por ejemplo, un sensor instalado en una fábrica que está a varios kilómetros de distancia está teniendo
problemas para medir la temperatura de la fábrica. Puede utilizar la tunelización segura para abrir e iniciar
rápidamente una sesión en ese sensor. Después de identificar el problema (por ejemplo, un archivo de
configuración incorrecto), puede restablecer el archivo y reiniciar el sensor a través de la misma sesión.
En comparación con una solución de problemas más tradicional (por ejemplo, enviar a un técnico a la
fábrica para que revise el sensor), la tunelización segura reduce la respuesta a incidentes y el tiempo de
recuperación, así como los costos de explotación.
Un par de tokens generados por la tunelización segura cuando se crea un nuevo túnel. Los
dispositivos de origen y destino utilizan el CAT para conectarse al servicio Tunelización segura.
Aplicación de destino
La aplicación que se ejecuta en el dispositivo de destino. Por ejemplo, la aplicación de destino puede
ser un daemon SSH para establecer una sesión SSH mediante tunelización segura.
Dispositivo de destino
Una aplicación de IoT que se conecta al gateway de dispositivos de AWS IoT y está a la escucha de
nuevas notificaciones de túnel a través de MQTT.
Proxy local
Proxy de software que se ejecuta en los dispositivos de origen y destino y retransmite una secuencia
de datos entre el servicio Tunelización segura y la aplicación del dispositivo. El proxy local se puede
ejecutar en modo de origen o modo de destino. Para obtener más información, consulte Proxy
local (p. 531).
Dispositivo de origen
El dispositivo que un operador utiliza para iniciar una sesión en el dispositivo de destino, normalmente
un equipo portátil o de sobremesa.
Túnel
Una ruta lógica a través de AWS IoT que permite la comunicación bidireccional entre un dispositivo de
origen y un dispositivo de destino.
525
AWS IoT Guía del desarrollador
Tutorial de tunelización segura
Requisitos previos
• Los firewalls detrás del dispositivo remoto deben permitir el tráfico saliente en el puerto 443.
• Ha creado una objeto de IoT denominado RemoteDeviceA en el registro de AWS IoT.
• Tiene un agente de dispositivo de IoT ejecutándose en el dispositivo remoto que se conecta al gateway
de dispositivos de AWS IoT y está configurado con una suscripción a un tema de MQTT. Este tutorial
incluye un fragmento que muestra cómo implementar un agente. Para obtener más información, consulte
Fragmento de agente de IoT (p. 532).
• Debe tener un daemon SSH ejecutándose en el dispositivo remoto.
• Ha descargado el código fuente del proxy local de GitHub y lo ha compilado para la plataforma de su
elección. Nos referiremos al archivo ejecutable del proxy local compilado como localproxy en este
tutorial.
Abrir un túnel
1. Abra la consola de AWS IoT. En el panel de navegación, elija Manage (Administrar) y, a continuación,
Tunnels (Túneles).
2. Elija Open a tunnel (Abrir un túnel).
3. En la página Open a new tunnel (Abrir un nuevo túnel), incluya una descripción del túnel si lo desea.
4. En Choose a thing to open a tunnel for (Elegir un objeto para el que abrir un túnel), elija
RemoteDeviceA.
5. En Service (Servicio), escriba SSH y después elija Open New (Abrir nuevo). Para obtener más
información, consulte Fragmento de agente de IoT (p. 532).
6. En la página New tunnel opened (Nuevo túnel abierto), descargue los tokens de acceso de origen y
destino y guárdelos en su equipo. Esta es la única vez que puede recuperar los tokens.
7. Seleccione Listo.
526
AWS IoT Guía del desarrollador
Iniciar una sesión SSH
Note
La región de AWS de este comando debe ser la misma región de AWS en la que se creó el túnel.
-r
Note
Si recibe el siguiente error, configure la ruta de acceso de entidad de certificación. Para obtener
información, consulte GitHub.
Could not perform SSL handshake with proxy server: certificate verify
failed
Es posible que le pidan una contraseña para la sesión SSH. Cuando haya terminado con la sesión SSH,
escriba exit para cerrar la sesión.
Cerrar el túnel
1. Abra la consola de AWS IoT.
2. Elija el túnel y, en Actions (Acciones), elija Close (Cerrar). Al cerrar el túnel, se cierran las dos instancias
del proxy local.
• OPEN
• CLOSED
• CONNECTED
• DISCONNECTED
Cuando se abre un túnel, este tiene el estado OPEN. El estado de conexión de origen y destino del túnel se
establece en DISCONNECTED. Cuando un dispositivo (de origen o destino) se conecta al túnel, el estado
de conexión correspondiente cambia a CONNECTED, mientras que el estado del túnel permanece en OPEN.
527
AWS IoT Guía del desarrollador
Control del acceso a los túneles
Cuando un dispositivo se desconecta del túnel, el estado de conexión correspondiente cambia de nuevo
a DISCONNECTED. Un dispositivo puede conectarse y desconectarse de un túnel varias veces mientras el
túnel tenga el estado OPEN.
Una vez que se haya eliminado un túnel CLOSED, es posible que esté visible en la consola de AWS
IoT durante al menos tres horas después de eliminarlo. Mientras el túnel está visible, puede llamar a
DescribeTunnel y ListTunnels para ver los metadatos del túnel. Un túnel no se puede volver a abrir
cuando tiene el estado CLOSED. El servicio Tunelización segura rechaza los intentos de conectarse a un
túnel en estado CLOSED.
iot:OpenTunnel
La acción de política iot:OpenTunnel concede un permiso a la entidad principal para llamar a
OpenTunnel. Debe especificar el ARN del túnel comodín arn:aws:iot:<aws-region>:<aws-
account-id>:tunnel/* en el elemento Resource de la instrucción de política de IAM. Puede
especificar el ARN de un objeto (arn:aws:iot:<aws-region>:<aws-account-id>:thing/
<thing-name>) en el elemento Resource de la instrucción de política de IAM para administrar los
permisos de OpenTunnel para objetos de IoT específicos.
Por ejemplo, la siguiente instrucción de política le permite abrir un túnel con el objeto de IoT llamado
TestDevice.
{
"Effect": "Allow",
"Action": "iot:OpenTunnel",
"Resource": [
"arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*",
"arn:aws:iot:<aws-region>:<aws-account-id>:thing/TestDevice"
]
}
• iot:ThingGroupArn
• iot:TunnelDestinationService
• aws:RequestTag/<clave-etiqueta>
• aws:TagKeys
528
AWS IoT Guía del desarrollador
iot:DescribeTunnel
La siguiente instrucción de política le permite abrir un túnel con el objeto si el objeto pertenece a un grupo
de objetos con un nombre que comienza por TestGroup y el servicio de destino configurado en el túnel es
SSH.
{
"Effect": "Allow",
"Action": "iot:OpenTunnel",
"Resource": [
"arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*"
],
"Condition": {
"ForAnyValue:StringLike": {
"iot:ThingGroupArn": [
"arn:aws:iot:<aws-region>:<aws-account-id>:thinggroup/TestGroup*"
]
},
"ForAllValues:StringEquals": {
"iot:TunnelDestinationService": [
"SSH"
]
}
}
}
También puede utilizar etiquetas de recursos para controlar los permisos para abrir túneles. Por ejemplo,
la siguiente instrucción de política permite abrir un túnel si la clave de etiqueta Owner está presente con un
valor de Admin y no se especifica ninguna otra etiqueta.
{
"Effect": "Allow",
"Action": "iot:OpenTunnel",
"Resource": [
"arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*"
],
"Condition": {
"StringEquals": {
"aws:RequestTag/Owner": "Admin"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": "Owner"
}
}
}
iot:DescribeTunnel
La acción de política iot:DescribeTunnel concede un permiso a la entidad principal para llamar
a DescribeTunnel. Puede especificar un ARN de túnel completo (por ejemplo, arn:aws:iot:<aws-
region>: <aws-account-id>:tunnel/<tunnel-id>) o utilizar el ARN del túnel comodín
(arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*) en el elemento Resource de la
instrucción de política de IAM.
• aws:ResourceTag/<tag-key>
529
AWS IoT Guía del desarrollador
iot:ListTunnels
"Effect": "Allow",
"Action": "iot:DescribeTunnel",
"Resource": [
"arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceTag/Owner": "Admin"
}
}
}
iot:ListTunnels
La acción de política iot:ListTunnels concede un permiso a la entidad principal para llamar a
ListTunnels. Debe especificar el ARN del túnel comodín (arn:aws:iot:<aws-region>:<aws-
account-id>:tunnel/*) en el elemento Resource de la instrucción de política de IAM. Para
administrar los permisos ListTunnels en objetos de IoT específicos, también puede especificar el ARN
de un objeto (arn:aws:iot:<aws-region>:<aws-account-id>:thing/<thing-name>) en el
elemento Resource de la instrucción de política de IAM.
La siguiente instrucción de política le permite mostrar los túneles del objeto denominado TestDevice.
{
"Effect": "Allow",
"Action": "iot:ListTunnels",
"Resource": [
"arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*",
"arn:aws:iot:<aws-region>:<aws-account-id>:thing/TestDevice"
]
}
iot:ListTagsForResource
La acción de política iot:ListTagsForResource concede un permiso a la entidad principal para llamar
a ListTagsForResource. Puede especificar el ARN completo de un túnel (arn:aws:iot:<aws-
region>: <aws-account-id>:tunnel/<tunnel-id>) o utilizar el ARN del túnel comodín
(arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*) en el elemento Resource de la
instrucción de política de IAM.
iot:CloseTunnel
La acción de política iot:CloseTunnel concede un permiso a la entidad principal para llamar a
CloseTunnel. Puede especificar el ARN completo de un túnel (arn:aws:iot:<aws-region>: <aws-
account-id>:tunnel/<tunnel-id>) o utilizar el ARN del túnel comodín (arn:aws:iot:<aws-
region>:<aws-account-id>:tunnel/*) en el elemento Resource de la instrucción de política de
IAM.
• iot:Delete
• aws:ResourceTag/<tag-key>
530
AWS IoT Guía del desarrollador
iot:TagResource
"Effect": "Allow",
"Action": "iot:CloseTunnel",
"Resource": [
"arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*"
],
"Condition": {
"Bool": {
"iot:Delete": "false"
},
"StringEquals": {
"aws:ResourceTag/Owner": "QATeam"
}
}
}
iot:TagResource
La acción de política iot:TagResource concede un permiso a la entidad principal para llamar a
TagResource. Puede especificar el ARN completo de un túnel (arn:aws:iot:<aws-region>: <aws-
account-id>:tunnel/<tunnel-id>) o utilizar el ARN del túnel comodín (arn:aws:iot:<aws-
region>:<aws-account-id>:tunnel/*) en el elemento Resource de la instrucción de política de
IAM.
iot:UntagResource
La acción de política iot:UntagResource concede un permiso a la entidad principal para llamar
a UntagResource. Puede especificar el ARN completo de un túnel (arn:aws:iot:<aws-
region>:<aws-account-id>:tunnel/<tunnel-id>) o utilizar el ARN del túnel comodín
(arn:aws:iot:<aws-region>:<aws-account-id>:tunnel/*) en el elemento Resource de la
instrucción de política de IAM.
Para obtener más información acerca de la seguridad de AWS IoT, consulte Administración de identidad y
acceso en AWS IoT (p. 189).
Proxy local
El proxy local es un proceso que actúa como destinatario o remitente de las conexiones TCP entrantes.
Transmite los datos enviados por la aplicación del dispositivo a través del servicio Tunelización segura
mediante una conexión segura WebSocket. Puede descargar el proxy local de origen en GitHub. El proxy
local puede ejecutarse en dos modos: source o destination. En el modo de origen, el proxy local se
ejecuta en el mismo dispositivo o red que la aplicación cliente que inicia la conexión TCP. En el modo de
destino, el proxy local se ejecuta en el dispositivo remoto, junto con la aplicación de destino. Actualmente,
un único túnel puede admitir solo una conexión TCP a la vez.
El proxy local establece primero una conexión con el servicio Tunelización segura. Cuando inicie el proxy
local, utilice el argumento -r para especificar la región de AWS en la que se abre el túnel. Utilice el
argumento -t para pasar el token de acceso de cliente de origen o de destino devuelto por OpenTunnel.
Dos proxies locales que utilicen el mismo valor de token de acceso de cliente no se pueden conectar al
mismo tiempo.
Después de establecer la conexión WebSocket, el proxy local actúa en modo de origen o en modo de
destino, en función de su configuración.
De forma predeterminada, el proxy local intenta volver a conectarse al servicio Tunelización segura si
se producen errores de E/S o si la conexión WebSocket se cierra inesperadamente. Esto hace que la
conexión TCP se cierre. Si se produce algún error de socket TCP, el proxy local envía un mensaje a través
531
AWS IoT Guía del desarrollador
Prácticas de seguridad recomendadas del proxy local
del túnel para notificar al otro extremo que cierre su conexión TCP. De forma predeterminada, el proxy
local siempre usa la comunicación SSL.
Después de utilizar el túnel, puede terminar el proceso del proxy local sin problemas. Le recomendamos
que cierre explícitamente el túnel llamando a CloseTunnel. Es posible que los clientes del túnel activos
no se cierren inmediatamente después de llamar a CloseTunnel.
• Evite el uso del argumento -t del proxy local para pasar un token de acceso. Se recomienda utilizar la
variable de entorno AWSIOT_TUNNEL_ACCESS_TOKEN para establecer el token de acceso del proxy
local.
• Ejecute el ejecutable del proxy local con privilegios mínimos en el sistema operativo o en el entorno.
• Evite ejecutar el proxy local como administrador en Windows.
• Evite ejecutar el proxy local como raíz en Linux y macOS.
• Considere la posibilidad de ejecutar el proxy local en hosts distintos, contenedores, entornos de pruebas,
chroot jail o en un entorno virtualizado.
• Cree el proxy local con indicadores de seguridad relevantes, en función de su cadena de herramientas.
• En dispositivos con varias interfaces de red, utilice el argumento -b para enlazar el socket TCP a la
interfaz de red utilizada para comunicarse con la aplicación de destino.
$aws/things/<thing-name>/tunnels/notify
donde thing-name es el nombre del objeto de IoT asociado con el dispositivo remoto.
{
"clientAccessToken": "<destination-client-access-token>",
"clientMode": "destination",
"region": "<aws-region",
"services": ["destination-service"]
}
Después de recibir un mensaje MQTT, el agente IoT debe iniciar un proxy local en el dispositivo remoto
con los parámetros apropiados.
El siguiente código Java muestra cómo utilizar el SDK de dispositivo de AWS IoT y ProcessBuilder de la
biblioteca Java para crear un agente de IoT sencillo que funcione con el servicio Tunelización segura.
532
AWS IoT Guía del desarrollador
Configuración de un dispositivo remoto
try {
mqttClient.connect();
final TunnelNotificationListener listener = new
TunnelNotificationListener(tunnelNotificationTopic);
mqttClient.subscribe(listener, true);
}
finally {
mqttClient.disconnect();
}
@Override
public void onMessage(AWSIotMessage message) {
try {
// Deserialize the MQTT message
final JSONObject json = new JSONObject(message.getStringPayload());
533
AWS IoT Guía del desarrollador
Configuración de un dispositivo remoto
El agente de escucha de token de acceso de cliente de destino debe funcionar con el mecanismo de
entrega de token de acceso de cliente de su elección. Debe poder iniciar un proxy local en modo de
destino.
534
AWS IoT Guía del desarrollador
Aprovisionamiento de dispositivos que no tienen certificados
de dispositivo mediante el aprovisionamiento de flotas
Aprovisionamiento de dispositivos
Cuando aprovisione un dispositivo con AWS IoT, debe crear recursos para que AWS IoT y los dispositivos
puedan comunicarse de forma segura. Se pueden crear otros recursos que le ayuden a administrar su flota
de dispositivos. Durante el proceso de aprovisionamiento se pueden crear los siguientes recursos:
• Un objeto de IoT.
Los objetos de IoT son entradas del registro de dispositivos de AWS IoT. Cada objeto tiene un nombre
único y un conjunto de atributos, y está asociado con un dispositivo físico. Los objetos se pueden definir
usando un tipo de objeto o agruparse en grupos de objetos. Para obtener más información, consulte
Administración de dispositivos con AWS IoT (p. 95).
Aunque no es necesario, la creación de objetos permite administrar la flota de dispositivos con mayor
eficacia, ya que los dispositivos pueden buscarse por tipo de objeto, grupo de objetos y atributos de
objeto. Para obtener más información, consulte Servicio de indexación de flota (p. 559).
• Un certificado X.509
Los dispositivos utilizan certificados X.509 para realizar la autenticación mutua con AWS IoT. Puede
registrar un certificado existente o hacer que AWS IoT genere y registre un nuevo certificado por usted.
Un certificado se asocia a un dispositivo asociándolo al objeto que representa el dispositivo. También
debe copiar el certificado y la clave privada asociada en el dispositivo. Los dispositivos presentan el
certificado al conectarse a AWS IoT. Para obtener más información, consulte Autenticación (p. 123).
• Una política de IoT
Las políticas de IoT definen qué operaciones puede realizar un dispositivo en AWS IoT. Las políticas
de IoT se asocian a certificados de dispositivo. Cuando un dispositivo presenta el certificado a AWS
IoT, se conceden los permisos especificados en la política. Para obtener más información, consulte
Autorización (p. 151). Cada dispositivo necesita un certificado para comunicarse con AWS IoT.
Puede utilizar el aprovisionamiento automatizado tanto si sus dispositivos tienen certificados únicos (y su
clave privada asociada) como si no.
• Por reclamación
535
AWS IoT Guía del desarrollador
Aprovisionar un dispositivo mediante reclamación
También puede crear una plantilla de aprovisionamiento de flotas desde la consola de AWS IoT.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Connect"],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": ["iot:Publish","iot:Receive"],
"Resource": [
"arn:aws:iot:aws-region:aws-account-id:topic/$aws/certificates/create/
*",
"arn:aws:iot:aws-region:aws-account-id:topic/$aws/provisioning-
templates/templateName/provision/*"
]
},
{
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": [
"arn:aws:iot:aws-region:aws-account-id:topicfilter/$aws/certificates/
create/*",
"arn:aws:iot:aws-region:aws-account-id:topicfilter/$aws/provisioning-
templates/templateName/provision/*"
]
}
]
}
4. Cuando aprovisiona dispositivos, puede conceder al servicio de AWS IoT permiso para crear o
actualizar recursos de IoT, como objetos y certificados de la cuenta. Para ello, asocie la política
536
AWS IoT Guía del desarrollador
Aprovisionamiento por usuario de confianza
El dispositivo ya está listo para ser entregado a donde se instalará para su uso.
Important
Las claves privadas de la notificación de aprovisionamiento deben estar protegidas en todo
momento, también en el dispositivo. Le recomendamos que utilice las métricas y los registros de
CloudWatch de AWS IoT para comprobar si hay indicios de un uso incorrecto. Si detecta un uso
incorrecto, deshabilite el certificado de notificación de aprovisionamiento para que no se pueda
utilizar para el aprovisionamiento de dispositivos.
1. El dispositivo utiliza el SDK de AWS IoT para dispositivos y móviles (p. 762) para conectarse y
autenticarse con AWS IoT utilizando el certificado de reclamación de aprovisionamiento que está
instalado en el dispositivo.
2. El dispositivo obtiene un certificado permanente y una clave privada mediante una de estas opciones.
El dispositivo utilizará el certificado y la clave para toda la autenticación futura con AWS IoT.
O bien
b. Llame a CreateCertificateFromCsr para generar un certificado desde una solicitud de firma
de certificado que mantiene su clave privada segura.
3. Desde el dispositivo, llame a RegisterThing para registrar el dispositivo con AWS IoT y crear
recursos en la nube.
El servicio de aprovisionamiento de flotas crea recursos en la nube como objetos de IoT, grupos de
objetos y atributos, tal como se definen en la plantilla de aprovisionamiento.
4. Después de guardar el certificado permanente en el dispositivo, este debe desconectarse de la
sesión que inició con el certificado de reclamación de aprovisionamiento y volver a conectarse con el
certificado permanente.
537
AWS IoT Guía del desarrollador
Aprovisionamiento por usuario de confianza
2. Cree un rol de IAM que utilice un usuario de confianza para iniciar el proceso de aprovisionamiento. La
plantilla de aprovisionamiento solo permite a ese usuario aprovisionar un dispositivo. Por ejemplo:
{
"Effect": "Allow",
"Action": [
"iot:CreateProvisioningClaim",
],
"Resource": [
"arn:aws:aws-region:aws-account-id:provisioningtemplate/templateName"
]
}
3. Cuando aprovisiona dispositivos, puede conceder al servicio de AWS IoT permiso para crear o
actualizar recursos de IoT, como objetos y certificados de la cuenta. Para ello, asocie la política
administrada AWSIoTThingsRegistration a un rol de IAM (denominado rol de aprovisionamiento)
que confíe en la entidad de seguridad del servicio AWS IoT.
4. Proporcione los medios para identificar a sus usuarios de confianza, por ejemplo proporcionándoles
una cuenta que pueda autenticarlos y autorizar sus interacciones con las API de AWS necesarias para
registrar sus dispositivos
El dispositivo debe realizar los siguientes pasos para que llame a RegisterThing en un
plazo de cinco minutos a partir de la conexión a AWS IoT con el certificado de reclamación de
aprovisionamiento temporal.
5. El dispositivo obtiene un certificado permanente y una clave privada mediante una de estas opciones.
El dispositivo utilizará el certificado y la clave para toda la autenticación futura con AWS IoT.
O bien
b. Llame a CreateCertificateFromCsr para generar un certificado desde una solicitud de firma
de certificado que mantiene su clave privada segura.
6. El dispositivo llama a RegisterThing para registrar el dispositivo con AWS IoT y crear recursos en
la nube. Recuerde que esto debe ocurrir dentro de los cinco minutos siguientes a la conexión a AWS
IoT con el certificado de reclamación de aprovisionamiento temporal.
538
AWS IoT Guía del desarrollador
Enlaces de preaprovisionamiento
El servicio de aprovisionamiento de flotas crea recursos en la nube como objetos de IoT, grupos de
objetos y atributos, tal como se definen en la plantilla de aprovisionamiento.
7. Después de guardar el certificado permanente en el dispositivo, el dispositivo debe desconectarse
de la sesión que inició con el certificado de reclamación de aprovisionamiento temporal y volver a
conectarse con el certificado permanente.
Enlaces de preaprovisionamiento
Al utilizar el aprovisionamiento de flotas de AWS IoT, puede configurar una función de Lambda para validar
los parámetros del dispositivo antes de permitir que se aprovisione el dispositivo. Esta función de Lambda
debe existir en su cuenta antes de aprovisionar un dispositivo porque se llama cada vez que un dispositivo
envía una solicitud a través de RegisterThing. Su función de Lambda debe poder recibir una entrada y
devolver una salida; de lo contrario, su dispositivo no se aprovisionará. El aprovisionamiento continúa solo
si la función de Lambda devuelve el parámetro "allowProvisioning": "SUCCEED".
Important
A continuación, se muestra un ejemplo de carga útil que AWS IoT envía a la función de Lambda.
{
"claimCertificateId" : "string",
"claimId" : "string",
"certificatePem" : "string",
"templateArn" : "arn:aws:iot:us-east-1:1234567890:provisioningtemplate/MyTemplate",
"mqttClientId" : "221a6d10-9c7f-42f1-9153-e52e6fc869c1",
// parameters sent from the device
"incomingParameters" : {
"customKey" : "customValue",
// more parameters incoming from device ....
}
}
La función de Lambda debe devolver una respuesta que indique si ha autorizado o no la solicitud de
aprovisionamiento. A continuación se muestra un ejemplo de una respuesta correcta.
{
// determines provisioning IoT resources should continue
"allowProvisioning": "SUCCEED",
// optional template parameters to be added when evaluating the template
"parameterOverrides" : {
"customKeysAndValues": "sentToDevice",
// more parameters that will be returned to device ....
}
}
539
AWS IoT Guía del desarrollador
Enlaces de preaprovisionamiento
Note
1. Cree una función de Lambda que tenga una entrada y salida definidas. Las funciones de Lambda
son altamente personalizables allowProvisioning y parameterOverrides son necesarias
para crear enlaces de preaprovisionamiento. Para obtener más información acerca de la creación de
funciones de Lambda, consulte Uso de AWS Lambda con la interfaz de línea de comandos de AWS.
{
"allowProvisioning": "True",
"parameterOverrides": {
"incomingKey0": "incomingValue0",
"incomingKey1": "incomingValue1"
}
}
2. AWS IoT utiliza políticas basadas en recursos para llamar a Lambda, por lo que tendrá que conceder
permiso a AWS IoT para llamar a su función de Lambda.
540
AWS IoT Guía del desarrollador
Enlaces de preaprovisionamiento
"templateArn": "arn:aws:iot:us-east-1:1234564789012:provisioningtemplate/
myTemplate",
"defaultVersionId": 1,
"templateName": myTemplate
}
También puede cargar un parámetro desde un archivo en lugar de escribirlo todo como un valor
de parámetro de línea de comandos para ahorrar tiempo. Para obtener más información, consulte
Carga de parámetros de la CLI de AWS desde un archivo. A continuación se muestra el parámetro
template en formato JSON expandido:
{
"Parameters" : {
"DeviceLocation": {
"Type": "String"
}
},
"Mappings": {
"LocationTable": {
"Seattle": {
"LocationUrl": "https://example.aws"
}
}
},
"Resources" : {
"thing" : {
"Type" : "AWS::IoT::Thing",
"Properties" : {
"AttributePayload" : {
"version" : "v1",
"serialNumber" : "serialNumber"
},
"ThingName" : {"Fn::Join":["",["ThingPrefix_",
{"Ref":"SerialNumber"}]]},
"ThingTypeName" : {"Fn::Join":["",["ThingTypePrefix_",
{"Ref":"SerialNumber"}]]},
"ThingGroups" : ["widgets", "WA"],
"BillingGroup": "BillingGroup"
},
"OverrideSettings" : {
"AttributePayload" : "MERGE",
"ThingTypeName" : "REPLACE",
"ThingGroups" : "DO_NOTHING"
}
},
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
"Status" : "Active"
}
},
"policy" : {
"Type" : "AWS::IoT::Policy",
"Properties" : {
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action":["iot:Publish"],
"Resource": ["arn:aws:iot:us-east-1:504350838278:topic/foo/
bar"]
}]
}
541
AWS IoT Guía del desarrollador
Aprovisionamiento de dispositivos
que tienen certificados de dispositivo
}
}
},
"DeviceConfiguration": {
"FallbackUrl": "https://www.example.com/test-site",
"LocationUrl": {
"Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"},
"LocationUrl"]}
}
}
{
"targetArn" : "arn:aws:lambda:us-
east-1:765219403047:function:pre_provisioning_test",
"payloadVersion" : "2020-04-01"
}
• Aprovisionamiento de un solo objeto con una plantilla de aprovisionamiento. Esta es una buena opción si
solo necesita aprovisionar los dispositivos de uno en uno.
• Aprovisionamiento "just-in-time" (JITP) con una plantilla que aprovisiona un dispositivo cuando se
conecta por primera vez a AWS IoT. Esta es una buena opción si necesita registrar un gran número
de dispositivos, pero no dispone de información sobre ellos que se pueda incluir en una lista de
aprovisionamiento por lotes.
• Registro masivo Esta opción le permite especificar una lista de valores de aprovisionamiento de un solo
objeto que se almacenan en un archivo en un bucket de S3. Este enfoque funciona bien si tiene un gran
número de dispositivos conocidos cuyas características puede incluir en una lista.
--template-body
La plantilla de aprovisionamiento.
--parameters
Una lista de pares de nombre-valor para los parámetros utilizados en la plantilla de aprovisionamiento,
en formato JSON (por ejemplo, {"ThingName" : "MyProvisionedThing", "CSR" : "<csr-
text>"}).
RegisterThing o register-thing devuelve los ARN para los recursos y el texto del certificado que ha
creado:
542
AWS IoT Guía del desarrollador
Aprovisionamiento justo a tiempo
{
"certificatePem": "<certificate-text>",
"resourceArns": {
"PolicyLogicalName": "arn:aws:iot:us-
west-2:123456789012:policy/2A6577675B7CD1823E271C7AAD8184F44630FFD7",
"certificate": "arn:aws:iot:us-west-2:123456789012:cert/
cd82bb924d4c6ccbb14986dcb4f40f30d892cc6b3ce7ad5008ed6542eea2b049",
"thing": "arn:aws:iot:us-west-2:123456789012:thing/MyProvisionedThing"
}
}
Puede realizar estas configuraciones cuando registre un nuevo certificado de CA con la API
RegisterCACertificate o el comando de la CLI register-ca-certificate:
Cuando un dispositivo intenta conectarse a AWS IoT mediante un certificado firmado por un certificado
de CA registrado, AWS IoT carga la plantilla desde el certificado de CA y la utiliza para llamar a
RegisterThing. El flujo de trabajo de JITP registra primero un certificado con un valor de estado de
PENDING_ACTIVATION. Cuando se completa el flujo de aprovisionamiento del dispositivo, el estado del
certificado cambia a ACTIVE.
AWS IoT define los siguientes parámetros que puede declarar y a los que puede hacer referencia en las
plantillas de aprovisionamiento:
• AWS::IoT::Certificate::Country
• AWS::IoT::Certificate::Organization
• AWS::IoT::Certificate::OrganizationalUnit
• AWS::IoT::Certificate::DistinguishedNameQualifier
• AWS::IoT::Certificate::StateName
• AWS::IoT::Certificate::CommonName
• AWS::IoT::Certificate::SerialNumber
• AWS::IoT::Certificate::Id
Los valores de estos parámetros de plantilla de aprovisionamiento se limitan a lo que JITP puede
extraer del campo de asunto del certificado del dispositivo que se va a aprovisionar. El certificado
543
AWS IoT Guía del desarrollador
Aprovisionamiento justo a tiempo
debe contener valores para todos los parámetros en el cuerpo de la plantilla. El parámetro
AWS::IoT::Certificate::Id se refiere a un ID generado internamente, no un ID que se encuentra en
el certificado. Puede obtener el valor de este ID utilizando la función principal() dentro de una regla de
AWS IoT.
El siguiente archivo JSON es un ejemplo de una plantilla de JITP completa. El valor del campo
templateBody debe ser un objeto JSON especificado como una cadena de escape y solo puede utilizar
los valores de la lista anterior. Puede utilizar distintas herramientas para crear la salida JSON necesaria,
como json.dumps (Python) o JSON.stringify (Node). El valor del campo roleARN debe ser el ARN
de un rol que tenga AWSIoTThingsRegistration asociado. Además, la plantilla puede utilizar un
PolicyName existente en lugar del PolicyDocument insertado en el ejemplo. (En el primer ejemplo se
han añadido saltos de línea para facilitar su lectura, pero puede copiar y pegar la plantilla que aparece
justo debajo).
{
"templateBody" : "{
\r\n \"Parameters\" : {\r\n
\"AWS::IoT::Certificate::CommonName\": {\r\n \"Type\":
\"String\"\r\n },\r\n
\"AWS::IoT::Certificate::SerialNumber\": {\r\n \"Type\":
\"String\"\r\n },\r\n
\"AWS::IoT::Certificate::Country\": {\r\n \"Type\": \"String
\"\r\n },\r\n
\"AWS::IoT::Certificate::Id\": {\r\n \"Type\": \"String\"\r
\n }\r\n },\r\n
\"Resources\": {\r\n
\"thing\": {\r\n
\"Type\": \"AWS::IoT::Thing\",\r\n
\"Properties\": {\r\n
\"ThingName\": {\r\n \"Ref\":
\"AWS::IoT::Certificate::CommonName\"\r\n },\r\n
\"AttributePayload\": {\r\n
\"version\": \"v1\",\r\n
\"serialNumber\": {\r\n
\"Ref\": \"AWS::IoT::Certificate::SerialNumber
\"\r\n }\r\n },\r\n
\"ThingTypeName\": \"lightBulb-versionA\",\r\n
\"ThingGroups\": [\r\n
\"v1-lightbulbs\",\r\n {\r\n
\"Ref\": \"AWS::IoT::Certificate::Country\"\r
\n }\r\n ]\r\n },\r\n
\"OverrideSettings\": {\r\n
\"AttributePayload\": \"MERGE\",\r\n
\"ThingTypeName\": \"REPLACE\",\r\n
\"ThingGroups\": \"DO_NOTHING\"\r\n }\r\n },\r\n
\"certificate\": {\r\n
\"Type\": \"AWS::IoT::Certificate\",\r\n
\"Properties\": {\r\n
\"CertificateId\": {\r\n \"Ref\":
\"AWS::IoT::Certificate::Id\"\r\n },\r\n
\"Status\": \"ACTIVE\"\r\n },\r\n
\"OverrideSettings\": {\r\n
\"Status\": \"DO_NOTHING\"\r\n }\r\n },\r\n
\"policy\": {\r\n
\"Type\": \"AWS::IoT::Policy\",\r\n
\"Properties\": {\r\n
\"PolicyDocument\": \"{
\\\"Version\\\": \\\"2012-10-17\\\",
\\\"Statement\\\": [{
\\\"Effect\\\": \\\"Allow\\\",
\\\"Action\\\":[\\\"iot:Publish\\\"],
544
AWS IoT Guía del desarrollador
Aprovisionamiento justo a tiempo
\\\"Resource\\\": [\\\"arn:aws:iot:us-
east-1:123456789012:topic\/sample\/topic\\\"] }] }\"\r\n }\r\n }\r\n
}\r\n}",
"roleArn" : "arn:aws:iam::123456789012:role/Provisioning-JITP"
}
{
"templateBody" : "{\r\n \"Parameters\" : {\r\n
\"AWS::IoT::Certificate::CommonName\": {\r\n \"Type\": \"String\"\r\n },
\r\n \"AWS::IoT::Certificate::SerialNumber\": {\r\n \"Type\": \"String
\"\r\n },\r\n \"AWS::IoT::Certificate::Country\": {\r\n \"Type\":
\"String\"\r\n },\r\n \"AWS::IoT::Certificate::Id\": {\r\n \"Type
\": \"String\"\r\n }\r\n },\r\n \"Resources\": {\r\n \"thing\": {\r\n
\"Type\": \"AWS::IoT::Thing\",\r\n \"Properties\": {\r\n
\"ThingName\": {\r\n \"Ref\": \"AWS::IoT::Certificate::CommonName
\"\r\n },\r\n \"AttributePayload\": {\r\n
\"version\": \"v1\",\r\n \"serialNumber\": {\r\n
\"Ref\": \"AWS::IoT::Certificate::SerialNumber\"\r\n }\r\n
},\r\n \"ThingTypeName\": \"lightBulb-versionA\",\r\n
\"ThingGroups\": [\r\n \"v1-lightbulbs\",\r\n
{\r\n \"Ref\": \"AWS::IoT::Certificate::Country\"\r\n
}\r\n ]\r\n },\r\n \"OverrideSettings\": {\r
\n \"AttributePayload\": \"MERGE\",\r\n \"ThingTypeName\":
\"REPLACE\",\r\n \"ThingGroups\": \"DO_NOTHING\"\r\n }\r\n
},\r\n \"certificate\": {\r\n \"Type\": \"AWS::IoT::Certificate\",\r\n
\"Properties\": {\r\n \"CertificateId\": {\r\n
\"Ref\": \"AWS::IoT::Certificate::Id\"\r\n },\r\n \"Status
\": \"ACTIVE\"\r\n },\r\n \"OverrideSettings\": {\r\n
\"Status\": \"DO_NOTHING\"\r\n }\r\n },\r\n \"policy\": {\r\n
\"Type\": \"AWS::IoT::Policy\",\r\n \"Properties\": {\r\n
\"PolicyDocument\": \"{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [{ \
\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\":[\\\"iot:Publish\\\"], \\\"Resource\\\": [\\
\"arn:aws:iot:us-east-1:123456789012:topic\/foo\/bar\\\"] }] }\"\r\n }\r\n
}\r\n }\r\n}",
"roleArn" : "arn:aws:iam::123456789012:role/JITPRole"
}
Debería poder ver el registro del certificado como un evento registrado (RegisterCACertificate) en
AWS CloudTrail. También puede usar CloudTrail para solucionar los problemas con su plantilla JITP.
545
AWS IoT Guía del desarrollador
Registro masivo
Note
JITP llama a otras API de plano de control de AWS IoT durante el proceso de aprovisionamiento.
Estas llamadas pueden superar las cuotas de limitación de AWS IoT establecidas en su cuenta
y provocar una limitación controlada de las llamadas. Póngase en contacto con el servicio de
atención al cliente de AWS para aumentar las cuotas de limitación controlada, si es necesario.
Registro masivo
Puede usar el comando start-thing-registration-task para registrar varios objetos a la vez. Este
comando toma una plantilla de registro, un nombre de bucket de S3, un nombre de clave y un ARN de rol
que permite el acceso al archivo en el bucket de S3. El archivo en el bucket de S3 contiene los valores
utilizados para reemplazar los parámetros de la plantilla. El archivo debe ser un archivo JSON delimitado
por nueva línea. Cada línea contiene todos los valores de los parámetros para el registro de un único
dispositivo. Por ejemplo:
Las siguientes API relacionadas con el registro masivo pueden ser útiles:
Note
• Solo puede ejecutarse una tarea de operación de registro masivo a la vez (por cuenta).
• Las operaciones de registro masivo llaman a otras API del plano de control de AWS IoT. Estas
llamadas pueden superar las cuotas de limitación controlada de AWS IoT establecidas en la
cuenta y provocar errores de limitación. Póngase en contacto con el servicio de atención al
cliente de AWS para aumentar las cuotas de limitación controlada de AWS IoT, si es necesario.
Aprovisionamiento de plantillas
Una plantilla de aprovisionamiento es un documento JSON que utiliza parámetros para describir los
recursos que el dispositivo debe usar para interactuar con AWS IoT. Una plantilla contiene dos secciones:
Parameters y Resources. Hay dos tipos de plantillas de aprovisionamiento en AWS IoT. Uno se utiliza
para el aprovisionamiento just-in-time (JITP) y el registro masivo, y otro para el aprovisionamiento de flotas.
Sección de parámetros
La sección Parameters declara los parámetros utilizados en la sección Resources. Cada parámetro
declara un nombre, un tipo y un valor predeterminado opcional. El valor predeterminado se usa cuando el
diccionario trasladado con la plantilla no contiene un valor para el parámetro. La sección Parameters de
un documento de plantilla tiene el siguiente aspecto:
{
"Parameters" : {
546
AWS IoT Guía del desarrollador
Sección de recursos
"ThingName" : {
"Type" : "String"
},
"SerialNumber" : {
"Type" : "String"
},
"Location" : {
"Type" : "String",
"Default" : "WA"
},
"CSR" : {
"Type" : "String"
}
}
}
Este snippet de plantilla declara cuatro parámetros: ThingName, SerialNumber, Location y CSR.
Todos esos parámetros son de tipo String. El parámetro Location declara un valor predeterminado de
"WA".
Sección de recursos
La sección Resources de la plantilla declara los recursos necesarios para que su dispositivo se
comunique con AWS IoT: un objeto, un certificado y una o más políticas de IoT. Cada recurso especifica
un nombre lógico, un tipo y un conjunto de propiedades.
El tipo especifica la clase de recurso que está declarando. Los tipos válidos son:
• AWS::IoT::Thing
• AWS::IoT::Certificate
• AWS::IoT::Policy
Las propiedades que especifique dependen del tipo de recurso que está declarando.
Recursos de objetos
Los recursos de objetos se declaran mediante las siguientes propiedades:
• ThingName: Cadena.
• AttributePayload: opcional. Una lista de pares de nombre-valor.
• ThingTypeName: opcional. Cadena para un tipo de objeto asociado para el objeto.
• ThingGroups: opcional. Una lista de grupos a los que pertenece el objeto.
Recursos de certificados
Puede especificar certificados de una de las siguientes maneras:
547
AWS IoT Guía del desarrollador
Sección de recursos
Note
Cuando declare un certificado en una plantilla, use solo uno de estos métodos. Por ejemplo, si
utiliza un CSR, no puede especificar también un ID de certificado o un certificado de dispositivo.
Para obtener más información, consulte Certificados de cliente X.509 (p. 127).
Para obtener más información, consulte Información general del certificado X.509 (p. 123).
• CertificateSigningRequest: Cadena.
• CertificateID: Cadena.
• CertificatePem: Cadena.
• CACertificatePem: Cadena.
• Status: opcional. Cadena, que puede ser ACTIVE o INACTIVE. El valor predeterminado es ACTIVE.
Ejemplos:
{
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateSigningRequest": {"Ref" : "CSR"},
"Status" : "ACTIVE"
}
}
}
{
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateId": {"Ref" : "CertificateId"}
}
}
}
• Certificado especificado con un archivo .pem de certificado existente y un archivo .pem de certificado de
CA:
{
"certificate" : {
"Type" : "AWS::IoT::Certificate"
"Properties" : {
"CACertificatePem": {"Ref" : "CACertificatePem"},
"CertificatePem": {"Ref" : "CertificatePem"}
}
}
}
Recursos de políticas
Los recursos de políticas se declaran mediante una de las siguientes propiedades:
548
AWS IoT Guía del desarrollador
Sección de recursos
• PolicyName: opcional. Cadena. Hash es el valor predeterminado del documento de políticas. Si utiliza
una política de AWS IoT existente, escriba el nombre de la política para la propiedad PolicyName. No
incluya la propiedad PolicyDocument.
• PolicyDocument: opcional. Un objeto JSON especificado como una cadena de escape. Si
PolicyDocument no se proporciona, la política debe haberse creado ya.
Note
Si una sección Policy está presente, PolicyName o PolicyDocument, pero no ambas, debe
especificarse.
Configuración de invalidación
Si una plantilla especifica un recurso que ya existe, la sección OverrideSettings le permite especificar
la acción que se debe realizar:
DO_NOTHING
Cuando declara un recurso de objeto, puede especificar OverrideSettings para las siguientes
propiedades:
• ATTRIBUTE_PAYLOAD
• THING_TYPE_NAME
• THING_GROUPS
Ejemplo de recursos
El siguiente fragmento de plantilla declara un objeto, un certificado y una política:
{
"Resources" : {
"thing" : {
"Type" : "AWS::IoT::Thing",
"Properties" : {
"AttributePayload" : { "version" : "v1", "serialNumber" : {"Ref" :
"SerialNumber"}},
"ThingTypeName" : "lightBulb-versionA",
"ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
549
AWS IoT Guía del desarrollador
Ejemplo de plantilla para el registro JITP y masivo
},
"OverrideSettings" : {
"AttributePayload" : "MERGE",
"ThingTypeName" : "REPLACE",
"ThingGroups" : "DO_NOTHING"
}
},
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateSigningRequest": {"Ref" : "CSR"},
"Status" : "ACTIVE"
}
},
"policy" : {
"Type" : "AWS::IoT::Policy",
"Properties" : {
"PolicyDocument" : "{ \"Version\": \"2012-10-17\", \"Statement\":
[{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-
east-1:123456789012:topic/foo/bar\"] }] }"
}
}
}
}
Las propiedades de objeto incluyen el nombre de objeto, un conjunto de atributos, un nombre de tipo de
objeto opcional y una lista opcional de grupos de objetos a los que pertenece el objeto.
Las propiedades incluyen el CSR para el certificado y el establecimiento del estado en ACTIVE. El texto
CSR se transfiere como parámetro en el diccionario transferido con la plantilla.
550
AWS IoT Guía del desarrollador
Ejemplo de plantilla para el registro JITP y masivo
(El valor del campo PolicyDocument debe ser un objeto JSON especificado como una cadena de
escape).
{
"Parameters" : {
"SerialNumber" : {
"Type" : "String"
},
"Location" : {
"Type" : "String",
"Default" : "WA"
},
"CSR" : {
"Type" : "String"
}
},
"Resources" : {
"thing" : {
"Type" : "AWS::IoT::Thing",
"Properties" : {
"AttributePayload" : { "version" : "v1", "serialNumber" : {"Ref" :
"SerialNumber"}},
"ThingTypeName" : "lightBulb-versionA",
"ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
}
},
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateSigningRequest": {"Ref" : "CSR"},
"Status" : "ACTIVE"
}
},
"policy" : {
"Type" : "AWS::IoT::Policy",
"Properties" : {
"PolicyDocument" : "{ \"Version\": \"2012-10-17\", \"Statement\":
[{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-
east-1:123456789012:topic/foo/bar\"] }] }"
}
}
}
}
El siguiente archivo JSON es un ejemplo de una plantilla de aprovisionamiento completa que especifica un
certificado existente con un ID de certificado:
{
"Parameters" : {
"SerialNumber" : {
"Type" : "String"
},
"Location" : {
"Type" : "String",
"Default" : "WA"
},
"CertificateId" : {
"Type" : "String"
}
},
"Resources" : {
"thing" : {
"Type" : "AWS::IoT::Thing",
"Properties" : {
551
AWS IoT Guía del desarrollador
Aprovisionamiento de flotas
Aprovisionamiento de flotas
Las plantillas de aprovisionamiento de flotas las utiliza AWS IoT para definir la configuración de la nube
y del dispositivo. Estas plantillas utilizan los mismos parámetros y recursos que las plantillas de registro
masivo y JITP. Para obtener más información, consulte Aprovisionamiento de plantillas (p. 546).
Las plantillas de aprovisionamiento de flotas pueden contener una sección Mapping y una sección
DeviceConfiguration. Puede utilizar funciones intrínsecas dentro de una plantilla de aprovisionamiento
de flotas para generar una configuración específica del dispositivo. Las plantillas de aprovisionamiento
de flotas son recursos con nombre y se identifican mediante el ARN (por ejemplo, arn:aws:iot:us-
west-2:1234568788:provisioningtemplate/templateName).
Mapeos
La sección Mappings opcional hace coincidir una clave con el conjunto correspondiente de valores
identificados. Por ejemplo, si desea establecer valores en función de una región de AWS, puede crear una
correspondencia en la que se utilice el nombre de una región de AWS como clave y contenga los valores
que desea especificar para cada región específica. Puede utilizar la función intrínseca Fn::FindInMap
para recuperar valores en una asignación.
{
"DeviceConfiguration": {
"Foo":"Bar"
}
}
552
AWS IoT Guía del desarrollador
Aprovisionamiento de flotas
Funciones intrínsecas
Las funciones intrínsecas se utilizan en cualquier sección de la plantilla de aprovisionamiento, excepto en
la sección Mappings.
Fn:Join
Fn::Select no comprueba si hay valores null o si el índice queda fuera de los límites de
la matriz. Ambas condiciones dan lugar a un error de aprovisionamiento, por lo que debe
asegurarse de elegir un valor de índice válido y de que la lista contiene valores distintos de
null.
Fn:FindInMap
Devuelve el valor correspondiente a claves en una asignación de dos niveles declarada en la sección
Mappings.
Fn:Split
Divide una cadena en una lista de valores de cadena para que pueda seleccionar un elemento de la
lista de cadenas. Especifique un delimitador que determine dónde se divide la cadena (por ejemplo,
una coma). Después de dividir una cadena, utilice Fn::Select para seleccionar un elemento.
Por ejemplo, si una cadena delimitada por comas de IDs de subred se importa a la plantilla de
pila, puede dividir la cadena en cada coma. En la lista de ID de subred, utilice Fn::Select para
especificar el ID de subred de un recurso.
Fn:Sub
Sustituye variables en una cadena de entrada por los valores que especifique. Puede utilizar esta
función para crear comandos o salidas que incluyan valores que no están disponibles hasta que crea o
actualiza una pila.
553
AWS IoT Guía del desarrollador
API de aprovisionamiento de flotas
"Properties" : {
"AttributePayload" : {
"version" : "v1",
"serialNumber" : "serialNumber"
},
"ThingTypeName" : {"Fn::Join":["",["ThingPrefix_",
{"Ref":"SerialNumber"}]]},
"ThingGroups" : ["v1-lightbulbs", "WA"],
"BillingGroup": "LightBulbBillingGroup"
},
"OverrideSettings" : {
"AttributePayload" : "MERGE",
"ThingTypeName" : "REPLACE",
"ThingGroups" : "DO_NOTHING"
}
},
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
"Status" : "Active"
}
},
"policy" : {
"Type" : "AWS::IoT::Policy",
"Properties" : {
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action":["iot:Publish"],
"Resource": ["arn:aws:iot:us-east-1:123456789012:topic/foo/bar"]
}]
}
}
}
},
"DeviceConfiguration": {
"FallbackUrl": "https://www.example.com/test-site",
"LocationUrl": {
"Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
}
}
}
Note
• API del plano de control, que se utiliza para crear y administrar plantillas de aprovisionamiento de flotas y
para configurar políticas de usuario de confianza.
• CreateProvisioningTemplate
• CreateProvisioningTemplateVersion
• DeleteProvisioningTemplate
• DeleteProvisioningTemplateVersion
554
AWS IoT Guía del desarrollador
API de MQTT de aprovisionamiento de dispositivos
• DescribeProvisioningTemplate
• DescribeProvisioningTemplateVersion
• ListProvisioningTemplates
• ListProvisioningTemplateVersions
• UpdateProvisioningTemplate
• API de plano de control utilizada por un usuario de confianza para generar una reclamación de
incorporación temporal. Esta reclamación se pasa al dispositivo durante la configuración de Wi-Fi o un
método similar. Hay una API en esta categoría: CreateProvisioningClaim.
• API utilizada por los dispositivos durante el proceso de aprovisionamiento. Esto significa usar un
certificado de reclamación de aprovisionamiento incrustado en un dispositivo o una transferido al mismo
por un usuario de confianza.
CreateCertificateFromCsr
Para crear un certificado a partir de una solicitud de firma de certificado (CSR), publique un mensaje en
$aws/certificates/create-from-csr/cbor o $aws/certificates/create-from-csr/json.
Carga de solicitud:
{
"certificateSigningRequest": "string"
}
certificateSigningRequest
{
"statusCode": int,
"errorCode": "string",
"errorMessage": "string"
}
statusCode
El código de error.
errorMessage
Mensaje de error.
Para obtener más información, consulte CreateCertificateFromCsr en Referencia de la API de AWS IoT.
555
AWS IoT Guía del desarrollador
API de MQTT de aprovisionamiento de dispositivos
CreateKeysAndCertificate
En los ejemplos de este documento, se utiliza JSON para facilitar la lectura, pero también se puede utilizar
el formato de representación concisa de objetos binarios (CBOR). El nuevo certificado tendrá el estado
PENDING_ACTIVATION. Cuando se utiliza la API RegisterThing para aprovisionar un objeto, el estado
del certificado cambia a ACTIVE o INACTIVE, en función de la definición de la plantilla.
Carga de solicitud:
{}
Carga de respuesta:
{
"certificateId": "string",
"certificatePem": "string",
"privateKey": "string",
"certificateOwnershipToken": "string"
}
certificateId
El ID del certificado.
certificatePem
La clave privada.
certificateOwnershipToken
{
"statusCode": int,
"errorCode": "string",
"errorMessage": "string"
}
statusCode
El código de error.
556
AWS IoT Guía del desarrollador
API de MQTT de aprovisionamiento de dispositivos
errorMessage
Mensaje de error.
Para obtener más información, vea CreateKeysAndCertificate en la Referencia de la API de AWS IoT.
RegisterThing
Para aprovisionar un objeto, publique un mensaje en $aws/provisioning-
templates/templateName/provision/cbor o $aws/provisioning-
templates/templateName/provision/json.
Carga de solicitud:
{
"certificateOwnershipToken": "string",
"parameters": {
"string": "string"
},
}
templateName
El token para comprobar la propiedad del certificado. El token lo genera AWS IoT cuando se crea un
certificado a través de MQTT.
parameters
Carga de respuesta:
{
"deviceConfiguration": {
"string": "string"
},
"thingName": "string"
}
thingName
557
AWS IoT Guía del desarrollador
API de MQTT de aprovisionamiento de dispositivos
{
"statusCode": int,
"errorCode": "string",
"errorMessage": "string"
}
statusCode
El código de error.
errorMessage
Mensaje de error.
Para obtener más información, consulte RegisterThing en la Referencia de la API de AWS IoT.
558
AWS IoT Guía del desarrollador
Administración de la indexación de objetos
Al habilitar la indexación, AWS IoT crea un índice para sus objetos o grupos de objetos. Después de
activarla, puede realizar consultas en el índice, como buscar todos los dispositivos portátiles que tengan
una duración de la batería de más del 70 %. AWS IoT mantiene el índice permanentemente actualizado
con los datos más recientes.
AWS_Things es el índice creado para todos sus objetos. AWS_ThingGroups es el índice que contiene
todos sus grupos de objetos.
Puede utilizar la consola de AWS IoT para administrar su configuración de indexación y ejecutar las
consultas de búsqueda. Elija los índices que quiera utilizar en la página de configuración de la consola.
Si prefiere el acceso mediante programación, puede utilizar los SDK de AWS o la AWS Command Line
Interface (AWS CLI).
Para obtener información sobre los precios de este y otros servicios, consulte la página Precios de
administración de dispositivos de AWS IoT.
Temas
• Administración de la indexación de objetos (p. 559)
• Administración de la indexación de grupos de objetos (p. 569)
• Consulta de datos agregados (p. 571)
• Sintaxis de la consulta (p. 575)
• Ejemplo de consultas de objetos (p. 576)
• Ejemplo de consultas de grupo de objetos (p. 578)
559
AWS IoT Guía del desarrollador
Habilitación de la indexación de objetos
{
"thingIndexingMode": "OFF"|"REGISTRY"|"REGISTRY_AND_SHADOW",
"thingConnectivityIndexingMode": "OFF"|"STATUS",
"customFields": [
{ name: <field-name>, type: String | Number | Boolean },
...
]
}
El atributo thingIndexingMode controla qué tipo de datos se indexan. Los valores válidos son:
DESACTIVAR
Sin indexación.
REGISTRY
DESACTIVAR
El atributo customFields es una lista de pares de campos y tipos de datos. Las consultas de
agregación se pueden realizar en estos campos en función del tipo de datos. El modo de indexación
que elija (REGISTRY o REGISTRY_AND_SHADOW) afecta a los campos que se pueden especificar en
customFields. Por ejemplo, si especifica el modo de indexación REGISTRY, no puede especificar un
campo de una sombra de objeto. Los campos personalizados deben especificarse en customFields para
que se puedan indexar.
Los campos administrados contienen datos asociados con objetos de IoT, grupos de objetos y sombras
de dispositivos. AWS IoT define el tipo de datos de los campos administrados. El usuario especifica
los valores de cada campo administrado cuando se crea un objeto de IoT. Por ejemplo, los nombres
de objetos, los grupos de objetos y las descripciones de objetos son todos campos administrados. El
servicio de indexación de flotas indexa los campos administrados en función del modo de indexación que
especifique:
560
AWS IoT Guía del desarrollador
Habilitación de la indexación de objetos
"managedFields" : [
{name:thingId, type:String},
{name:thingName, type:String},
{name:registry.version, type:Number},
{name:registry.thingType, type:String},
{name:registry.thingGroupNames, type:String},
]
"managedFields" : [
{name:shadow.version, type:Number},
{name:shadow.delta, type:Boolean}
]
"managedFields" : [
{name:connectivity.timestamp, type:Number},
{name:connectivity.version, type:Number},
{name:connectivity.connected, type:Boolean}
]
"managedFields" : [
{name:description, type:String},
{name:parentGroupNames, type:String},
{name:thingGroupId, type:String},
{name:thingGroupName, type:String},
{name:version, type:Number},
]
Este comando permite la indexación de datos de registro y de sombras. Las consultas de agregación
funcionan con los campos administrados y los customFields proporcionados en función del tipo de
datos.
{
"thingGroupIndexingConfiguration": {
561
AWS IoT Guía del desarrollador
Habilitación de la indexación de objetos
"thingGroupIndexingMode": "OFF"
},
"thingIndexingConfiguration": {
"thingConnectivityIndexingMode": "STATUS",
"customFields": [
{
"name": "attributes.customField_NUM",
"type": "Number"
},
{
"name": "shadow.desired.customField_STR",
"type": "String"
},
{
"name": "shadow.desired.customField_NUM",
"type": "Number"
},
{
"name": "attributes.customField_STR",
"type": "String"
},
{
"name": "attributes.customField_BOOL",
"type": "Boolean"
}
],
"thingIndexingMode": "REGISTRY_AND_SHADOW",
"managedFields": [
{
"name": "shadow.hasDelta",
"type": "Boolean"
},
{
"name": "registry.thingGroupNames",
"type": "String"
},
{
"name": "connectivity.version",
"type": "Number"
},
{
"name": "registry.thingTypeName",
"type": "String"
},
{
"name": "connectivity.connected",
"type": "Boolean"
},
{
"name": "registry.version",
"type": "Number"
},
{
"name": "thingId",
"type": "String"
},
{
"name": "connectivity.timestamp",
"type": "Number"
},
{
"name": "thingName",
"type": "String"
},
{
"name": "shadow.version",
562
AWS IoT Guía del desarrollador
Habilitación de la indexación de objetos
"type": "Number"
}
]
}
}
thingIndexingMode Resultado
thingConnectivityIndexingMode
Sintaxis corta:
563
AWS IoT Guía del desarrollador
Habilitación de la indexación de objetos
Sintaxis de JSON:
{
"thingIndexingConfiguration": {
"thingConnectivityIndexingMode": "STATUS",
"customFields": [
{
"type": "String",
"name": "attributes.color"
},
{
"type": "Number",
"name": "attributes.version"
},
{
"type": "Boolean",
"name": "shadow.desired.power"
}
],
"thingIndexingMode": "REGISTRY_AND_SHADOW",
"managedFields": [
{
"type": "Boolean",
"name": "connectivity.connected"
},
{
"type": "String",
"name": "registry.thingTypeName"
},
{
"type": "String",
"name": "thingName"
},
{
"type": "Number",
"name": "shadow.version"
},
{
"type": "String",
"name": "thingId"
},
{
"type": "Boolean",
"name": "shadow.hasDelta"
},
{
"type": "Number",
"name": "connectivity.timestamp"
},
{
"type": "String",
"name": "registry.thingGroupNames"
},
{
"type": "Number",
"name": "connectivity.version"
},
{
564
AWS IoT Guía del desarrollador
Descripción de un índice de objeto
"type": "Number",
"name": "registry.version"
}
]
},
"thingGroupIndexingConfiguration": {
"thingGroupIndexingMode": "OFF"
}
}
Después de reconstruir el índice, puede utilizar la consulta de agregación en los campos recién añadidos,
los datos de registro de búsqueda, los datos de sombras y los datos de estado de conectividad de objetos.
Al cambiar el modo de indexación, asegúrese de que todos los campos personalizados son válidos en
el nuevo modo de indexación. Por ejemplo, si utiliza el modo REGISTRY_AND_SHADOW con un campo
personalizado llamado shadow.desired.temperature, debe eliminar el campo personalizado
shadow.desired.temperature antes de cambiar el modo de indexación a REGISTRY. Si la
configuración de indexación contiene campos personalizados que no están indexados por el modo de
indexación, se producirá un error en la actualización.
La primera vez que habilite la indexación, AWS IoT crea el índice. No puede consultar el índice si
indexStatus se encuentra en estado BUILDING. El valor schema del índice de objetos indica qué tipo
de datos (REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS) se indexan.
Si se cambia la configuración del índice, el índice se vuelve a compilar. Durante este proceso,
indexStatus es REBUILDING. Puede ejecutar consultas en los datos del índice de objetos
mientras se está generando. Por ejemplo, si cambia la configuración del índice de REGISTRY a
REGISTRY_AND_SHADOW, cuando el índice se vuelve a generar, puede consultar los datos del registro,
incluidas las últimas actualizaciones. Sin embargo, no puede consultar los datos de sombra hasta que se
complete la recompilación. El tiempo que tarda en compilar o recompilar el índice depende de la cantidad
de datos.
565
AWS IoT Guía del desarrollador
Consulta de un índice de objeto
{
"things":[{
"thingName":"mything1",
"thingGroupNames":[
"mygroup1"
],
"thingId":"a4b9f759-b0f2-4857-8a4b-967745ed9f4e",
"attributes":{
"attribute1":"abc"
},
"connectivity": {
"connected":false,
"timestamp":1556649874716
}
},
{
"thingName":"mything2",
"thingTypeName":"MyThingType",
"thingGroupNames":[
"mygroup1",
"mygroup2"
],
"thingId":"01014ef9-e97e-44c6-985a-d0b06924f2af",
"attributes":{
"model":"1.2",
"country":"usa"
},
"shadow":{
"desired":{
"location":"new york",
"myvalues":[3, 4, 5]
},
"reported":{
"location":"new york",
"myvalues":[1, 2, 3],
"stats":{
"battery":78
}
},
"metadata":{
"desired":{
"location":{
"timestamp":123456789
},
"myvalues":{
"timestamp":123456789
}
},
"reported":{
"location":{
"timestamp":34535454
},
"myvalues":{
"timestamp":34535454
},
"stats":{
"battery":{
566
AWS IoT Guía del desarrollador
Restricciones y limitaciones
"timestamp":34535454
}
}
}
},
"version":10,
"timestamp":34535454
},
"connectivity": {
"connected":true,
"timestamp":1556649855046
}
}],
"nextToken":"AQFCuvk7zZ3D9pOYMbFCeHbdZ+h=G"
}
"connectivity": {
"connected":false,
"timestamp":1556649874716
}
"connectivity": {
"connected":true,
"timestamp":1556649855046
}
Las marcas temporales se indican en milisegundos desde la fecha de inicio, por lo que 1556649855046
representa 6:44:15.046 p. m. el martes 30 de abril de 2019 (GMT).
Important
Restricciones y limitaciones
Estas son las restricciones y limitaciones de AWS_Things.
Un campo de sombra se indexa solo si el valor del campo es un tipo sencillo, un objeto JSON que no
incluya una matriz o una matriz que conste completamente de tipos sencillos. Un tipo sencillo es una
cadena, un número o uno de los literales true o false. Por ejemplo, dado el siguiente estado de
sombra, el valor del campo "palette" no se indexa porque es una matriz que incluye elementos de
tipos complejos. El valor del campo "colors" sí se indexará porque cada valor de la matriz es una
cadena.
{
"state": {
"reported": {
"switched": "ON",
"colors": [ "RED", "GREEN", "BLUE" ],
"palette": [
567
AWS IoT Guía del desarrollador
Restricciones y limitaciones
{
"name": "RED",
"intensity": 124
},
{
"name": "GREEN",
"intensity": 68
},
{
"name": "BLUE",
"intensity": 201
}
]
}
}
}
Los nombres de los campos de sombra anidados se almacenan como una cadena delimitada por
punto (.). Por ejemplo, dado un documento de sombra:
{
"state": {
"desired": {
"one": {
"two": {
"three": "v2"
}
}
}
}
}
{
"state": {
"desired": {
"one.two.three": "v2"
}
}
}
Un campo en una sección de metadatos de sombra se indexa, pero solo si se indexa el campo
correspondiente en la sección "state" de la sombra. (En el ejemplo anterior, el campo "palette"
de la sección de metadatos de la sombra tampoco se indexa).
Sombras no registradas
Si utiliza UpdateThingShadow para crear una sombra mediante un nombre de objeto que no se ha
registrado en su cuenta de AWS IoT, los campos de esta sombra no se indexan.
Valores numéricos
Si el servicio reconoce como valor numérico algún dato de sombra o de registro, se indexa como tal.
Puede formar consultas que impliquen rangos y operadores de comparación en valores numéricos
(por ejemplo "attribute.foo<5" o "shadow.reported.foo:[75 TO 80]"). Para que se
568
AWS IoT Guía del desarrollador
Autorización
reconozca como numérico, el valor de los datos debe ser un literal de tipo número JSON válido (un
entero en el intervalo -2^53...2^53-1 o un punto flotante de doble precisión con notación exponencial
opcional) o parte de una matriz que solo contenga dichos valores.
Valores nulos
5
Número máximo de percentiles solicitados para consultas de agregación.
100
Autorización
Puede especificar el índice de objetos como un ARN del recurso en una acción de política de AWS IoT,
como en el siguiente ejemplo.
Acción Recurso
Note
Si tiene los permisos para consultar el índice de la flota, podrá obtener acceso a los datos de los
objetos en toda la flota.
{
"thingGroupIndexingConfiguration": {
569
AWS IoT Guía del desarrollador
Descripción de índices de grupos
"thingGroupIndexingMode": "ON"
}
}
Note
OFF
AWS IoT crea el índice cuando se habilita la indexación por primera vez. No se puede consultar el índice si
indexStatus es BUILDING.
Autorización
Puede especificar el índice de grupos de objetos como un ARN del recurso en una acción de política de
AWS IoT, como en el siguiente ejemplo.
570
AWS IoT Guía del desarrollador
Consulta de datos agregados
Acción Recurso
GetStatistics
La API GetStatistics y el comando get-statistics de la CLI devuelven el recuento, la media, la suma, el
mínimo, el máximo, la suma de los cuadrados, la varianza y la desviación estándar del campo agregado
especificado.
index-name
La consulta utilizada para buscar el índice. Puede especificar "*" para obtener el recuento de todos
los objetos indexados en su cuenta de AWS.
aggregationField
Opcional. El campo que se va a agregar. Este campo debe ser un campo administrado o
personalizado definido al llamar a update-indexing-configuration. Si no especifica un campo de
agregación, se utiliza registry.version como campo de agregación.
query-version
Este comando devuelve el número de dispositivos que contienen un atributo llamado stringAttribute:
{
"statistics": {
571
AWS IoT Guía del desarrollador
GetStatistics
"count": 3
}
}
count
La suma de los cuadrados de los valores numéricos que coinciden con la consulta.
variance
La varianza de los valores numéricos que coinciden con la consulta. La varianza de un conjunto de
valores es la media de los cuadrados de las diferencias de cada valor con respecto al valor medio del
conjunto.
stdDeviation
La desviación estándar de los valores numéricos que coinciden con la consulta. La desviación
estándar de un conjunto de valores es una medida de la distribución de los valores.
572
AWS IoT Guía del desarrollador
GetCardinality
El siguiente ejemplo muestra cómo llamar a get-statistics con un campo numérico personalizado.
{
"statistics": {
"count": 3,
"average": 33.333333333333336,
"sum": 100.0,
"minimum": -125.0,
"maximum": 150.0,
"sumOfSquares": 43750.0,
"variance": 13472.22222222222,
"stdDeviation": 116.06990230986766
}
}
Para los campos de agregación numérica, si los valores del campo superan el valor "double" máximo, los
valores de las estadísticas están vacíos
GetCardinality
La API GetCardinality y el comando get-cardinality de la CLI devuelven el recuento aproximado de
valores únicos que coinciden con la consulta. Por ejemplo, es posible que desee encontrar el número de
dispositivos con niveles de batería inferiores al 50 por ciento:
aws iot get-cardinality --index-name AWS_Things --query-string "batterylevel > 50" --aggregation-field
"shadow.reported.batterylevel".
Este comando devuelve el número de objetos con niveles de batería de más del 50 por ciento:
{
"cardinality": 100
}
get-cardinality siempre devuelve cardinality, aunque no haya campos coincidentes. Por ejemplo:
{
"cardinality": 0
}
index-name
La consulta utilizada para buscar el índice. Puede especificar "*" para obtener el recuento de todos
los objetos indexados en su cuenta de AWS.
aggregationField
573
AWS IoT Guía del desarrollador
GetPercentiles
query-version
GetPercentiles
La API GetPercentiles y el comando get-percentiles de la CLI agrupa los valores agregados que
coinciden con la consulta en grupos de percentiles. Los grupos de percentiles predeterminados son:
1,5,25,50,75,95,99, aunque puede especificar los suyos propios cuando llame a GetPercentiles.
Esta función devuelve un valor para cada grupo de percentiles especificado (o para los grupos de
percentiles predeterminados). El grupo de percentiles "1" contiene el valor agregado del campo que
se obtiene aproximadamente en el uno por ciento de los valores que coinciden con la consulta. El
grupo de percentiles "5" contiene el valor agregado del campo que se obtiene en aproximadamente el
cinco por ciento de los valores que coinciden con la consulta, y así sucesivamente. El resultado es una
aproximación: cuantos más valores coincidan con la consulta, más precisos serán los valores de percentil.
{
"percentiles": [
{
"value": 3.0,
"percent": 80.0
},
{
"value": 2.5999999999999996,
"percent": 70.0
},
{
"value": 3.0,
"percent": 90.0
},
{
"value": 2.0,
"percent": 50.0
},
{
"value": 2.0,
"percent": 60.0
},
{
"value": 1.0,
"percent": 10.0
},
{
"value": 2.0,
"percent": 40.0
},
{
"value": 1.0,
"percent": 20.0
},
{
"value": 1.4,
"percent": 30.0
},
{
"value": 3.0,
"percent": 99.0
574
AWS IoT Guía del desarrollador
Autorización
}
]
}
El siguiente comando muestra la salida devuelta get-percentiles cuando no hay documentos coincidentes.
{
"percentiles": []
}
index-name
La consulta utilizada para buscar el índice. Puede especificar "*" para obtener el recuento de todos
los objetos indexados en su cuenta de AWS.
aggregationField
Opcional. Puede utilizar este parámetro para especificar grupos de percentiles personalizados.
Autorización
Puede especificar el índice de grupos de objetos como un ARN del recurso en una acción de política de
AWS IoT, como en el siguiente ejemplo.
Acción Recurso
Sintaxis de la consulta
Las consultas se especifican mediante una sintaxis de consulta.
• Términos y frases
• Búsqueda de campos
• Búsqueda de prefijos
• Búsqueda de intervalos
575
AWS IoT Guía del desarrollador
Ejemplo de consultas de objetos
• Operadores booleanos AND, OR, NOT y –. El guion se utiliza para excluir algo de los resultados de la
búsqueda (por ejemplo, thingName:(tv* AND -plasma)).
• Agrupación
• Agrupación de campos
• Utilizar secuencias de escape con caracteres especiales (por ejemplo, con \)
• Uso de caracteres comodín al principio de la búsqueda (como "*xyz"), pero si se utiliza "*" en la
búsqueda se devolverán todos los objetos
• Expresiones regulares
• Impulso
• Clasificación
• Búsquedas confusas
• Búsqueda de proximidad
• Ordenar
• Agregación
576
AWS IoT Guía del desarrollador
Ejemplo de consultas de objetos
577
AWS IoT Guía del desarrollador
Ejemplo de consultas de grupo de objetos
578
AWS IoT Guía del desarrollador
Ejemplo de consultas de grupo de objetos
579
AWS IoT Guía del desarrollador
AWS Training and Certification
Las flotas de IoT pueden constar de un gran número de dispositivos que tienen diversas funcionalidades,
son de larga duración y están distribuidos geográficamente. Estas características hacen que la
configuración de la flota sea compleja y propensa a errores. Y dado que los dispositivos a menudo están
limitados en potencia informática, memoria y capacidades de almacenamiento, esto limita el uso del cifrado
y otras formas de seguridad en los propios dispositivos. Además, los dispositivos a menudo usan software
con vulnerabilidades conocidas. Estos factores hacen que las flotas de IoT sean un objetivo atractivo para
los piratas informáticos y dificultan la protección continuada de la flota de dispositivos.
AWS IoT Device Defender afronta estos desafíos proporcionando herramientas para identificar los
problemas de seguridad y las desviaciones de las prácticas recomendadas. AWS IoT Device Defender
puede auditar las flotas de dispositivos para asegurarse de que cumplan con las prácticas recomendadas
de seguridad y detectar un comportamiento anómalo en los dispositivos.
Auditar
Una auditoría de AWS IoT Device Defender examina la configuración y las políticas relacionadas con una
cuenta y dispositivo para garantizar que existen medidas de seguridad. Las auditorías pueden ayudarle
a detectar cualquier desviación con respecto a las prácticas recomendadas de seguridad o a las políticas
de acceso adecuadas (por ejemplo, cuando varios dispositivos usan la misma identidad o cuando existen
políticas excesivamente permisivas que permiten a un dispositivo leer y actualizar datos de muchos otros
dispositivos). Puede ejecutar auditorías según sean necesarias (auditorías bajo demanda) o programarlas
para que se ejecuten periódicamente (auditorías programadas).
Una auditoría de AWS IoT Device Defender realiza una serie de comprobaciones predefinidas
relacionadas con las prácticas recomendadas de seguridad de IoT comunes y las vulnerabilidades de
los dispositivos. Entre las comprobaciones se incluyen las políticas que conceden permiso para leer o
actualizar datos en varios dispositivos, los dispositivos que comparten una identidad (certificado X.509), o
los certificados que van a caducar o que se han revocado pero siguen activos.
580
AWS IoT Guía del desarrollador
Pasos siguientes
Critical
Las comprobaciones de auditoría no conformes con esta gravedad identifican los problemas
que requieren atención inmediata. Los problemas críticos permiten a menudo a los agentes
malintencionados obtener fácilmente acceso a sus recursos o controlarlos sin demasiada sofisticación
y sin disponer de información privilegiada o credenciales especiales.
Alta
Las comprobaciones de auditoría no conformes con esta gravedad requieren una investigación
urgente y una planificación de remediación después de que se resuelvan los problemas críticos. Al
igual que los problemas críticos, los problemas con gravedad alta suelen proporcionar los usuarios
malintencionados acceso o control de sus recursos. Sin embargo, los problemas con gravedad alta
suelen ser más difíciles de aprovechar. Es posible que requieran herramientas especiales, información
privilegiada o configuraciones específicas.
Medio
Las comprobaciones de auditoría no conformes con esta gravedad presentan problemas que
requieren atención como parte del mantenimiento continuo del estado de seguridad. Los problemas de
gravedad media pueden causar un impacto operativo negativo, como interrupciones no planificadas
debido a un mal funcionamiento de los controles de seguridad. Estos problemas también pueden
proporcionar a los usuarios malintencionados acceso o control limitado a sus recursos, o pueden
facilitar algunos pasos de sus acciones maliciosas.
Baja
Las comprobaciones de auditoría no conformes con esta gravedad suelen indicar que las prácticas
recomendadas de seguridad se descuidaron o se pasaron por alto. Aunque pueden no causar un
impacto inmediato en la seguridad, estos descuidos pueden ser aprovechados por usuarios con malas
intenciones. Al igual que los problemas de gravedad media, los problemas de gravedad baja requieren
atención como parte del mantenimiento continuo del estado de seguridad.
Pasos siguientes
Para conocer los tipos de comprobaciones de auditoría que se pueden realizar, consulte
Comprobaciones de auditoría (p. 581). Para saber cómo realizar una auditoría, consulte Cómo realizar
auditorías (p. 607). Para obtener información sobre las cuotas de servicio que se aplican a las auditorías,
consulte la sección Cuotas de servicio.
Comprobaciones de auditoría
Note
581
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
REVOKED_CA_CERT_CHECK
Se revocó un certificado de CA pero sigue activo en AWS IoT.
Gravedad: crítica
Detalles
Un certificado de CA está marcado como revocado en la lista de revocación de certificados mantenida por
la entidad emisora, pero sigue marcado como "ACTIVE" o "PENDING_TRANSFER" en AWS IoT.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un certificado de CA
no conforme:
• CERTIFICATE_REVOKED_BY_ISSUER
Cómo solucionarlo
1. Utilice UpdateCACertificate para marcar el certificado de CA como INACTIVO en AWS IoT. También
puede utilizar acciones de mitigación para:
• Aplicar la acción de mitigación UPDATE_CA_CERTIFICATE en los resultados de la auditoría para
realizar este cambio.
• Aplique la acción de mitigación PUBLISH_FINDINGS_TO_SNS para implementar una respuesta
personalizada al mensaje de Amazon SNS.
DEVICE_CERTIFICATE_SHARED_CHECK
Varias conexiones simultáneas usan el mismo certificado X.509 para autenticarse con AWS IoT.
582
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
Gravedad: crítica
Detalles
Una vez que se habilita esta comprobación, la recopilación de datos comienza de inmediato, pero los
resultados de la comprobación no están disponibles hasta pasadas al menos dos horas.
Cuando se realiza como parte de una auditoría bajo demanda, esta comprobación analiza los certificados
y los ID de cliente utilizados por los dispositivos para conectarse durante los 31 días anteriores al inicio
de la auditoría. Para las auditorías programadas, esta comprobación analiza los datos desde la última vez
que se realizó la auditoría hasta el momento en que comenzó esta instancia de la auditoría. Si ha tomado
medidas para mitigar esta condición durante el periodo de la comprobación, observe cuándo se realizaron
las conexiones simultáneas para determinar si el problema persiste.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un certificado no
conforme:
• CERTIFICATE_SHARED_BY_MULTIPLE_DEVICES
Además, los resultados devueltos con esta comprobación incluyen el ID del certificado compartido, los
ID de los clientes que usan el certificado para conectarse y los tiempos de conexión/desconexión. Se
muestran primero los resultados más recientes.
Cómo solucionarlo
Compruebe que el certificado del dispositivo no ha sufrido un ataque. Si ha sido atacado, siga las prácticas
recomendadas de seguridad para mitigar la situación.
DEVICE_CERTIFICATE_KEY_QUALITY_CHECK
Los clientes de AWS IoT suelen confiar en la autenticación mutua de TLS mediante certificados X.509
para autenticarse en el agente de mensajes de AWS IoT. Estos certificados y los certificados de la entidad
583
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
de certificación se deben registrar en la cuenta de AWS IoT para poder utilizarlos. AWS IoT realiza
comprobaciones de verificación básicas en estos certificados cuando se registran. Estas comprobaciones
incluyen:
Esta comprobación de auditoría proporciona las siguientes pruebas adicionales de la calidad de la clave
criptográfica:
AWS IoT Device Defender registra los certificados como no conformes si no superan estas
comprobaciones.
Gravedad: crítica
Detalles
Esta comprobación se aplica a los certificados de dispositivo ACTIVE o PENDING_TRANSFER.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un certificado no
conforme:
• CERTIFICATE_KEY_VULNERABILITY_CVE-2017-15361
• CERTIFICATE_KEY_VULNERABILITY_CVE-2008-0166
Cómo solucionarlo
Actualice los certificados de su dispositivo para reemplazar aquellos con vulnerabilidades conocidas.
584
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
3. Utilice UpdateCertificate para marcar el certificado antiguo como REVOCADO en AWS IoT. También
puede utilizar acciones de mitigación para:
• Aplicar la acción de mitigación UPDATE_DEVICE_CERTIFICATE en los resultados de la auditoría
para realizar este cambio.
• Aplicar la acción de mitigación ADD_THINGS_TO_THING_GROUP para añadir el dispositivo a un grupo
en el que puede tomar medidas.
• Aplicar la acción de mitigación PUBLISH_FINDINGS_TO_SNS si desea implementar una respuesta
personalizada en respuesta al mensaje de Amazon SNS.
CA_CERTIFICATE_KEY_QUALITY_CHECK
Los clientes de AWS IoT suelen confiar en la autenticación mutua de TLS mediante certificados X.509
para autenticarse en el agente de mensajes de AWS IoT. Estos certificados y los certificados de la
entidad de certificación deben registrarse en la cuenta de AWS IoT para poder utilizarlos. AWS IoT realiza
comprobaciones de verificación básicas en estos certificados cuando se registran, incluidas las siguientes:
Esta comprobación de auditoría proporciona las siguientes pruebas adicionales de la calidad de la clave
criptográfica:
AWS IoT Device Defender registra los certificados como no conformes si no superan estas
comprobaciones.
Gravedad: crítica
Detalles
Esta comprobación se aplica a los certificados de CA ACTIVE o PENDING_TRANSFER.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un certificado no
conforme:
• CERTIFICATE_KEY_VULNERABILITY_CVE-2017-15361
585
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
• CERTIFICATE_KEY_VULNERABILITY_CVE-2008-0166
Cómo solucionarlo
1. Utilice UpdateCACertificate para marcar el certificado de CA como INACTIVO en AWS IoT. También
puede utilizar acciones de mitigación para:
• Aplicar la acción de mitigación UPDATE_CA_CERTIFICATE en los resultados de la auditoría para
realizar este cambio.
• Aplicar la acción de mitigación PUBLISH_FINDINGS_TO_SNS si desea implementar una respuesta
personalizada en respuesta al mensaje de Amazon SNS.
UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK
Una política asociada a un rol de grupo de identidades de Amazon Cognito no autenticado se considera
excesivamente permisivo porque otorga permiso para realizar cualquiera de las siguientes acciones de
AWS IoT:
O bien porque otorga permiso para realizar las siguientes acciones de AWS IoT en un amplio conjunto de
dispositivos:
• Utilizar MQTT para conectar, publicar o suscribirse a temas reservados (incluidos los datos de ejecución
de sombras o de trabajos)
• Utilizar comandos de la API para leer o modificar los datos de ejecución de sombras o de trabajos
En general, los dispositivos que se conectan usando un rol de grupo de identidades de Amazon Cognito no
autenticado deben tener solo permisos limitados para publicar y suscribirse a temas de MQTT específicos
o usar los comandos de la API para leer y modificar datos específicos de objetos relacionados con los
datos de ejecución de sombras o de trabajos.
Gravedad: crítica
Detalles
Para esta comprobación, AWS IoT Device Defender audita todos los grupos de identidades de Amazon
Cognito que se han utilizado para conectarse al agente de mensajes de AWS IoT durante los últimos 31
días previos a la ejecución de la auditoría. En la auditoría se incluyen todos los grupos de identidades de
586
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
Amazon Cognito a partir de los cuales se ha conectado una identidad de Amazon Cognito autenticada o no
autenticada.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un rol de grupo de
identidades de Amazon Cognito no autenticado no conforme:
• ALLOWS_ACCESS_TO_IOT_ADMIN_ACTIONS
• ALLOWS_BROAD_ACCESS_TO_IOT_DATA_PLANE_ACTIONS
Cómo solucionarlo
Una política asociada a un rol de grupo de identidades de Amazon Cognito no autenticado debería otorgar
solo los permisos necesarios para que un dispositivo haga su trabajo. Recomendamos los siguientes
pasos:
• AddThingToThingGroup
• AttachThingPrincipal
• CreateThing
• DeleteThing
• DetachThingPrincipal
• ListThings
• ListThingsInThingGroup
• RegisterThing
587
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
• RemoveThingFromThingGroup
• UpdateThing
• UpdateThingGroupsForThing
Cualquier rol que otorgue permiso para realizar estas acciones, incluso en un solo recurso, se considera no
conforme.
• DescribeThing
• ListJobExecutionsForThing
• ListThingGroupsForThing
• ListThingPrincipals
Example
• no conforme:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DescribeThing",
"iot:ListJobExecutionsForThing",
"iot:ListThingGroupsForThing",
"iot:ListThingPrincipals"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing"
]
}
]
}
Esto permite que el dispositivo realice las acciones especificadas incluso aunque se otorgue solo para
un objeto.
588
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
de ejecución del trabajo. Una política que otorga permiso a un dispositivo para conectarse, publicar o
suscribirse a mensajes de MQTT debe restringir estas acciones a recursos específicos de la siguiente
manera:
Conectar
• no conforme:
arn:aws:iot:region:account-id:client/*
arn:aws:iot:region:account-id:client/${iot:ClientId}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Connect" ],
"Resource": [
"arn:aws:iot:region:account-id:client/${iot:Connection.Thing.ThingName}"
],
"Condition": {
"Bool": { "iot:Connection.Thing.IsAttached": "true" }
}
}
]
}
La especificación de recursos contiene una variable que coincide con el nombre del dispositivo que
se utiliza para conectarse. La instrucción de condición restringe aún más el permiso al comprobar
que el certificado utilizado por el cliente de MQTT coincida con el que está asociado al objeto con el
nombre utilizado.
Publicar
• no conforme:
arn:aws:iot:region:account-id:topic/$aws/things/*/shadow/update
Esto permite que el dispositivo actualice la sombra de cualquier dispositivo (* = todos los
dispositivos).
arn:aws:iot:region:account-id:topic/$aws/things/*
Esto permite que el dispositivo lea, actualice o elimine la sombra de cualquier dispositivo.
• conforme:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
589
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
"Action": [ "iot:Publish" ],
"Resource": [
"arn:aws:iot:region:account-id:topic/$aws/things/
${iot:Connection.Thing.ThingName}/shadow/*"
],
}
]
}
La especificación del recurso contiene un comodín, pero solo coincide con cualquier tema
relacionado con la sombra para el dispositivo cuyo nombre de objeto se utilice para conectarse.
Suscribirse
• no conforme:
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
Esto permite que el dispositivo se suscriba a temas de sombra o de trabajo reservados para todos
los dispositivos.
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
arn:aws:iot:region:account-id:topic/$aws/things/+/shadow/update
Esto permite que el dispositivo vea las actualizaciones de la sombra en cualquier dispositivo (+ =
todos los dispositivos).
• conforme:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Subscribe" ],
"Resource": [
"arn:aws:iot:region:account-id:topicfilter/$aws/things/
${iot:Connection.Thing.ThingName}/shadow/*"
"arn:aws:iot:region:account-id:topicfilter/$aws/things/
${iot:Connection.Thing.ThingName}/jobs/*"
],
}
]
}
Las especificaciones de recursos contienen caracteres comodín pero solo coinciden con cualquier
tema relacionado con la sombra y cualquier tema relacionado con el trabajo para el dispositivo cuyo
nombre de objeto se use para conectarse.
Recibir
• conforme:
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
Esto se permite porque el dispositivo solo puede recibir mensajes de temas en los que tiene permiso
para suscribirse.
590
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
• DeleteThingShadow
• GetThingShadow
• UpdateThingShadow
• DescribeJobExecution
• GetPendingJobExecutions
• StartNextPendingJobExecution
• UpdateJobExecution
Example
• no conforme:
arn:aws:iot:region:account-id:thing/*
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DeleteThingShadow",
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DescribeJobExecution",
"iot:GetPendingJobExecutions",
"iot:StartNextPendingJobExecution",
"iot:UpdateJobExecution"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing1",
"arn:aws:iot:region:account-id:/thing/MyThing2"
]
}
]
}
Esto permite que el dispositivo realice las acciones especificadas en solo dos objetos.
AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK
Una política asociada a un rol de grupo de identidades de Amazon Cognito autenticado se considera
excesivamente permisivo porque otorga permiso para realizar las siguientes acciones de AWS IoT:
591
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
O bien porque otorga permiso para realizar las siguientes acciones de AWS IoT en un amplio conjunto de
dispositivos:
En general, los dispositivos que se conectan usando un rol de grupo de identidades de Amazon Cognito
autenticado solo deben tener permisos limitados para leer datos administrativos específicos de los objetos,
publicar y suscribirse a temas de MQTT específicos o usar los comandos de la API para leer y modificar
datos específicos de los objetos relacionados con los datos de ejecución de sombras o de trabajos.
Gravedad: crítica
Detalles
Para esta comprobación, AWS IoT Device Defender audita todos los grupos de identidades de Amazon
Cognito que se han utilizado para conectarse al agente de mensajes de AWS IoT durante los últimos 31
días previos a la ejecución de la auditoría. En la auditoría se incluyen todos los grupos de identidades de
Amazon Cognito a partir de los cuales se ha conectado una identidad de Amazon Cognito autenticada o no
autenticada.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un rol de grupo de
identidades de Amazon Cognito autenticado no conforme:
• ALLOWS_BROAD_ACCESS_TO_IOT_THING_ADMIN_READ_ACTIONS
• ALLOWS_ACCESS_TO_IOT_NON_THING_ADMIN_ACTIONS
• ALLOWS_ACCESS_TO_IOT_THING_ADMIN_WRITE_ACTIONS
Cómo solucionarlo
Una política asociada a un rol de grupo de identidades de Amazon Cognito autenticado debería otorgar
solo los permisos necesarios para que un dispositivo haga su trabajo. Recomendamos los siguientes
pasos:
592
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
• AddThingToThingGroup
• AttachThingPrincipal
• CreateThing
• DeleteThing
• DetachThingPrincipal
• ListThings
• ListThingsInThingGroup
• RegisterThing
• RemoveThingFromThingGroup
• UpdateThing
• UpdateThingGroupsForThing
Cualquier rol que otorgue permiso para realizar estas acciones, incluso en un solo recurso, se considera no
conforme.
• DescribeThing
• ListJobExecutionsForThing
• ListThingGroupsForThing
• ListThingPrincipals
• no conforme:
arn:aws:iot:region:account-id:thing/*
{
"Version": "2012-10-17",
"Statement": [
593
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
{
"Effect": "Allow",
"Action": [
"iot:DescribeThing",
"iot:ListJobExecutionsForThing",
"iot:ListThingGroupsForThing",
"iot:ListThingPrincipals"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DescribeThing",
"iot:ListJobExecutionsForThing",
"iot:ListThingGroupsForThing",
"iot:ListThingPrincipals"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing*"
]
}
]
}
Esto es conforme porque, aunque el recurso se especifica con un carácter comodín (*), va precedido de
una cadena específica y esta limita el acceso al conjunto de objetos que tienen el prefijo concreto.
• no conforme:
arn:aws:iot:region:account-id:thing/*
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DescribeThing",
"iot:ListJobExecutionsForThing",
"iot:ListThingGroupsForThing",
"iot:ListThingPrincipals"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing"
]
594
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DescribeThing",
"iot:ListJobExecutionsForThing",
"iot:ListThingGroupsForThing",
"iot:ListThingPrincipals"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing*"
]
}
]
}
Esto es conforme porque, aunque el recurso se especifica con un carácter comodín (*), va precedido de
una cadena específica y esta limita el acceso al conjunto de objetos que tienen el prefijo concreto.
Conectar
• no conforme:
arn:aws:iot:region:account-id:client/*
arn:aws:iot:region:account-id:client/${iot:ClientId}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Connect" ],
"Resource": [
"arn:aws:iot:region:account-id:client/${iot:Connection.Thing.ThingName}"
595
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
],
"Condition": {
"Bool": { "iot:Connection.Thing.IsAttached": "true" }
}
}
]
}
La especificación del recurso contiene una variable que coincide con el nombre del dispositivo
utilizado para conectarse, y la instrucción de condición restringe aún más el permiso verificando que
el certificado utilizado por el cliente MQTT coincida con el que está asociado al objeto con el nombre
utilizado.
Publicar
• no conforme:
arn:aws:iot:region:account-id:topic/$aws/things/*/shadow/update
Esto permite que el dispositivo actualice la sombra de cualquier dispositivo (* = todos los
dispositivos).
arn:aws:iot:region:account-id:topic/$aws/things/*
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Publish" ],
"Resource": [
"arn:aws:iot:region:account-id:topic/$aws/things/
${iot:Connection.Thing.ThingName}/shadow/*"
],
}
]
}
La especificación del recurso contiene un comodín, pero solo coincide con cualquier tema
relacionado con la sombra para el dispositivo cuyo nombre de objeto se utilice para conectarse.
Suscribirse
• no conforme:
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
Esto permite que el dispositivo se suscriba a temas de sombra o de trabajo reservados para todos
los dispositivos.
arn:aws:iot:region:account-id:topicfilter/$aws/things/#
arn:aws:iot:region:account-id:topic/$aws/things/+/shadow/update
596
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
Esto permite que el dispositivo vea las actualizaciones de la sombra en cualquier dispositivo (+ =
todos los dispositivos).
• conforme:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Subscribe" ],
"Resource": [
"arn:aws:iot:region:account-id:topicfilter/$aws/things/
${iot:Connection.Thing.ThingName}/shadow/*"
"arn:aws:iot:region:account-id:topicfilter/$aws/things/
${iot:Connection.Thing.ThingName}/jobs/*"
],
}
]
}
Las especificaciones de recursos contienen caracteres comodín pero solo coinciden con cualquier
tema relacionado con la sombra y cualquier tema relacionado con el trabajo para el dispositivo cuyo
nombre de objeto se use para conectarse.
Recibir
• conforme:
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
Esto es conforme porque el dispositivo solo puede recibir mensajes de temas en los que tiene
permiso para suscribirse.
• DeleteThingShadow
• GetThingShadow
• UpdateThingShadow
• DescribeJobExecution
• GetPendingJobExecutions
• StartNextPendingJobExecution
• UpdateJobExecution
Ejemplos
• no conforme:
arn:aws:iot:region:account-id:thing/*
597
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DeleteThingShadow",
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DescribeJobExecution",
"iot:GetPendingJobExecutions",
"iot:StartNextPendingJobExecution",
"iot:UpdateJobExecution"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing1",
"arn:aws:iot:region:account-id:/thing/MyThing2"
]
}
]
}
Esto permite al dispositivo realizar las acciones especificadas solo en dos objetos.
IOT_POLICY_OVERLY_PERMISSIVE_CHECK
Una política de AWS IoT otorga permisos que son demasiado amplios o no están sujetos a restricciones.
Otorga permiso para enviar o recibir mensajes de MQTT para un amplio conjunto de dispositivos, u otorga
permiso para obtener acceso a los datos de ejecución de sombras y de trabajos o modificarlos para un
amplio conjunto de dispositivos.
En general, una política para un dispositivo debería otorgar acceso a recursos asociados con ese
dispositivo y sin otros dispositivos o con muy pocos. Con algunas excepciones, el uso de un carácter
comodín (por ejemplo, "*") para especificar recursos en dicha política se considera demasiado amplio o sin
restricciones.
Gravedad: crítica
Detalles
Se devuelve el siguiente código de motivo cuando esta comprobación encuentra una política de AWS IoT
no conforme:
• ALLOWS_BROAD_ACCESS_TO_IOT_DATA_PLANE_ACTIONS
Cómo solucionarlo
Siga estos pasos para corregir las políticas no conformes asociadas a objetos, grupos de objetos u otras
entidades:
598
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
1. Utilice CreatePolicyVersion para crear une nueva versión conforme de la política. Establezca la marca
setAsDefault en true. (Esto hace que esta nueva versión funcione para todas las entidades que
utilizan la política).
2. Utilice ListTargetsForPolicy para obtener una lista de destinos (certificados o grupos de objetos) a los
que la política está asociada y determinar qué dispositivos están incluidos en los grupos o cuáles utilizan
los certificados para conectarse.
3. Verifique que todos los dispositivos asociados puedan conectarse a AWS IoT. Si un dispositivo no
puede conectarse, utilice SetPolicyVersion para devolver la política predeterminada a la versión
anterior, revisar la política e intentarlo de nuevo.
Utilice las variables de política de AWS IoT (p. 155) para hacer referencia de forma dinámica a los recursos
de AWS IoT en las políticas.
Permisos de MQTT
Los mensajes MQTT se envían a través del agente de mensajes de AWS IoT y los dispositivos los usan
para realizar muchas acciones, incluido el acceso y la modificación del estado de la sombra y el estado
de ejecución del trabajo. Una política que otorga permiso a un dispositivo para conectarse, publicar o
suscribirse a mensajes de MQTT debe restringir estas acciones a recursos específicos de la siguiente
manera:
Conectar
• no conforme:
arn:aws:iot:region:account-id:client/*
arn:aws:iot:region:account-id:client/${iot:ClientId}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Connect" ],
"Resource": [
"arn:aws:iot:region:account-id:client/${iot:Connection.Thing.ThingName}"
],
"Condition": {
"Bool": { "iot:Connection.Thing.IsAttached": "true" }
599
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
}
}
]
}
La especificación de recursos contiene una variable que coincide con el nombre del dispositivo que
se utiliza para conectarse. La instrucción de condición restringe aún más el permiso al comprobar
que el certificado utilizado por el cliente de MQTT coincida con el que está asociado al objeto con el
nombre utilizado.
Publicar
• no conforme:
arn:aws:iot:region:account-id:topic/$aws/things/*/shadow/update
Esto permite que el dispositivo actualice la sombra de cualquier dispositivo (* = todos los
dispositivos).
arn:aws:iot:region:account-id:topic/$aws/things/*
Esto permite que el dispositivo lea, actualice o elimine la sombra de cualquier dispositivo.
• conforme:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Publish" ],
"Resource": [
"arn:aws:iot:region:account-id:topic/$aws/things/
${iot:Connection.Thing.ThingName}/shadow/*"
],
}
]
}
La especificación del recurso contiene un comodín, pero solo coincide con cualquier tema
relacionado con la sombra para el dispositivo cuyo nombre de objeto se utilice para conectarse.
Suscribirse
• no conforme:
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
Esto permite que el dispositivo se suscriba a temas de sombra o de trabajo reservados para todos
los dispositivos.
arn:aws:iot:region:account-id:topicfilter/$aws/things/*
arn:aws:iot:region:account-id:topic/$aws/things/+/shadow/update
Esto permite que el dispositivo vea las actualizaciones de la sombra en cualquier dispositivo (+ =
todos los dispositivos).
600
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
• conforme:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "iot:Subscribe" ],
"Resource": [
"arn:aws:iot:region:account-id:topicfilter/$aws/things/
${iot:Connection.Thing.ThingName}/shadow/*"
"arn:aws:iot:region:account-id:topicfilter/$aws/things/
${iot:Connection.Thing.ThingName}/jobs/*"
],
}
]
}
Las especificaciones de recursos contienen caracteres comodín pero solo coinciden con cualquier
tema relacionado con la sombra y cualquier tema relacionado con el trabajo para el dispositivo cuyo
nombre de objeto se use para conectarse.
Recibir
• conforme:
arn:aws:iot:region:account-id:topic/$aws/things/*
Esto es conforme porque el dispositivo solo puede recibir mensajes de temas en los que tiene
permiso para suscribirse.
• DeleteThingShadow
• GetThingShadow
• UpdateThingShadow
• DescribeJobExecution
• GetPendingJobExecutions
• StartNextPendingJobExecution
• UpdateJobExecution
Ejemplos
• no conforme:
arn:aws:iot:region:account-id:thing/*
601
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DeleteThingShadow",
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DescribeJobExecution",
"iot:GetPendingJobExecutions",
"iot:StartNextPendingJobExecution",
"iot:UpdateJobExecution"
],
"Resource": [
"arn:aws:iot:region:account-id:/thing/MyThing1",
"arn:aws:iot:region:account-id:/thing/MyThing2"
]
}
]
}
Esto permite al dispositivo realizar las acciones especificadas solo en dos objetos.
IOT_ROLE_ALIAS_OVERLY_PERMISSIVE_CHECK
El alias de rol de AWS IoT proporciona un mecanismo para que los dispositivos conectados se autentiquen
en AWS IoT mediante certificados X.509 y obtengan credenciales de AWS de corta duración de un
rol de IAM asociado a un alias de rol de AWS IoT. Los permisos para estas credenciales se deben
reducir mediante políticas de acceso con variables de contexto de autenticación. Si las políticas no están
configuradas correctamente, podría quedar expuesto a una escalada de ataque de privilegios. Esta
comprobación de auditoría garantiza que las credenciales temporales proporcionadas por los alias de rol
de AWS IoT no sean excesivamente permisivas.
• La política proporciona permisos administrativos a todos los servicios utilizados en el último año por este
alias de rol (por ejemplo, "iot:*", "dynamodb:*", "iam:*", etc.).
• La política proporciona un amplio acceso a acciones de metadatos de objetos, acceso a acciones de
AWS IoT restringidas o un amplio acceso a acciones del plano de datos de AWS IoT.
• La política proporciona acceso a servicios de auditoría de seguridad como "iam", "cloudtrail",
"guardduty", "inspector" o "trustedadvisor".
Gravedad: crítica
Detalles
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra una política de IoT
no conforme:
• ALLOWS_BROAD_ACCESS_TO_USED_SERVICES
• ALLOWS_ACCESS_TO_SECURITY_AUDITING_SERVICES
• ALLOWS_BROAD_ACCESS_TO_IOT_THING_ADMIN_READ_ACTIONS
• ALLOWS_ACCESS_TO_IOT_NON_THING_ADMIN_ACTIONS
• ALLOWS_ACCESS_TO_IOT_THING_ADMIN_WRITE_ACTIONS
• ALLOWS_BROAD_ACCESS_TO_IOT_DATA_PLANE_ACTIONS
602
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
Cómo solucionarlo
Siga estos pasos para corregir las políticas no conformes asociadas a objetos, grupos de objetos u otras
entidades:
1. Siga los pasos descritos en Autorización de llamadas directas a los servicios de AWS (p. 181) para
aplicar una política más restrictiva al alias de rol.
IOT_ROLE_ALIAS_ALLOWS_ACCESS_TO_UNUSED_SERVICES_CHEC
El alias de rol de AWS IoT proporciona un mecanismo para que los dispositivos conectados se autentiquen
en AWS IoT mediante certificados X.509 y obtengan credenciales de AWS de corta duración de un
rol de IAM asociado a un alias de rol de AWS IoT. Los permisos para estas credenciales se deben
reducir mediante políticas de acceso con variables de contexto de autenticación. Si las políticas no están
configuradas correctamente, podría quedar expuesto a una escalada de ataque de privilegios. Esta
comprobación de auditoría garantiza que las credenciales temporales proporcionadas por los alias de rol
de AWS IoT no sean excesivamente permisivas.
Esta comprobación se activa si el alias de rol tiene acceso a servicios que no se han utilizado para
el dispositivo de AWS IoT en el último año. Por ejemplo, la auditoría le informa si tiene un rol de IAM
vinculado al alias de rol que solo ha utilizado AWS IoT en el último año, pero la política asociada al rol
también concede permiso a "iam:getRole" y "dynamodb:PutItem".
Gravedad: media
Detalles
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra una política de AWS
IoT no conforme:
• ALLOWS_ACCESS_TO_UNUSED_SERVICES
Cómo solucionarlo
Siga estos pasos para corregir las políticas no conformes asociadas a objetos, grupos de objetos u otras
entidades:
1. Siga los pasos descritos en Autorización de llamadas directas a los servicios de AWS (p. 181) para
aplicar una política más restrictiva al alias de rol.
603
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
CA_CERT_APPROACHING_EXPIRATION_CHECK
Un certificado de CA va a caducar dentro de 30 días o ha caducado.
Gravedad: media
Detalles
Esta comprobación se aplica a los certificados de CA ACTIVE o PENDING_TRANSFER.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra un certificado de CA
no conforme:
• CERTIFICATE_APPROACHING_EXPIRATION
• CERTIFICATE_PAST_EXPIRATION
Cómo solucionarlo
Consulte las prácticas recomendadas de seguridad para saber cómo proceder. Es posible que desee:
CONFLICTING_CLIENT_IDS_CHECK
Varios dispositivos se conectan con el mismo ID de cliente.
Gravedad: alta
Detalles
Se han realizado varias conexiones con el mismo ID de cliente, lo que ha provocado la desconexión de un
dispositivo ya conectado. La especificación de MQTT solo permite una conexión activa por ID de cliente,
con lo cual, cuando otro dispositivo se conecta con el mismo ID de cliente, se bloquea la conexión del
dispositivo anterior.
604
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
Cuando se realiza como parte de una auditoría bajo demanda, esta comprobación analiza cómo se usaban
los ID de cliente utilizados por los dispositivos para conectarse durante los 31 días anteriores al inicio de
la auditoría. Para las auditorías programadas, esta comprobación analiza los datos desde la última vez
que se realizó la auditoría hasta el momento en que comenzó esta instancia de la auditoría. Si ha tomado
medidas para mitigar esta condición durante el periodo de la comprobación, observe cuándo se realizaron
las conexiones/desconexiones para determinar si el problema persiste.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra una falta de
conformidad:
• DUPLICATE_CLIENT_ID_ACROSS_CONNECTIONS
Además, los resultados devueltos con esta comprobación incluyen el ID de cliente utilizado para
conectarse, los identificadores de las entidades principales y los tiempos de desconexión. Se muestran
primero los resultados más recientes.
Esto puede indicar que un dispositivo o las credenciales de un dispositivo se han puesto en riesgo y
podrían ser parte de un ataque DDoS. También es posible que los dispositivos estén mal configurados
en la cuenta o que el dispositivo tenga una mala conexión y se vea obligado a volver a conectarse varias
veces por minuto.
Cómo solucionarlo
Registre cada dispositivo como un objeto único en AWS IoT y use el nombre de objeto como ID de cliente
para la conexión. O use un UUID como ID de cliente al conectar el dispositivo a través de MQTT. También
puede utilizar acciones de mitigación para:
DEVICE_CERT_APPROACHING_EXPIRATION_CHECK
Un certificado de dispositivo va a caducar dentro de 30 días o ha caducado.
Gravedad: media
Detalles
Esta comprobación se aplica a los certificados de dispositivo ACTIVE o PENDING_TRANSFER.
• CERTIFICATE_APPROACHING_EXPIRATION
• CERTIFICATE_PAST_EXPIRATION
605
AWS IoT Guía del desarrollador
Comprobaciones de auditoría
Cómo solucionarlo
Consulte las prácticas recomendadas de seguridad para saber cómo proceder. Es posible que desee:
REVOKED_DEVICE_CERT_CHECK
Un certificado del dispositivo revocado sigue activo.
Gravedad: media
Detalles
Un certificado de dispositivo no está en la lista de revocación de certificados de CA, pero sigue activo en
AWS IoT.
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra una falta de
conformidad:
• CERTIFICATE_REVOKED_BY_ISSUER
Cómo solucionarlo
Compruebe que el certificado del dispositivo no ha sufrido un ataque. Si ha sido atacado, siga las prácticas
recomendadas de seguridad para mitigar la situación. Es posible que desee:
606
AWS IoT Guía del desarrollador
Cómo realizar auditorías
LOGGING_DISABLED_CHECK
Los registros de AWS IoT no están habilitados en Amazon CloudWatch.
Gravedad: baja
Detalles
Se devuelven los siguientes códigos de motivo cuando esta comprobación encuentra una falta de
conformidad:
• LOGGING_DISABLED
Cómo solucionarlo
Habilite los registros de AWS IoT en CloudWatch. Consulte Herramientas de monitoreo (p. 213). También
puede utilizar acciones de mitigación para:
Para algunas comprobaciones, AWS IoT empieza a recopilar datos en cuanto la comprobación está
habilitada.
2. Cree uno o más calendarios de auditoría. Utilice CreateScheduledAudit (p. 619) para especificar las
comprobaciones que desea realizar durante una auditoría y con qué frecuencia deben ejecutarse.
O bien, puede ejecutar una auditoría bajo demanda cuando sea necesario. Utilice
StartOnDemandAuditTask (p. 627) para especificar las comprobaciones que desea realizar y
comenzar una auditoría de inmediato. (Es posible que los resultados no estén listos por algún tiempo
si ha habilitado recientemente una comprobación que se incluye en la auditoría bajo demanda).
3. Puede usar la consola de AWS IoT para ver los resultados de las auditorías.
607
AWS IoT Guía del desarrollador
Cómo realizar auditorías
También puede ver los resultados de las auditorías con ListAuditFindings (p. 635). Con este
comando, puede filtrar los resultados por el tipo de verificación, por el recurso específico o por la hora
de la auditoría. Puede utilizar esta información para mitigar cualquier problema que se encuentre.
4. Puede aplicar las acciones de mitigación que definió en su cuenta de AWS para los resultados
no conformes con las reglas. Para obtener más información, consulte Aplicación de acciones de
mitigación (p. 647).
Notificaciones
Cuando se completa una auditoría, se puede enviar una notificación de SNS con un resumen de los
resultados de cada comprobación de auditoría realizada, incluida la información sobre el número de
recursos no conformes encontrados. Utilice el campo auditNotificationTargetConfigurations
en la entrada al comando UpdateAccountAuditConfiguration (p. 614). La notificación de SNS tiene la
siguiente carga:
Ejemplo de carga
{
"accountId": "123456789012",
"taskId": "4e2bcd1ccbc2a5dd15292a82ab80c380",
"taskStatus": "FAILED|CANCELED|COMPLETED",
"taskType": "ON_DEMAND_AUDIT_TASK|SCHEDULED_AUDIT_TASK",
"scheduledAuditName": "myWeeklyAudit",
"failedChecksCount": 0,
"canceledChecksCount": 0,
"nonCompliantChecksCount": 1,
"compliantChecksCount": 0,
"totalChecksCount": 1,
"taskStartTime": 1524740766191,
"auditDetails": [
{
"checkName": "DEVICE_CERT_APPROACHING_EXPIRATION_CHECK |
REVOKED_DEVICE_CERT_CHECK |
CA_CERT_APPROACHING_EXPIRATION_CHECK |
REVOKED_CA_CERT_CHECK |
DEVICE_CERTIFICATE_SHARED_CHECK |
IOT_POLICY_UNRESTRICTED_CHECK |
UNAUTHENTICATED_COGNITO_IDENTITY_UNRESTRICTED_ACCESS_CHECK |
AUTHENTICATED_COGNITO_IDENTITY_UNRESTRICTED_ACCESS_CHECK |
CONFLICTING_CLIENT_IDS_CHECK |
LOGGING_DISABLED_CHECK",
"checkRunStatus": "FAILED |
CANCELED |
COMPLETED_COMPLIANT |
COMPLETED_NON_COMPLIANT",
"nonCompliantResourcesCount": 1,
"totalResourcesCount": 1,
608
AWS IoT Guía del desarrollador
Cómo realizar auditorías
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "arn:aws:iot:::schema:auditnotification/1.0",
"type": "object",
"properties": {
"accountId": {
"type": "string"
},
"taskId": {
"type": "string"
},
"taskStatus": {
"type": "string",
"enum": [
"FAILED",
"CANCELED",
"COMPLETED"
]
},
"taskType": {
"type": "string",
"enum": [
"SCHEDULED_AUDIT_TASK",
"ON_DEMAND_AUDIT_TASK"
]
},
"scheduledAuditName": {
"type": "string"
},
"failedChecksCount": {
"type": "integer"
},
"canceledChecksCount": {
"type": "integer"
},
"nonCompliantChecksCount": {
"type": "integer"
},
"compliantChecksCount": {
"type": "integer"
},
"totalChecksCount": {
"type": "integer"
},
"taskStartTime": {
"type": "integer"
},
"auditDetails": {
"type": "array",
"items": [
{
"type": "object",
"properties": {
"checkName": {
"type": "string",
"enum": [
"DEVICE_CERT_APPROACHING_EXPIRATION_CHECK",
"REVOKED_DEVICE_CERT_CHECK",
"CA_CERT_APPROACHING_EXPIRATION_CHECK",
"REVOKED_CA_CERT_CHECK",
"LOGGING_DISABLED_CHECK"
]
},
"checkRunStatus": {
"type": "string",
"enum": [
"FAILED",
609
AWS IoT Guía del desarrollador
Cómo realizar auditorías
"CANCELED",
"COMPLETED_COMPLIANT",
"COMPLETED_NON_COMPLIANT"
]
},
"nonCompliantResourcesCount": {
"type": "integer"
},
"totalResourcesCount": {
"type": "integer"
},
"message": {
"type": "string",
},
"errorCode": {
"type": "string",
"enum": [
"INSUFFICIENT_PERMISSIONS",
"AUDIT_CHECK_DISABLED"
]
}
},
"required": [
"checkName",
"checkRunStatus",
"nonCompliantResourcesCount",
"totalResourcesCount"
]
}
]
}
},
"required": [
"accountId",
"taskId",
"taskStatus",
"taskType",
"failedChecksCount",
"canceledChecksCount",
"nonCompliantChecksCount",
"compliantChecksCount",
"totalChecksCount",
"taskStartTime",
"auditDetails"
]
}
También puede ver las notificaciones en la consola de AWS IoT, junto con información sobre el dispositivo,
las estadísticas del dispositivo (por ejemplo, la hora de la última conexión, el número de conexiones
activas, la velocidad de transferencia de datos) y las alertas históricas del dispositivo.
Permisos
Esta sección contiene información sobre cómo configurar los roles y políticas de IAM necesarios para
crear, ejecutar y administrar las auditorías de AWS IoT Device Defender. Para obtener más información,
consulte la Guía del usuario de &AWS; Identity and Access Management.
Para poder ejecutar una auditoría, conceda a AWS IoT Device Defender permiso
para recopilar datos
Cuando llame a UpdateAccountAuditConfiguration (p. 614) debe especificar un rol de IAM con dos
políticas: una política de permisos y una política de confianza. Cuando se ejecuta una auditoría, la política
610
AWS IoT Guía del desarrollador
Cómo realizar auditorías
de permisos concede permiso a AWS IoT Device Defender para obtener acceso a los datos de su cuenta,
utilizando las API de AWS IoT. La política de confianza otorga permiso a AWS IoT Device Defender para
asumir el rol requerido.
Política de permisos
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:GetLoggingOptions",
"iot:GetV2LoggingOptions",
"iot:ListCACertificates",
"iot:ListCertificates",
"iot:DescribeCACertificate",
"iot:DescribeCertificate",
"iot:ListPolicies",
"iot:GetPolicy",
"iot:GetEffectivePolicies",
"iot:ListRoleAliases",
"iot:DescribeRoleAlias",
"cognito-identity:GetIdentityPoolRoles",
"iam:ListRolePolicies",
"iam:ListAttachedRolePolicies",
"iam:GetRole",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:GetRolePolicy",
"iam:GenerateServiceLastAccessedDetails",
"iam:GetServiceLastAccessedDetails"
],
"Resource":[
"*"
]
}
]
}
Política de confianza
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
611
AWS IoT Guía del desarrollador
Cómo realizar auditorías
de permisos y una política de confianza. La política de permisos concede permiso a AWS IoT Device
Defender para publicar notificaciones en su tema de SNS. La política de confianza otorga permiso a AWS
IoT Device Defender para asumir el rol requerido.
Política de permisos
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"sns:Publish"
],
"Resource":[
"arn:aws:sns:region:account-id:your-topic-name"
]
}
]
}
Política de confianza
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
• UpdateAccountAuditConfiguration
Auto Scaling
Debe crear el rol de IAM con la política asociada en la misma cuenta desde la que se ejecuta este
comando. No se permite el acceso entre cuentas. La política debe tener permisos iam:PassRole
(permisos para pasar este rol).
En la siguiente plantilla de política audit-permissions-role-arn es el ARN del rol que pasa a AWS
IoT Device Defender en la solicitud UpdateAccountAuditConfiguration utilizando el parámetro
roleArn. audit-notifications-permissions-role-arn es el ARN del rol que pasa a AWS
IoT Device Defender en la solicitud UpdateAccountAuditConfiguration utilizando el parámetro
auditNotificationTargetConfigurations.
612
AWS IoT Guía del desarrollador
Cómo realizar auditorías
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:UpdateAccountAuditConfiguration"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::account-id:role/audit-permissions-role-arn",
"arn:aws:iam::account-id:role/audit-notifications-permissions-role-arn"
]
}
]
}
• DescribeAccountAuditConfiguration
• DeleteAccountAuditConfiguration
• StartOnDemandAuditTask
• CancelAuditTask
• DescribeAuditTask
• ListAuditTasks
• ListScheduledAudits
• ListAuditFindings
Auto Scaling
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DescribeAccountAuditConfiguration",
"iot:DeleteAccountAuditConfiguration",
"iot:StartOnDemandAuditTask",
"iot:CancelAuditTask",
"iot:DescribeAuditTask",
"iot:ListAuditTasks",
"iot:ListScheduledAudits",
"iot:ListAuditFindings"
],
"Resource": [
"*"
]
}
]
}
613
AWS IoT Guía del desarrollador
Comandos de auditoría
• CreateScheduledAudit
• UpdateScheduledAudit
• DeleteScheduledAudit
• DescribeScheduledAudit
Auto Scaling
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:CreateScheduledAudit",
"iot:UpdateScheduledAudit",
"iot:DeleteScheduledAudit",
"iot:DescribeScheduledAudit"
],
"Resource": [
"arn:aws:iot:region:account-id:scheduledaudit/scheduled-audit-name"
]
}
]
}
El formato del ARN de un rol de auditoría programada de AWS IoT Device Defender es:
arn:aws:iot:region:account-id:scheduledaudit/scheduled-audit-name
Comandos de auditoría
Administrar la configuración de auditorías
Utilice UpdateAccountAuditConfiguration para configurar los ajustes de auditoría de su cuenta Este
comando le permite habilitar las comprobaciones que desea que estén disponibles para las auditorías,
configurar notificaciones opcionales y configurar permisos.
UpdateAccountAuditConfiguration
Configura o reconfigura los ajustes de auditoría de Device Defender para esta cuenta. La configuración
incluye cómo se envían las notificaciones de auditoría y qué comprobaciones de auditoría se habilitan o
deshabilitan.
Sinopsis
614
AWS IoT Guía del desarrollador
Administrar la configuración de auditorías
[--audit-check-configurations <value>] \
[--cli-input-json <value>] \
[--generate-cli-skeleton]
Formato cli-input-json
{
"roleArn": "string",
"auditNotificationTargetConfigurations": {
"string": {
"targetArn": "string",
"roleArn": "string",
"enabled": "boolean"
}
},
"auditCheckConfigurations": {
"string": {
"enabled": "boolean"
}
}
}
Campos cli-input-json
auditNotificationTargetConfigurations
map Información sobre los destinos
a los que se envían las
notificaciones de auditoría.
615
AWS IoT Guía del desarrollador
Administrar la configuración de auditorías
En la primera llamada a
UpdateAccountAuditConfiguration
se necesita este parámetro y
debe especificar al menos una
comprobación habilitada.
Salida
Ninguna
Errores
InvalidRequestException
DescribeAccountAuditConfiguration
Obtiene información sobre la configuración de auditoría de Device Defender para esta cuenta. La
configuración incluye cómo se envían las notificaciones de auditoría y qué comprobaciones de auditoría se
habilitan o deshabilitan.
Sinopsis
Formato cli-input-json
616
AWS IoT Guía del desarrollador
Administrar la configuración de auditorías
{
}
Salida
{
"roleArn": "string",
"auditNotificationTargetConfigurations": {
"string": {
"targetArn": "string",
"roleArn": "string",
"enabled": "boolean"
}
},
"auditCheckConfigurations": {
"string": {
"enabled": "boolean"
}
}
}
En la primera llamada a
UpdateAccountAuditConfiguration,
se necesita este parámetro.
auditNotificationTargetConfigurations
map Información sobre los destinos
a los que se envían las
notificaciones de auditoría para
esta cuenta.
617
AWS IoT Guía del desarrollador
Administrar la configuración de auditorías
Errores
ThrottlingException
DeleteAccountAuditConfiguration
Restaura la configuración predeterminada para las auditorías de Device Defender para esta cuenta. Se
eliminarán todos los datos de configuración que haya introducido y todas las comprobaciones de auditoría
se restablecerán como deshabilitadas.
Sinopsis
Formato cli-input-json
{
"deleteScheduledAudits": "boolean"
}
Campos cli-input-json
Salida
Ninguna
Errores
InvalidRequestException
618
AWS IoT Guía del desarrollador
Programación de auditorías
Programación de auditorías
Utilice CreateScheduledAudit para crear una o varias auditorías programadas. Este comando permite
especificar las comprobaciones que desea realizar durante una auditoría y con qué frecuencia deben
ejecutarse.
CreateScheduledAudit
Crea una auditoría programada que se ejecuta en un intervalo de tiempo específico.
Sinopsis
Formato cli-input-json
{
"frequency": "string",
"dayOfMonth": "string",
"dayOfWeek": "string",
"targetCheckNames": [
"string"
],
"tags": [
{
"Key": "string",
"Value": "string"
}
],
"scheduledAuditName": "string"
}
Campos cli-input-json
619
AWS IoT Guía del desarrollador
Programación de auditorías
Patrón: [a-zA-Z0-9_-]+
Salida
{
"scheduledAuditArn": "string"
}
620
AWS IoT Guía del desarrollador
Programación de auditorías
Errores
InvalidRequestException
Se ha superado un límite.
ListScheduledAudits
Muestra una lista de las auditorías programadas.
Sinopsis
Formato cli-input-json
{
"nextToken": "string",
"maxResults": "integer"
}
Campos cli-input-json
Salida
621
AWS IoT Guía del desarrollador
Programación de auditorías
"scheduledAudits": [
{
"scheduledAuditName": "string",
"scheduledAuditArn": "string",
"frequency": "string",
"dayOfMonth": "string",
"dayOfWeek": "string"
}
],
"nextToken": "string"
}
Patrón: [a-zA-Z0-9_-]+
Errores
622
AWS IoT Guía del desarrollador
Programación de auditorías
InvalidRequestException
DescribeScheduledAudit
Obtiene información acerca de la auditoría programada.
Sinopsis
Formato cli-input-json
{
"scheduledAuditName": "string"
}
Campos cli-input-json
Patrón: [a-zA-Z0-9_-]+
Salida
{
"frequency": "string",
"dayOfMonth": "string",
"dayOfWeek": "string",
"targetCheckNames": [
"string"
],
"scheduledAuditName": "string",
"scheduledAuditArn": "string"
}
623
AWS IoT Guía del desarrollador
Programación de auditorías
Patrón: [a-zA-Z0-9_-]+
Errores
InvalidRequestException
624
AWS IoT Guía del desarrollador
Programación de auditorías
InternalFailureException
UpdateScheduledAudit
Actualiza una auditoría programada, que incluye las comprobaciones que se realizan y con qué frecuencia
se lleva a cabo la auditoría.
Sinopsis
Formato cli-input-json
{
"frequency": "string",
"dayOfMonth": "string",
"dayOfWeek": "string",
"targetCheckNames": [
"string"
],
"scheduledAuditName": "string"
}
Campos cli-input-json
625
AWS IoT Guía del desarrollador
Programación de auditorías
Patrón: [a-zA-Z0-9_-]+
Salida
{
"scheduledAuditArn": "string"
}
Errores
InvalidRequestException
626
AWS IoT Guía del desarrollador
Ejecutar una auditoría bajo demanda
DeleteScheduledAudit
Elimina una auditoría programada.
Sinopsis
Formato cli-input-json
{
"scheduledAuditName": "string"
}
Campos cli-input-json
Patrón: [a-zA-Z0-9_-]+
Salida
Ninguna
Errores
InvalidRequestException
StartOnDemandAuditTask
Comienza una auditoría de Device Defender bajo demanda.
Sinopsis
627
AWS IoT Guía del desarrollador
Ejecutar una auditoría bajo demanda
Formato cli-input-json
{
"targetCheckNames": [
"string"
]
}
Campos cli-input-json
Salida
{
"taskId": "string"
}
Patrón: [a-zA-Z0-9-]+
Errores
InvalidRequestException
628
AWS IoT Guía del desarrollador
Administrar instancias de auditoría
InternalFailureException
Se ha superado un límite.
Utilice ListAuditTasks para buscar las auditorías que se ejecutaron durante un intervalo de tiempo
específico.
DescribeAuditTask
Obtiene información sobre una auditoría de Device Defender.
Sinopsis
Formato cli-input-json
{
"taskId": "string"
}
Campos cli-input-json
Nombre Tipo Descripción
Patrón: [a-zA-Z0-9-]+
Salida
{
"taskStatus": "string",
"taskType": "string",
"taskStartTime": "timestamp",
"taskStatistics": {
"totalChecks": "integer",
"inProgressChecks": "integer",
"waitingForDataCollectionChecks": "integer",
"compliantChecks": "integer",
"nonCompliantChecks": "integer",
629
AWS IoT Guía del desarrollador
Administrar instancias de auditoría
"failedChecks": "integer",
"canceledChecks": "integer"
},
"scheduledAuditName": "string",
"auditDetails": {
"string": {
"checkRunStatus": "string",
"checkCompliant": "boolean",
"totalResourcesCount": "long",
"nonCompliantResourcesCount": "long",
"errorCode": "string",
"message": "string"
}
}
}
enum: IN_PROGRESS |
COMPLETED | FAILED |
CANCELED
enum:
ON_DEMAND_AUDIT_TASK |
SCHEDULED_AUDIT_TASK
630
AWS IoT Guía del desarrollador
Administrar instancias de auditoría
Patrón: [a-zA-Z0-9_-]+
enum: IN_PROGRESS |
WAITING_FOR_DATA_COLLECTION
| CANCELED |
COMPLETED_COMPLIANT |
COMPLETED_NON_COMPLIANT
| FAILED
Errores
631
AWS IoT Guía del desarrollador
Administrar instancias de auditoría
InvalidRequestException
ListAuditTasks
Enumera las auditorías de Device Defender que se han realizado durante un periodo de tiempo
determinado.
Sinopsis
Formato cli-input-json
{
"startTime": "timestamp",
"endTime": "timestamp",
"taskType": "string",
"taskStatus": "string",
"nextToken": "string",
"maxResults": "integer"
}
Campos cli-input-json
632
AWS IoT Guía del desarrollador
Administrar instancias de auditoría
enum:
ON_DEMAND_AUDIT_TASK |
SCHEDULED_AUDIT_TASK
enum: IN_PROGRESS |
COMPLETED | FAILED |
CANCELED
Salida
{
"tasks": [
{
"taskId": "string",
"taskStatus": "string",
"taskType": "string"
}
],
"nextToken": "string"
}
Patrón: [a-zA-Z0-9-]+
633
AWS IoT Guía del desarrollador
Administrar instancias de auditoría
enum: IN_PROGRESS |
COMPLETED | FAILED |
CANCELED
enum:
ON_DEMAND_AUDIT_TASK |
SCHEDULED_AUDIT_TASK
Errores
InvalidRequestException
CancelAuditTask
Cancela una auditoría que está en curso. La auditoría puede ser programada o bajo demanda. Si la
auditoría no está en curso, se produce la excepción InvalidRequestException.
Sinopsis
Formato cli-input-json
{
"taskId": "string"
}
634
AWS IoT Guía del desarrollador
Comprobar resultados de auditoría
Campos cli-input-json
Salida
Ninguna
Errores
ResourceNotFoundException
Puede definir acciones de mitigación y aplicarlas a los resultados de su auditoría. Para obtener más
información, consulte Acciones de mitigación (p. 641).
ListAuditFindings
Enumera los hallazgos (resultados) de una auditoría de Device Defender o de las auditorías realizadas
durante un periodo de tiempo especificado. (Los hallazgos se conservan durante 180 días).
Sinopsis
635
AWS IoT Guía del desarrollador
Comprobar resultados de auditoría
Formato cli-input-json
{
"taskId": "string",
"checkName": "string",
"resourceIdentifier": {
"deviceCertificateId": "string",
"caCertificateId": "string",
"cognitoIdentityPoolId": "string",
"clientId": "string",
"policyVersionIdentifier": {
"policyName": "string",
"policyVersionId": "string"
},
"roleAliasArn": "string",
"account": "string"
},
"maxResults": "integer",
"nextToken": "string",
"startTime": "timestamp",
"endTime": "timestamp"
}
Campos cli-input-json
Patrón: (0x)?[a-fA-F0-9]+
Patrón: (0x)?[a-fA-F0-9]+
636
AWS IoT Guía del desarrollador
Comprobar resultados de auditoría
patrón: [w+=,.@-]+
Patrón: [0-9]+
Salida
{
"findings": [
{
"taskId": "string",
"checkName": "string",
"taskStartTime": "timestamp",
"findingTime": "timestamp",
"severity": "string",
"nonCompliantResource": {
"resourceType": "string",
"resourceIdentifier": {
"deviceCertificateId": "string",
"caCertificateId": "string",
637
AWS IoT Guía del desarrollador
Comprobar resultados de auditoría
"cognitoIdentityPoolId": "string",
"clientId": "string",
"policyVersionIdentifier": {
"policyName": "string",
"policyVersionId": "string"
},
"account": "string"
},
"additionalInfo": {
"string": "string"
}
},
"relatedResources": [
{
"resourceType": "string",
"resourceIdentifier": {
"deviceCertificateId": "string",
"caCertificateId": "string",
"cognitoIdentityPoolId": "string",
"clientId": "string",
"iamRoleArn": "string",
"policyVersionIdentifier": {
"policyName": "string",
"policyVersionId": "string"
},
"account": "string"
},
"roleAliasArn": "string",
"additionalInfo": {
"string": "string"
}
}
],
"reasonForNonCompliance": "string",
"reasonForNonComplianceCode": "string"
}
],
"nextToken": "string"
}
Patrón: [a-zA-Z0-9-]+
638
AWS IoT Guía del desarrollador
Comprobar resultados de auditoría
enum: DEVICE_CERTIFICATE
| CA_CERTIFICATE
| IOT_POLICY |
COGNITO_IDENTITY_POOL
| CLIENT_ID |
ACCOUNT_SETTINGS
Patrón: (0x)?[a-fA-F0-9]+
Patrón: (0x)?[a-fA-F0-9]+
patrón: [w+=,.@-]+
639
AWS IoT Guía del desarrollador
Comprobar resultados de auditoría
Patrón: [0-9]+
miembro: RelatedResource
enum: DEVICE_CERTIFICATE
| CA_CERTIFICATE
| IOT_POLICY |
COGNITO_IDENTITY_POOL
| CLIENT_ID |
ACCOUNT_SETTINGS
Patrón: (0x)?[a-fA-F0-9]+
Patrón: (0x)?[a-fA-F0-9]+
patrón: [w+=,.@-]+
640
AWS IoT Guía del desarrollador
Acciones de mitigación
Patrón: [0-9]+
Errores
InvalidRequestException
Acciones de mitigación
Puede utilizar AWS IoT Device Defender para emprender acciones para mitigar los problemas que se
encontraron durante una auditoría. AWS IoT Device Defender proporciona acciones predefinidas para
las diferentes comprobaciones de auditoría. Puede configurar esas acciones para su cuenta de AWS y, a
continuación, aplicarlas a un conjunto de resultados. Estos resultados puede ser:
• Todos los resultados de una auditoría. Esta opción está disponible en la consola de AWS IoT y a través
de la AWS CLI.
• Una lista de resultados individuales. Esta opción solo está disponible a través de la AWS CLI
• Un conjunto filtrado de los resultados de una auditoría.
En la siguiente tabla se muestran los tipos de las comprobaciones de auditoría y las acciones de mitigación
compatibles para cada una de ellas:
641
AWS IoT Guía del desarrollador
Acciones de mitigación
REVOKED_CA_CERT_CHECK PUBLISH_FINDING_TO_SNS,
UPDATE_CA_CERTIFICATE
DEVICE_CERTIFICATE_SHARED_CHECK PUBLISH_FINDING_TO_SNS,
UPDATE_DEVICE_CERTIFICATE,
ADD_THINGS_TO_THING_GROUP
UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK
PUBLISH_FINDING_TO_SNS
AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK
PUBLISH_FINDING_TO_SNS
IOT_POLICY_OVERLY_PERMISSIVE_CHECK PUBLISH_FINDING_TO_SNS,
REPLACE_DEFAULT_POLICY_VERSION
CA_CERT_APPROACHING_EXPIRATION_CHECK PUBLISH_FINDING_TO_SNS,
UPDATE_CA_CERTIFICATE
CONFLICTING_CLIENT_IDS_CHECK PUBLISH_FINDING_TO_SNS
DEVICE_CERT_APPROACHING_EXPIRATION_CHECK
PUBLISH_FINDING_TO_SNS,
UPDATE_DEVICE_CERTIFICATE,
ADD_THINGS_TO_THING_GROUP
REVOKED_DEVICE_CERT_CHECK PUBLISH_FINDING_TO_SNS,
UPDATE_DEVICE_CERTIFICATE,
ADD_THINGS_TO_THING_GROUP
LOGGING_DISABLED_CHECK PUBLISH_FINDING_TO_SNS,
ENABLE_IOT_LOGGING
DEVICE_CERTIFICATE_KEY_QUALITY_CHECK PUBLISH_FINDING_TO_SNS,
UPDATE_DEVICE_CERTIFICATE,
ADD_THINGS_TO_THING_GROUP
CA_CERTIFICATE_KEY_QUALITY_CHECK PUBLISH_FINDING_TO_SNS,
UPDATE_CA_CERTIFICATE
IOT_ROLE_ALIAS_OVERLY_PERMISSIVE_CHECK PUBLISH_FINDING_TO_SNS
IOT_ROLE_ALIAS_ALLOWS_ACCESS_TO_UNUSED_SERVICES_CHECK
PUBLISH_FINDING_TO_SNS
REVOKED_CA_CERT_CHECK
• Cambiar el estado del certificado para marcarlo como inactivo en AWS IoT.
DEVICE_CERTIFICATE_SHARED_CHECK
• Cambiar el estado del certificado del dispositivo para marcarlo como inactivo en AWS IoT.
• Añadir dispositivos que utilizan dicho certificado a un grupo de objetos.
UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK
• No se admiten otras acciones.
642
AWS IoT Guía del desarrollador
Acciones de mitigación
AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK
• No se admiten otras acciones.
IOT_POLICY_OVERLY_PERMISSIVE_CHECK
• Añadir una versión de política de AWS IoT en blanco para restringir los permisos.
CA_CERT_APPROACHING_EXPIRATION_CHECK
• Cambiar el estado del certificado para marcarlo como inactivo en AWS IoT.
CONFLICTING_CLIENT_IDS_CHECK
• No se admiten otras acciones.
DEVICE_CERT_APPROACHING_EXPIRATION_CHECK
• Cambiar el estado del certificado del dispositivo para marcarlo como inactivo en AWS IoT.
• Añadir dispositivos que utilizan dicho certificado a un grupo de objetos.
DEVICE_CERTIFICATE_KEY_QUALITY_CHECK
• Cambiar el estado del certificado del dispositivo para marcarlo como inactivo en AWS IoT.
• Añadir dispositivos que utilizan dicho certificado a un grupo de objetos.
CA_CERTIFICATE_KEY_QUALITY_CHECK
• Cambiar el estado del certificado para marcarlo como inactivo en AWS IoT.
REVOKED_DEVICE_CERT_CHECK
• Cambiar el estado del certificado del dispositivo para marcarlo como inactivo en AWS IoT.
• Añadir dispositivos que utilizan dicho certificado a un grupo de objetos.
LOGGING_DISABLED_CHECK
• Habilitar el registro.
AWS IoT Device Defender admite los siguientes tipos de acciones de mitigación:
643
AWS IoT Guía del desarrollador
Cómo definir y administrar las acciones de mitigación
Al configurar acciones estándar para los problemas encontrados durante una auditoría, puede responder
a estos problemas de forma coherente. Utilizar estas acciones de mitigación definidas también le ayuda a
resolver los problemas con mayor rapidez y con menos posibilidad de que se produzcan errores.
Important
Algunas acciones, como, por ejemplo, reactivar un certificado de dispositivo, solo se pueden realizar
manualmente. AWS IoT Device Defender no proporciona un mecanismo para revertir automáticamente las
acciones de mitigación que se han aplicado.
4. En la página Create a Mitigation Action (Crear una acción de mitigación), en Action name (Nombre de
la acción), escriba un nombre único para la acción de mitigación.
5. En Action type (Tipo de acción), especifique el tipo de acción que desea definir.
644
AWS IoT Guía del desarrollador
Cómo definir y administrar las acciones de mitigación
6. Cada tipo de acción solicita un conjunto diferente de parámetros. Escriba los parámetros de la acción.
Por ejemplo, si elige el tipo de acción Añadir objetos al grupo de objetos, debe elegir el grupo de
destino y seleccionar o quitar la marca de verificación de Override dynamic groups (Anular grupos
dinámicos).
7. En Action execution role (Rol de ejecución de la acción), elija el rol bajo cuyos permisos se aplica la
acción.
8. Elija Guardar para guardar la acción de mitigación en su cuenta de AWS.
• Utilice el comando CreateMitigationAction (p. 656) para crear la acción de mitigación. El nombre
único que dé a la acción se utiliza cuando se aplica dicha acción a los resultados de la auditoría. Elija
un nombre significativo.
Para utilizar la consola de AWS IoT para ver y modificar las acciones de mitigación
La página Mitigation Actions (Acciones de mitigación) muestra una lista de todas las acciones de
mitigación definidas para su cuenta de AWS.
3. Elija el enlace del nombre de la acción de la acción de mitigación que desea cambiar.
4. Realice los cambios que desee en la acción de mitigación. Como el nombre de la acción de mitigación
se utiliza para identificarla, no puede cambiar el nombre.
645
AWS IoT Guía del desarrollador
Cómo definir y administrar las acciones de mitigación
5. Elija Guardar para guardar los cambios en la acción de mitigación en su cuenta de AWS.
Para utilizar la AWS CLI para obtener una lista de acciones de mitigación
• Utilice el comando ListMitigationActions (p. 663) para mostrar las acciones de mitigación. Si desea
cambiar o eliminar una acción de mitigación, anote del nombre.
Para utilizar la consola de AWS IoT para eliminar una acción de mitigación
La página Mitigation Actions (Acciones de mitigación) muestra todas las acciones de mitigación
definidas para su cuenta de AWS.
3. Elija los puntos suspensivos (...) para la acción de mitigación que desea eliminar y, a continuación,
haga clic en Eliminar.
646
AWS IoT Guía del desarrollador
Aplicación de acciones de mitigación
Para utilizar la consola de AWS IoT para ver los detalles de una acción de mitigación
La página Mitigation Actions (Acciones de mitigación) muestra todas las acciones de mitigación
definidas para su cuenta de AWS.
3. Elija el enlace del nombre de la acción de la acción de mitigación que desea cambiar.
4. En la ventana Are you sure you want to delete the mitigation action (¿Seguro que desea eliminar la
acción de mitigación?), elija Confirm (Confirmar).
Para utilizar la AWS CLI para ver los detalles de una acción de mitigación
• Utilice el comando DescribeMitigationAction (p. 665) para ver los detalles de su acción de mitigación.
647
AWS IoT Guía del desarrollador
Aplicación de acciones de mitigación
acciones que se aplican a ellos. Por ejemplo, si tiene un gran grupo de dispositivos cuyos certificados han
caducado, puede tardar algún tiempo en desactivar todos estos certificados o en mover esos dispositivos a
un grupo de cuarentena. Otras acciones, como la habilitación del registro, se pueden realizar con rapidez.
Puede ver la lista de ejecuciones de acciones y cancelar una ejecución que aún no se ha completado.
Las acciones ya realizadas como parte de la ejecución de la acción cancelada no se revierten. Si está
aplicando varias acciones a un conjunto de resultados y una de esas acciones produce un error, se omiten
la acciones posteriores para ese resultado (pero se siguen aplicado a otros resultados). El estado de la
tarea para el el resultado es FAILED. El taskStatus se establece como error (Failed) si una o varias
de las acciones fracasan cuando se aplican a los resultados. Las acciones se aplican en el orden en que
estén especificadas.
Cada ejecución de acción aplica a un conjunto de acciones a un destino. Ese destino puede ser una lista
de resultados o puede ser todos los resultados de una auditoría.
En el siguiente diagrama se muestra cómo puede definir una tarea de mitigación de auditoría para que
tome todos los resultados de una auditoría y les aplique un conjunto de acciones. Una única ejecución
aplica una acción a un resultado. La tarea de acciones de mitigación de auditoría genera un resumen de
ejecución.
648
AWS IoT Guía del desarrollador
Aplicación de acciones de mitigación
En el siguiente diagrama se muestra cómo puede definir una tarea de mitigación de auditoría para que
tome una lista de resultados individuales de una o varias auditorías y les aplique un conjunto de acciones.
Una única ejecución aplica una acción a un resultado. La tarea de acciones de mitigación de auditoría
genera un resumen de ejecución.
Puede utilizar la AWS CLI o la consola de AWS IoT para aplicar acciones de mitigación.
Para usar la consola AWS IoT para aplicar acciones de mitigación iniciando la ejecución de una
acción
649
AWS IoT Guía del desarrollador
Aplicación de acciones de mitigación
4. Selec Start Mitigation Actions (Iniciar acciones de mitigación). Este botón no está disponible si todos
las comprobaciones son correctas.
5. En Are you sure that you want to start mitigation action task (¿Seguro que desea iniciar la tarea de
acción de mitigación?), el nombre de la tarea toma de forma predeterminada el ID de la auditoría, pero
puede cambiarlo a algo más significativo.
6. Para cada tipo de comprobación que tenga uno o varios resultados no conformes en la auditoría,
puede elegir una o más acciones para aplicar. Solo se muestran las acciones que son válidas para el
tipo de comprobación.
Note
Si no ha configurado las acciones para su cuenta de AWS, la lista de acciones está vacía.
Puede elegir el enlace click here (haga clic aquí) para crear una o varias acciones de
mitigación.
7. Cuando haya especificado todas las acciones que se van a aplicar, seleccione Confirm (Confirmar).
650
AWS IoT Guía del desarrollador
Aplicación de acciones de mitigación
Para usar la AWS CLI para aplicar acciones de mitigación iniciando la ejecución de una acción de
mitigación de auditoría
Para utilizar la consola de AWS IoT para ver sus ejecuciones de acciones
Una lista de tareas de acción muestra cuando cada se inició cada una y su estado actual.
3. Elija el enlace Name (Nombre) para ver los detalles de la tarea. Los detalles incluyen todas las
acciones que aplica la tarea, su destino y su estado.
Puede utilizar los filtros Show executions for (Mostrar ejecuciones para) en tipo de acciones o estados
de acción.
651
AWS IoT Guía del desarrollador
Permisos
4. Para ver los detalles de la tarea, en Executions (Ejecuciones), elija Show (Mostrar).
Para utilizar la AWS CLI para mostrar una lista de tareas iniciadas
1. Use ListAuditMitigationActionsTasks (p. 677) para ver las tareas de acciones de mitigación de
auditoría. Puede proporcionar filtros para limitar los resultados. Si desea ver los detalles de la tarea,
anote el ID de la tarea.
2. Utilice ListAuditMitigationActionsExecutions (p. 674) para ver los detalles de ejecución de una tarea
de acciones de mitigación de auditoría en particular.
3. Use DescribeAuditMitigationActionsTask (p. 680) para ver los detalles de la tarea, como los
parámetros especificados cuando se inició la tarea.
Para utilizar la AWS CLI para cancelar una tarea de acciones de mitigación de auditoría en
ejecución
Permisos
Para cada acción de mitigación que defina, debe proporcionar el rol utilizado para aplicar dicha acción.
UPDATE_DEVICE_CERTIFICATE
{
652
AWS IoT Guía del desarrollador
Permisos
"Effect":"Allow",
"Action":[
"iot:UpdateCertificate"
],
"Resource":[
"*"
]
}
]
}
UPDATE_CA_CERTIFICATE
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:UpdateCACertificate"
],
"Resource":[
"*"
]
}
]
}
ADD_THINGS_TO_THING_GROUP
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:ListPrincipalThings",
"iot:AddThingToThingGroup"
],
"Resource":[
"*"
]
}
]
}
653
AWS IoT Guía del desarrollador
Permisos
REPLACE_DEFAULT_POLICY_VERSION
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:CreatePolicyVersion"
],
"Resource":[
"*"
]
}
]
}
ENABLE_IOT_LOGGING
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"iot:SetV2LoggingOptions"
],
"Resource":[
"*"
]
},
{
"Effect":"Allow",
"Action":[
"iam:PassRole"
],
"Resource":[
"<IAM role
ARN used for setting up
logging>"
]
}
]
}
654
AWS IoT Guía del desarrollador
Comandos de las acciones de mitigación
PUBLISH_FINDING_TO_SNS
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"sns:Publish"
],
"Resource":[
"<The SNS
topic to which the finding
is published>"
]
}
]
}
Para todos los tipos de acciones de mitigación, utilice la siguiente plantilla de política de confianza:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
655
AWS IoT Guía del desarrollador
CreateMitigationAction
CreateMitigationAction
Define una acción que se pueden aplicar a los resultados de auditoría mediante
StartAuditMitigationActionsTask (p. 670). Cada acción de mitigación solo puede aplicar un tipo de
cambio. Definir una acción no la aplica.
Sinopsis
Formato cli-input-json
{
"actionParams": {
"addThingsToThingGroupParams": {
"overrideDynamicGroups": boolean,
"thingGroupNames": [ "string" ]
},
"enableIoTLoggingParams": {
"logLevel": "string",
"roleArnForLogging": "string"
},
"publishFindingToSnsParams": {
"topicArn": "string"
},
"replaceDefaultPolicyVersionParams": {
"templateName": "string"
},
"updateCACertificateParams": {
"action": "string"
},
"updateDeviceCertificateParams": {
"action": "string"
}
},
"roleArn": "string",
"tags": [
{
"Key": "string",
"Value": "string"
}
]
}
656
AWS IoT Guía del desarrollador
CreateMitigationAction
Campos cli-input-json
Debe proporcionar parámetros para el tipo de acción que está definiendo. Puede proporcionar solo un tipo
de acción y sus parámetros. Estos son los tipos de acciones admitidos:
• ADD_THINGS_TO_THING_GROUP
• ENABLE_IOT_LOGGING
• PUBLISH_FINDING_TO_SNS
• REPLACE_DEFAULT_POLICY_VERSION
• UPDATE_CA_CERTIFICATE
• UPDATE_DEVICE_CERTIFICATE
657
AWS IoT Guía del desarrollador
CreateMitigationAction
Patrón: [a-zA-Z0-9:_-]+
658
AWS IoT Guía del desarrollador
CreateMitigationAction
Errores
InvalidRequestException
Se ha superado un límite. Para obtener más información acerca de los límites de las acciones de
mitigación, consulte Service Limits.
RequestAlreadyExistsException
Ya existe una acción de mitigación con este nombre. Este error se produce solo si existe otra acción
de mitigación con el mismo nombre, pero parámetros diferentes.
ThrottlingException
Ejemplo
Este ejemplo define una acción de mitigación que, cuando se aplica, desactiva un certificado de
dispositivo.
659
AWS IoT Guía del desarrollador
UpdateMitigationAction
{
"actionArn": "arn:aws:iot:us-east-1:123456789012:mitigationaction/UpdateCACertName",
"actionId": "6a22b98e-0e27-4396-9b25-637d04959429"
}
UpdateMitigationAction
Actualiza la definición de una acción que se puede aplicar a los resultados de auditoría mediante
StartAuditMitigationActionsTask (p. 670). Cada acción de mitigación solo puede aplicar un tipo de
cambio.
Sinopsis
Formato cli-input-json
{
"actionParams": {
"addThingsToThingGroupParams": {
"overrideDynamicGroups": boolean,
"thingGroupNames": [ "string" ]
},
"enableIoTLoggingParams": {
"logLevel": "string",
"roleArnForLogging": "string"
},
"publishFindingToSnsParams": {
"topicArn": "string"
},
"replaceDefaultPolicyVersionParams": {
"templateName": "string"
},
"updateCACertificateParams": {
"action": "string"
},
"updateDeviceCertificateParams": {
"action": "string"
}
},
"roleArn": "string"
]
}
660
AWS IoT Guía del desarrollador
UpdateMitigationAction
Campos cli-input-json
Debe proporcionar parámetros para el tipo de acción que está definiendo. Puede proporcionar solo un tipo
de acción y sus parámetros. Estos son los tipos de acciones admitidos:
• ADD_THINGS_TO_THING_GROUP
• ENABLE_IOT_LOGGING
• PUBLISH_FINDING_TO_SNS
• REPLACE_DEFAULT_POLICY_VERSION
• UPDATE_CA_CERTIFICATE
• UPDATE_DEVICE_CERTIFICATE
661
AWS IoT Guía del desarrollador
UpdateMitigationAction
662
AWS IoT Guía del desarrollador
ListMitigationActions
Errores
InvalidRequestException
ListMitigationActions
Puede utilizar el comando ListMitigationActions para obtener una lista de todas las acciones de mitigación
de su cuenta de AWS.
Sinopsis
663
AWS IoT Guía del desarrollador
ListMitigationActions
Parámetros de entrada
JSON de salida:
{
"actionIdentifiers": [
{
"actionArn": "string",
"actionName": "string",
"creationDate": number
}
],
"nextToken": "string"
}
Patrón: [a-zA-Z0-9_-]+
664
AWS IoT Guía del desarrollador
DescribeMitigationAction
Errores
InvalidRequestException
Ejemplo
Este ejemplo muestra todas las acciones de mitigación definidas para su cuenta en la región.
{
"actionIdentifiers": [
{
"actionName": "UpdateCACertName",
"actionArn": "arn:aws:iot:us-east-1:123456789012:mitigationaction/
UpdateCACertName",
"creationDate": 1560173584.521
}
]
}
DescribeMitigationAction
Puede utilizar el comando DescribeMitigationAction para ver detalles de una acción de mitigación en su
cuenta de AWS.
Sinopsis
665
AWS IoT Guía del desarrollador
DescribeMitigationAction
Parámetros de entrada
Nombre Tipo Descripción
Patrón: [a-zA-Z0-9_-]+
JSON de salida:
{
"actionArn": "string",
"actionId": "string",
"actionName": "string",
"actionParams": {
"addThingsToThingGroupParams": {
"overrideDynamicGroups": boolean,
"thingGroupNames": [ "string" ]
},
"enableIoTLoggingParams": {
"logLevel": "string",
"roleArnForLogging": "string"
},
"publishFindingToSnsParams": {
"topicArn": "string"
},
"replaceDefaultPolicyVersionParams": {
"templateName": "string"
},
"updateCACertificateParams": {
"action": "string"
},
"updateDeviceCertificateParams": {
"action": "string"
}
},
"actionType": "string",
"creationDate": number,
"lastModifiedDate": number,
"roleArn": "string"
}
Cada acción de mitigación solo tiene un tipo, por lo que solo aparece uno de los conjuntos de parámetros.
666
AWS IoT Guía del desarrollador
DescribeMitigationAction
Patrón: [a-zA-Z0-9_-]+
Longitud mínima de 1. La
longitud máxima es de 128
caracteres.
Patrón: [a-zA-Z0-9:_-]+
667
AWS IoT Guía del desarrollador
DescribeMitigationAction
map
replaceDefaultPolicyVersionParams Parámetros para definir una
acción de mitigación que añade
una política en blanco para limitar
los permisos.
map
updateDeviceCertificateParams Parámetros para definir una
acción de mitigación que cambia
el estado del certificado del
dispositivo a inactivo.
668
AWS IoT Guía del desarrollador
DescribeMitigationAction
Errores
ResourceNotFoundException
Ejemplo
{
"actionName": "UpdateCACertName",
"actionType": "UPDATE_DEVICE_CERTIFICATE",
"actionArn": "arn:aws:iot:us-east-1:123456789012:mitigationaction/UpdateCACertName",
"actionId": "6a22b98e-0e27-4396-9b25-637d04959429",
"roleArn": "arn:aws:iam::123456789012:role/MitigationActionsValidRole",
"actionParams": {
"updateDeviceCertificateParams": {
"action": "DEACTIVATE"
}
},
"creationDate": 1560173584.521,
"lastModifiedDate": 1560173584.521
}
669
AWS IoT Guía del desarrollador
DeleteMitigationAction
DeleteMitigationAction
Puede utilizar el comando DeleteMitigationAction para eliminar una acción de mitigación de su
cuenta de AWS. Para que el comando DeleteMitigationAction sea idempotente, no debe generar una
ResourceNotFoundException si intenta eliminar una acción de mitigación que no existe. En cambio,
DeleteMitigationAction devuelve un resultado correcto cuando el nombre de la acción no existe.
Sinopsis
Parámetros de entrada
Nombre Tipo Descripción
Patrón: [a-zA-Z0-9_-]+
Errores
InvalidRequestException
StartAuditMitigationActionsTask
Puede utilizar el comando StartAuditMitigationActionsTask para aplicar un conjunto de acciones de
mitigación a los resultados de una o varias auditorías.
Sinopsis
Formato cli-input-json
{
"auditCheckToActionsMapping": {
"string" : [ "string" ]
},
"clientRequestToken": "string",
"target": {
670
AWS IoT Guía del desarrollador
StartAuditMitigationActionsTask
"auditTaskId": "string",
"findingIds": [ "string" ]
}
}
Parámetros de entrada
Patrón: [a-zA-Z0-9_-]+
Patrón: [a-zA-Z0-9_-]+
Longitud mínima de 1. La
longitud máxima es 64.
Patrón: [a-zA-Z0-9_-]+$
671
AWS IoT Guía del desarrollador
StartAuditMitigationActionsTask
Patrón: [a-zA-Z0-9\-]+
Patrón: [a-zA-Z0-9_-]+
JSON de salida:
{
"taskId": "string"
}
Errores
TaskAlreadyExistsException
Esta excepción se produce si intenta iniciar una tarea con el mismo ID de tarea que una tarea
existente pero con otro clientRequestToken.
InvalidRequestException
672
AWS IoT Guía del desarrollador
CancelAuditMitigationActionsTask
LimitExceededException
Ejemplo
En este ejemplo, se inicia una tarea para aplicar la UpdateCACertAction que ha definido a los
resultados de la auditoría cuyo ID de tarea es aef320b958891041e0c60c088afac64c y cuya
comprobación de auditoría es CA_CERTIFICATE_EXPIRING_CHECK..
{
"taskId": "myActionsTaskId"
}
CancelAuditMitigationActionsTask
Puede utilizar el comando CancelAuditMitigationActionsTask para detener la ejecución de una tarea de
mitigación de auditoría si aún no está completa.
Sinopsis
Parámetros de entrada
Patrón: [a-zA-Z0-9_-]+
Errores
ResourceNotFoundException
673
AWS IoT Guía del desarrollador
ListAuditMitigationActionsExecutions
InvalidRequestException
ListAuditMitigationActionsExecutions
Puede utilizar el comando ListAuditMitigationActionsExecutions para mostrar información acerca de una
tarea de mitigación de auditoría que se ha iniciado.
Sinopsis
Parámetros de entrada
Patrón: [a-zA-Z0-9_-]+
674
AWS IoT Guía del desarrollador
ListAuditMitigationActionsExecutions
Patrón: [a-zA-Z0-9_-]+
JSON de salida:
{
"actionsExecutions": [
{
"actionId": "string",
"actionName": "string",
"endTime": number,
"errorCode": "string",
"findingId": "string",
"message": "string",
"startTime": number,
"status": "string",
"taskId": "string"
}
],
"nextToken": "string"
}
675
AWS IoT Guía del desarrollador
ListAuditMitigationActionsExecutions
INSUFFICIENT_PERMISSIONS
• El ARN del rol que se proporcionó para la acción de mitigación no tiene permisos para aplicar la
acción.
INVALID_STATE_OF_RESOURCE
• El recurso en el resultado no se encuentra en un estado que permita aplicar correctamente la acción
de mitigación. Este error se produce para el tipo de acción ADD_THINGS_TO_THING_GROUP
si el objeto ya está en el máximo número de grupos permitidos. El error se produce para los tipos
676
AWS IoT Guía del desarrollador
ListAuditMitigationActionsTasks
Errores
InvalidRequestException
ListAuditMitigationActionsTasks
Puede utilizar el comando ListAuditMitigationActionsTasks para obtener una lista de tareas de acciones de
mitigación de auditoría que coinciden con los filtros especificados.
Sinopsis
Parámetros de entrada
La longitud mínima es 1. La
longitud máxima es 40.
Patrón: [a-zA-Z0-9_-]+
677
AWS IoT Guía del desarrollador
ListAuditMitigationActionsTasks
JSON de salida:
{
"nextToken": "string",
"tasks": [
{
"startTime": number,
"taskId": "string",
"taskStatus": "string"
}
]
}
678
AWS IoT Guía del desarrollador
ListAuditMitigationActionsTasks
Errores
InvalidRequestException
El contenido de la solicitud no es válido. Este error puede producirse si especifica fechas más de 90
días en el pasado.
ThrottlingException
Ejemplo
En este ejemplo, se muestran las tareas de mitigación de auditoría que se ejecutaron durante el periodo de
tiempo especificado.
{
"tasks": [
{
"taskId": "actionsTaskId",
"startTime": 1560174232.07,
"taskStatus": "CANCELED"
},
{
"taskId": "4e8acaf8-b7f0-4484-9b0d-01b979e61d8d",
"startTime": 1560060994.965,
"taskStatus": "COMPLETED"
},
{
"taskId": "0e8f5a95-e43f-43fa-9aa4-57ff3efb946d",
"startTime": 1560060860.243,
"taskStatus": "COMPLETED"
},
{
"taskId": "92d60009-33a1-45a7-a3c6-b28e938ec68a",
"startTime": 1560060707.653,
"taskStatus": "COMPLETED"
679
AWS IoT Guía del desarrollador
DescribeAuditMitigationActionsTask
},
{
"taskId": "bdea63c8-58bd-4798-9cb3-e949c7f1969a",
"startTime": 1560060531.123,
"taskStatus": "COMPLETED"
},
{
"taskId": "61e146ef-69f4-41bf-9d37-5d667f72ef3d",
"startTime": 1560060388.035,
"taskStatus": "COMPLETED"
},
{
"taskId": "2ef289dc-9bbd-422b-95ba-d96b7e626a60",
"startTime": 1560060256.695,
"taskStatus": "COMPLETED"
},
{
"taskId": "a6cdc16b-6be3-4800-bafa-2b86d3f5d639",
"startTime": 1560060097.613,
"taskStatus": "COMPLETED"
},
{
"taskId": "7ccf351b-e560-4eb2-8796-1dc1bcb25396",
"startTime": 1560059925.477,
"taskStatus": "COMPLETED"
},
{
"taskId": "8f69ee5d-3e35-4c91-88e8-3c5f84c96fde",
"startTime": 1560059345.473,
"taskStatus": "COMPLETED"
}
]
}
DescribeAuditMitigationActionsTask
Puede utilizar el comando DescribeAuditMitigationActionsTask para mostrar información acerca de una
tarea de mitigación de auditoría que se ha iniciado.
Sinopsis
Parámetros de entrada
Patrón: [a-zA-Z0-9_-]+
JSON de salida:
680
AWS IoT Guía del desarrollador
DescribeAuditMitigationActionsTask
{
"actionsDefinition": [
{
"actionParams": {
"addThingsToThingGroupParams": {
"overrideDynamicGroups": boolean,
"thingGroupNames": [ "string" ]
},
"enableIoTLoggingParams": {
"logLevel": "string",
"roleArnForLogging": "string"
},
"publishFindingToSnsParams": {
"topicArn": "string"
},
"replaceDefaultPolicyVersionParams": {
"templateName": "string"
},
"updateCACertificateParams": {
"action": "string"
},
"updateDeviceCertificateParams": {
"action": "string"
}
},
"id": "string",
"name": "string",
"roleArn": "string"
}
],
"auditCheckToActionsMapping": {
"string" : [ "string" ]
},
"endTime": number,
"startTime": number,
"target": {
"auditCheckToReasonCodeFilter": {
"string" : [ "string" ]
},
"auditTaskId": "string",
"findingIds": [ "string" ]
},
"taskStatistics": {
"string" : {
"canceledFindingsCount": number,
"failedFindingsCount": number,
"skippedFindingsCount": number,
"succeededFindingsCount": number,
"totalFindingsCount": number
}
},
"taskStatus": "string"
}
681
AWS IoT Guía del desarrollador
DescribeAuditMitigationActionsTask
map
replaceDefaultPolicyVersionParams Parámetros para definir una
acción de mitigación que añade
una política en blanco para limitar
los permisos.
682
AWS IoT Guía del desarrollador
DescribeAuditMitigationActionsTask
map
updateDeviceCertificateParams Parámetros para definir una
acción de mitigación que cambia
el estado del certificado del
dispositivo a inactivo.
683
AWS IoT Guía del desarrollador
DescribeAuditMitigationActionsTask
map
auditCheckToReasonCodeFilter Especifica un conjunto de
comprobaciones de auditoría
y los códigos de motivo que
se utilizan para identificar los
resultados de auditoría a los que
se aplica la tarea de acciones de
mitigación de auditoría.
684
AWS IoT Guía del desarrollador
Detect
Errores
ResourceNotFoundException
Detect
AWS IoT Device Defender Detect permite identificar comportamientos inusuales que podrían indicar que
un dispositivo se ha visto comprometido cuando se monitorea el comportamiento de los dispositivos. Si
utiliza una combinación de métricas del lado de la nube (procedentes de AWS IoT) y de métricas del lado
del dispositivo (procedentes de agentes instalados en los dispositivos), puede detectar:
Cree perfiles de seguridad, que contengan definiciones de comportamientos esperados de los dispositivos
y asígnelos a un grupo de dispositivos o a todos los dispositivos de su flota. AWS IoT Device Defender
Detect utiliza estos perfiles de seguridad para detectar anomalías y enviar alertas a través de métricas de
Amazon CloudWatch y notificaciones de Amazon Simple Notification Service.
AWS IoT Device Defender Detect puede detectar problemas de seguridad que se producen con frecuencia
en los dispositivos conectados:
• Tráfico desde un dispositivo a una dirección IP maliciosa conocida o a un punto de enlace no autorizado
que indica un posible comando y canal de control maliciosos.
• Tráfico anómalo, como un pico en el tráfico saliente, que indica que un dispositivo participa en un DDoS.
• Dispositivos con puertos e interfaces de administración remota a los que se puede acceder de forma
remota.
• Un pico en el índice de mensajes que se envían a la cuenta (por ejemplo, desde un dispositivo
fraudulento, lo que podría producir unos gastos excesivos por mensaje).
685
AWS IoT Guía del desarrollador
Conceptos
Casos de uso
Puede usar AWS IoT Device Defender Detect para medir la superficie de ataque de sus dispositivos.
Puede, por ejemplo, identificar dispositivos con puertos de servicio que con frecuencia son objeto de
campañas de ataques (el servicio telnet que se ejecuta en los puertos 23/2323, el servicio SSH que
se ejecuta en el puerto 22, los servicios HTTP/S que se ejecutan en los puertos 80/443/8080/8081).
Aunque estos puertos de servicio pueden tener motivos legítimos para utilizarse en los dispositivos,
también suelen formar parte de la superficie de ataque de los adversarios y llevan asociados
riesgos. Una vez que AWS IoT Device Defender Detect alerta de la superficie de ataque, esta puede
minimizarse (eliminando servicios de red que no se utilizan) o se pueden ejecutar otras evaluaciones
para identificar debilidades de seguridad (por ejemplo, un telnet configurado con contraseñas de uso
común, predeterminadas o poco seguras).
Detectar anomalías de comportamiento de dispositivos con posibles causas raíces de seguridad
Puede usar AWS IoT Device Defender Detect para alertarle sobre las métricas de comportamiento
inesperado del dispositivo (el número de puertos abiertos, el número de conexiones, un puerto abierto
inesperado, las conexiones a direcciones IP inesperadas) que pueden indicar una vulneración de la
seguridad. Por ejemplo, un número de conexiones TCP más alto de lo esperado puede indicar que un
dispositivo se está utilizando para un ataque DDoS. Un proceso que se escucha en un puerto diferente
al que espera puede indicar una puerta trasera instalada en un dispositivo para control remoto. Puede
usar AWS IoT Device Defender Detect para sondear el estado de las flotas de dispositivos y contrastar
los supuestos de seguridad (por ejemplo, que ningún dispositivo está escuchando en el puerto 23 o
2323).
Puede habilitar la detección de amenazas basada en aprendizaje automático (ML) para identificar
automáticamente posibles amenazas.
Detectar un dispositivo configurado incorrectamente
Un pico en el número o tamaño de los mensajes enviados desde un dispositivo a su cuenta puede
indicar un dispositivo configurado incorrectamente. Un dispositivo como este podría aumentar los
gastos por mensaje. Del mismo modo, un dispositivo con muchos errores de autorización podría
requerir la reconfiguración de una política.
Conceptos
métrica
AWS IoT Device Defender Detect usa métricas para detectar un comportamiento anómalo. AWS
IoT Device Defender Detect compara el valor de una métrica registrado con el valor esperado que
proporciona el usuario. Estas métricas se pueden obtener de dos fuentes: de las métricas del lado de
la nube y de las métricas del lado del dispositivo:
El comportamiento anómalo en la red de AWS IoT se detecta mediante el uso de métricas del lado
de la nube, como el número de errores de autorización o el número o el tamaño de mensajes que un
dispositivo envía o recibe a través de AWS IoT.
AWS IoT Device Defender Detect también puede recopilar, agregar y monitorizar datos de métricas
generados por dispositivos AWS IoT (por ejemplo, los puertos en los que escucha un dispositivo, la
cantidad de bytes o paquetes enviados o las conexiones TCP del dispositivo).
Puede usar AWS IoT Device Defender Detect solo con métricas del lado de la nube. Para usar las
métricas del lado del dispositivo, primero debe implementar el SDK de AWS IoT en sus dispositivos
conectados a AWS IoT o en las gateways de los dispositivos para recopilar las métricas y enviarlas a
AWS IoT. Consulte Envío de métricas desde dispositivos (p. 711).
686
AWS IoT Guía del desarrollador
Comportamientos
dimensión
Puede definir una dimensión para ajustar el ámbito de un comportamiento. Por ejemplo, puede
definir una dimensión de filtrado de temas que aplique un comportamiento a los temas de MQTT que
coincidan con un patrón. Para obtener más información acerca de cómo definir una dimensión para
utilizarla en un perfil de seguridad, consulte CreateDimension (p. 718).
perfil de seguridad
Un perfil de seguridad define comportamientos anómalos para un grupo de dispositivos (un grupo
de objetos (p. 102)) o para todos los dispositivos de su cuenta y especifica qué acciones adoptar
cuando se detecta una anomalía. Puede utilizar la consola de AWS IoT o los comandos de la API para
crear un perfil de seguridad y asociarlo a un grupo de dispositivos. AWS IoT Device Defender Detect
comienza a registrar datos relacionados con la seguridad y utiliza los comportamientos definidos en el
perfil de seguridad para detectar anomalías en el comportamiento de los dispositivos.
comportamiento
Un comportamiento indica a AWS IoT Device Defender Detect cómo puede saber cuándo un
dispositivo realiza alguna actividad anómala. Cada comportamiento consta de un nombre, una métrica,
un operador y un valor o un umbral estadístico. Para algunas métricas, también es necesario un
periodo de tiempo (durationSeconds). Todas las acciones del dispositivo que no coinciden con un
comportamiento definido desencadenan una alerta.
alerta
Cuando se detecta una anomalía, se puede enviar una notificación de alerta a través de una métrica
de CloudWatch (consulte Uso de las métricas de AWS IoT (p. 227)) o de una notificación de SNS.
También se muestra una notificación de alerta en la consola de AWS IoT junto con información
sobre dicha alerta y un historial de las alertas del dispositivo. También se envía una alerta cuando un
dispositivo monitorizado deja de exhibir un comportamiento anómalo o cuando ha estado generando
una alerta, pero deja de informar durante un período prolongado.
Comportamientos
Un perfil de seguridad contiene un conjunto de comportamientos. Cada comportamiento contiene una
métrica que especifica el comportamiento normal de un grupo de dispositivos o de todos los dispositivos de
la cuenta. Consulte Métricas (p. 688) y CreateSecurityProfile (p. 720).
name
Puede definir una dimensión para ajustar el ámbito de un comportamiento. Por ejemplo, puede
definir una dimensión de filtrado de temas que aplique un comportamiento a los temas de MQTT
que coincidan con un patrón. Si desea definir una dimensión para utilizarla en un perfil de seguridad,
consulte CreateDimension (p. 718).
criteria
Los criterios que determinan si un dispositivo se comporta normalmente con respecto a la metric.
comparisonOperator
El operador que relaciona el objeto medido (metric) con los criterios (value o
statisticalThreshold).
687
AWS IoT Guía del desarrollador
Métricas
El valor que se va a comparar con la metric. En función del tipo de métrica, debe contener
count (un valor), cidrs (una lista de CIDR) o ports (una lista de puertos).
statisticalThreshold
Este campo statistic indica un percentil. Da como resultado un valor por el que se determina
la conformidad con el comportamiento. Las métricas se recopilan una o varias veces a lo largo de
la duración especificada (durationSeconds) de todos los dispositivos de informe asociados a
este perfil de seguridad y los percentiles se calculan en función de dichos datos. Posteriormente,
las medidas se recopilan para un dispositivo y se acumulan a lo largo de la misma duración.
Si el valor resultante del dispositivo está por encima o por debajo (comparisonOperator)
del valor asociado con el percentil especificado, se considera que el dispositivo se ajusta al
comportamiento. De lo contrario, el dispositivo infringirá dicho comportamiento.
Un percentil indica el porcentaje de todas las mediciones consideradas que caigan por debajo del
valor asociado. Por ejemplo, si el valor asociado a "p90" (el percentil 90.º) es 123, el 90% de todas
las mediciones fueron inferiores a 123.
durationSeconds
Utilícelo para especificar el periodo de tiempo durante el cual se evalúa el comportamiento, para
aquellos criterios que tienen una dimensión de tiempo (por ejemplo, NUM_MESSAGES_SENT).
Para una comparación de métricas statisticalThreshhold, se trata del período de tiempo
durante el que se recopilan mediciones para todos los dispositivos a fin de determinar los valores
statisticalThreshold y, a continuación, para cada dispositivo para determinar cómo se
comparta en comparación.
consecutiveDatapointsToAlarm
Si se genera una alerta y el dispositivo infractor deja de infringir el comportamiento para el número
especificado de puntos de datos consecutivos, la alarma se desactiva. Si no se especifica, el
valor predeterminado es 1. (Esto difiere de la consola de AWS IoT donde se presenta de forma
predeterminada un valor de 3, pero se puede anular).
Métricas
aws:message-byte-size
Utilice esta métrica para especificar el tamaño máximo o mínimo (en bytes) de cada mensaje
transmitido desde un dispositivo a AWS IoT.
688
AWS IoT Guía del desarrollador
Métricas
Unidades: bytes
Example
{
"name": "Max Message Size",
"metric": "aws:message-byte-size",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 1024
},
"consecutiveDatapointsToAlarm": 3,
"consecutiveDatapointsToClear": 3
}
}
{
"name": "Large Message Size",
"metric": "aws:message-byte-size",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p90"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 3,
"consecutiveDatapointsToClear": 3
}
}
Se genera una alarma para un dispositivo si, durante tres períodos consecutivos de cinco minutos,
transmite mensajes cuyo tamaño acumulado es mayor que el medido para el 90 por ciento de todos
los demás dispositivos que informan sobre este comportamiento de perfil de seguridad.
aws:num-messages-received/aws:num-messages-sent
Utilice esta métrica para especificar el número máximo o mínimo de mensajes que pueden enviarse o
recibirse entre AWS IoT y cada dispositivo en un período de tiempo determinado.
Unidades: mensajes
689
AWS IoT Guía del desarrollador
Métricas
Duración: un número entero no negativo, los valores válidos son 300, 600, 900, 1800 o 3600 segundos
Example
{
"name": "Out bound message count",
"metric": "aws:num-messages-sent",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 50
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 2,
"consecutiveDatapointsToClear": 2
}
}
{
"name": "Out bound message rate",
"metric": "aws:num-messages-sent",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p99"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 2,
"consecutiveDatapointsToClear": 2
}
}
aws:all-bytes-out
Utilice esta métrica para especificar la cantidad máxima o mínima de tráfico saliente que un dispositivo
debe enviar, medido en bytes, en un período de tiempo determinado.
Unidades: bytes
Duración: un número entero no negativo, los valores válidos son 300, 600, 900, 1800 o 3600 segundos
Example
{
"name": "TCP outbound traffic",
"metric": "aws:all-bytes-out",
"criteria": {
690
AWS IoT Guía del desarrollador
Métricas
"comparisonOperator": "less-than",
"value": {
"count": 4096
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 5,
"consecutiveDatapointsToClear": 4
}
}
{
"name": "TCP outbound traffic",
"metric": "aws:all-bytes-out",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p50"
},
"durationSeconds": 900,
"consecutiveDatapointsToAlarm": 5,
"consecutiveDatapointsToClear": 4
}
}
aws:all-bytes-in
Utilice esta métrica para especificar la cantidad máxima o mínima de tráfico entrante que un
dispositivo debe recibir, medido en bytes, en un período de tiempo determinado.
Unidades: bytes
Duración: un número entero no negativo, los valores válidos son 300, 600, 900, 1800 o 3600 segundos
Example
{
"name": "TCP inbound traffic",
"metric": "aws:all-bytes-in",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 4096
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 3
}
}
691
AWS IoT Guía del desarrollador
Métricas
{
"name": "TCP inbound traffic",
"metric": "aws:all-bytes-in",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p90"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 3
}
}
aws:all-packets-out
Utilice esta métrica para especificar la cantidad máxima o mínima de tráfico saliente total que un
dispositivo debe enviar en un período de tiempo determinado.
Unidades: paquetes
Duración: un entero no negativo. Los valores válidos son 300, 600, 900, 1800 o 3600 segundos.
Example
{
"name": "TCP outbound traffic",
"metric": "aws:all-packets-out",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 100
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 3
}
}
{
"name": "TCP outbound traffic",
"metric": "aws:all-packets-out",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p90"
692
AWS IoT Guía del desarrollador
Métricas
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 3
}
}
aws:all-packets-in
Utilice esta métrica para especificar la cantidad máxima o mínima de tráfico entrante total que un
dispositivo debe recibir en un período de tiempo determinado.
Unidades: paquetes
Duración: un entero no negativo. Los valores válidos son 300, 600, 900, 1800 o 3600 segundos.
Example
{
"name": "TCP inbound traffic",
"metric": "aws:all-packets-in",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 100
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 2,
"consecutiveDatapointsToClear": 1
}
}
Example
Ejemplo en el que se utiliza statisticalThreshold:
{
"name": "TCP inbound traffic",
"metric": "aws:all-packets-in",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p90"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 2,
"consecutiveDatapointsToClear": 1
}
693
AWS IoT Guía del desarrollador
Métricas
aws:num-authorization-failures
Utilice esta métrica para especificar la cantidad máxima de errores de autorización permitidos para
cada dispositivo en un período de tiempo determinado. Se produce un error de autorización cuando se
deniega una solicitud desde un dispositivo a AWS IoT (por ejemplo, si un dispositivo intenta publicar
en un tema para el que no tiene suficientes permisos).
Unidad: errores
Unidades: errores
Duración: un entero no negativo. Los valores válidos son 300, 600, 900, 1800 o 3600 segundos.
Example
{
"name": "Authorization Failures",
"metric": "aws:num-authorization-failures",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 5
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 2,
"consecutiveDatapointsToClear": 1
}
}
{
"name": "Authorization Failures",
"metric": "aws:num-authorization-failures",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p50"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 2,
"consecutiveDatapointsToClear": 1
}
}
694
AWS IoT Guía del desarrollador
Métricas
aws:source-ip-address
Utilice esta métrica para especificar un conjunto de CIDR permitidos (previamente denominado lista
blanca) y denegados (previamente denominado lista negra) desde los que cada dispositivo debe o no
conectarse a AWS IoT.
Unidades: n/a
Example
{
"name": "Denied source IPs",
"metric": "aws:source-ip-address",
"criteria": {
"comparisonOperator": "not-in-cidr-set",
"value": {
"cidrs": [ "12.8.0.0/16", "15.102.16.0/24" ]
}
}
}
aws:destination-ip-addresses
Utilice esta métrica para especificar un conjunto de CIDR permitidos (previamente denominado lista
blanca) y denegados (previamente denominado lista negra) con los que cada dispositivo debe o no
comunicarse.
Unidades: n/a
Ejemplo:
Example
{
"name": "Denied destination IPs",
"metric": "aws:destination-ip-addresses",
"criteria": {
"comparisonOperator": "not-in-cidr-set",
"value": {
"cidrs": [ "12.8.0.0/16", "15.102.16.0/24" ]
695
AWS IoT Guía del desarrollador
Métricas
}
}
}
aws:listening-tcp-ports / aws:listening-udp-ports
Utilice esta métrica para especificar un conjunto de puertos TCP/UDP permitidos (previamente
denominado lista blanca) y denegados (previamente denominado lista negra) en los que cada
dispositivo debe o no escuchar.
Unidades: n/a
Ejemplo:
{
"name": "Listening TCP Ports",
"metric": "aws:listening-tcp-ports",
"criteria": {
"comparisonOperator": "in-port-set",
"value": {
"ports": [ 443, 80 ]
}
}
}
aws:num-listening-tcp-ports / aws:num-listening-udp-ports
Utilice esta métrica para especificar el número máximo o mínimo de puertos TCP o UDP que cada
dispositivo debe escuchar.
Unidades: puertos
Example
Ejemplo:
696
AWS IoT Guía del desarrollador
Métricas
aws:num-established-tcp-connections
Utilice esta métrica para especificar el número máximo o mínimo de conexiones TCP activas que cada
dispositivo debe tener. (Todos los estados de TCP)
Unidades: conexiones
Example
{
"name": "TCP Connection Count",
"metric": "aws:num-established-tcp-connections",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 3
},
"consecutiveDatapointsToAlarm": 3,
"consecutiveDatapointsToClear": 3
}
}
{
"name": "TCP Connection Count",
"metric": "aws:num-established-tcp-connections",
"criteria": {
"comparisonOperator": "less-than",
"statisticalThreshold": {
"statistic": "p90"
},
"durationSeconds": 900,
"consecutiveDatapointsToAlarm": 3,
"consecutiveDatapointsToClear": 3
}
697
AWS IoT Guía del desarrollador
Métricas
aws:num-connection-attempts
Número de veces que un dispositivo intenta realizar una conexión durante un periodo determinado.
More info (13)
Utilice esta métrica para especificar el número máximo o mínimo de intentos de conexión para cada
dispositivo. Se cuentan los intentos correctos y los no correctos.
Duración: un entero no negativo. Los valores válidos son 300, 600, 900, 1800 o 3600 segundos.
Example
{
"name": "Connection Attempts",
"metric": "aws:num-connection-attempts",
"criteria": {
"comparisonOperator": "greater-than",
"value": {
"count": 5
},
"durationSeconds": 600,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 2
}
}
{
"name": "Connection Attempts",
"metric": "aws:num-connection-attempts",
"criteria": {
"comparisonOperator": "greater-than",
"statisticalThreshold": {
"statistic": "p10"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 2
}
}
aws:num-disconnects
Número de veces que un dispositivo se desconecta de AWS IoT durante un periodo de tiempo
determinado.
698
AWS IoT Guía del desarrollador
Establecer el ámbito de las métricas en los
perfiles de seguridad utilizando dimensiones
Utilice esta métrica para especificar el número máximo o mínimo de veces que un dispositivo se ha
desconectado de AWS IoT durante un periodo de tiempo determinado.
Unidades: desconexiones
Duración: un entero no negativo. Los valores válidos son 300, 600, 900, 1800 o 3600 segundos.
Example
{
"name": "Disconnections",
"metric": "aws:num-disconnects",
"criteria": {
"comparisonOperator": "greater-than",
"value": {
"count": 5
},
"durationSeconds": 600,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 2
}
}
{
"name": "Disconnections",
"metric": "aws:num-disconnects",
"criteria": {
"comparisonOperator": "greater-than",
"statisticalThreshold": {
"statistic": "p10"
},
"durationSeconds": 300,
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 2
}
}
Se pueden utilizar comodines de MQTT en los valores de las dimensiones. Los comodines de MQTT
le permiten suscribirse a varios temas simultáneamente. Hay dos tipos diferentes de comodines: de un
699
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la CLI de AWS
nivel (+) y de varios niveles (#). Por ejemplo, el valor de dimensión Data/bulb/+/activity crea una
suscripción que busca correspondencias en todos los temas que existen en el mismo nivel que +. Los
valores de dimensión también admiten la variable de sustitución del ID de cliente de MQTT ${iot:clientiD}.
Las dimensiones de tipo TOPIC_FILTER son compatibles con el siguiente conjunto de métricas del lado de
la nube:
{
"arn": "arn:aws:iot:us-west-2:123456789012:dimension/TopicFilterForAuthMessages",
"name": "TopicFilterForAuthMessages"
}
700
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la CLI de AWS
"securityProfileArn": "arn:aws:iot:us-west-2:1234564789012:securityprofile/
ProfileForConnectedDevice",
"securityProfileName": "ProfileForConnectedDevice"
}
También puede cargar un parámetro desde un archivo en lugar de escribirlo todo como un valor
de parámetro de línea de comandos para ahorrar tiempo. Para obtener más información, consulte
Carga de parámetros de la CLI de AWS desde un archivo. A continuación se muestra el parámetro
behavior en formato JSON expandido:
[
{
"criteria": {
"comparisonOperator": "less-than",
"consecutiveDatapointsToAlarm": 1,
"consecutiveDatapointsToClear": 1,
"value": {
"count": 128
}
},
"metric": "aws:message-byte-size",
"metricDimension": {
"dimensionName:": "TopicFilterForAuthMessages"
},
"name": "CellularBandwidth"
}
]
• Utilice el comando ListSecurityProfiles (p. 727) para ver perfiles de seguridad con una dimensión
determinada:
{
"securityProfileIdentifiers": [
{
"name": "ProfileForConnectedDevice",
"arn": "arn:aws:iot:us-west-2:1234564789012:securityprofile/
ProfileForConnectedDevice"
}
]
}
701
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la CLI de AWS
{
"name": "TopicFilterForAuthMessages",
"lastModifiedDate": 1585866222.317,
"stringValues": [
"device/${iot:ClientId}/auth"
],
"creationDate": 1585854500.474,
"type": "TOPIC_FILTER",
"arn": "arn:aws:iot:us-west-2:1234564789012:dimension/TopicFilterForAuthMessages"
}
1. Para eliminar una dimensión, primero desconéctela de los perfiles de seguridad a los que esté
asociada. Utilice el comando ListSecurityProfiles (p. 727) para ver perfiles de seguridad con una
determinada dimensión.
2. Para quitar una dimensión de un perfil de seguridad, utilice el comando
UpdateSecurityProfile (p. 732). Introduzca toda la información que desee conservar, pero excluya la
dimensión:
{
"behaviors": [
{
"metric": "aws:message-byte-size",
"name": "CellularBandwidth",
"criteria": {
"consecutiveDatapointsToClear": 1,
"comparisonOperator": "less-than",
"consecutiveDatapointsToAlarm": 1,
"value": {
"count": 128
}
}
},
{
"metric": "aws:num-authorization-failures",
"name": "Authorization",
"criteria": {
"durationSeconds": 300,
"comparisonOperator": "less-than",
"consecutiveDatapointsToClear": 1,
"consecutiveDatapointsToAlarm": 1,
"value": {
"count": 10
}
}
702
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la consola
}
],
"securityProfileName": "ProfileForConnectedDevice",
"lastModifiedDate": 1585936349.12,
"securityProfileDescription": "Check to see if authorization fails 10 times in 5
minutes or if cellular bandwidth exceeds 128",
"version": 2,
"securityProfileArn": "arn:aws:iot:us-west-2:123456789012:securityprofile/Preo/
ProfileForConnectedDevice",
"creationDate": 1585846909.127
}
3. Una vez desconectada la dimensión, utilice el comando DeleteDimension (p. 721) para eliminar la
dimensión:
1. En la consola de AWS IoT, en el panel de navegación, expanda Defend, expanda Detect y seleccione
Security profiles (Perfiles de seguridad).
2. En la página Security profiles (Perfiles de seguridad), elija Create (Crear) para agregar un nuevo perfil
de seguridad o Edit (Editar) para aplicar una dimensión a un perfil de seguridad existente.
3. En la página Expected behaviors (Comportamientos esperados), seleccione una de las cinco
dimensiones del lado de la nube admitidas en Metric (Métrica). Aparecerán los cuadros Dimension
(Dimensión) y Dimension operator (Operador de dimensión). Para obtener información sobre las
métricas del lado de la nube admitidas, consulte Establecer el ámbito de las métricas en los perfiles de
seguridad utilizando dimensiones (p. 699).
4. En el menú desplegable Dimension (Dimensión), seleccione Add dimension (Agregar dimensión).
5. En la página Create a new dimension (Crear una nueva dimensión), escriba los detalles de la nueva
dimensión. En Dimensions values (Valores de dimensión), se pueden utilizar los caracteres comodín
de MQTT # y +, así como la variable de sustitución del ID de cliente de MQTT ${iot:ClientId}.
703
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la consola
704
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la consola
1. En la consola de AWS IoT, en el panel de navegación, expanda Defend, expanda Detect y seleccione
Dimensions (Dimensiones).
2. Seleccione la dimensión que desee editar.
3. Seleccione Actions (Acciones), Edit (Editar).
705
AWS IoT Guía del desarrollador
Cómo utilizar las dimensiones en la consola
1. En la consola de AWS IoT, en el panel de navegación, expanda Defend, expanda Detect y seleccione
Dimensions (Dimensiones).
2. Seleccione la dimensión que desee eliminar.
3. Para confirmar que la dimensión no está asociada a ningún perfil de seguridad, consulte la columna
Used in (Usado en) . Si la dimensión está asociada a un perfil de seguridad, abra la página Security
profiles (Perfiles de seguridad) de la izquierda y edite los perfiles de seguridad a los que está asociada
la dimensión. Cuando elimine la dimensión, también se eliminará el comportamiento. Si desea
mantener el comportamiento, elija los puntos suspensivos y haga clic en Copy (Copiar). Continúe
después con la eliminación del comportamiento. Si desea eliminar otra dimensión, siga los pasos de
esta sección.
706
AWS IoT Guía del desarrollador
Monitorización del comportamiento
de dispositivos no registrados
707
AWS IoT Guía del desarrollador
Cómo utilizar AWS IoT Device Defender Detect
Los mensajes registrados por los dispositivos se rechazan si el nombre del objeto contiene
caracteres de control o si el nombre del objeto tiene más de 128 bytes de caracteres con
codificación UTF-8.
Utilice la consola de AWS IoT para analizar sus métricas de dispositivos y determinar qué constituye
un comportamiento típico para sus dispositivos.
3. Cree un conjunto de comportamientos para el perfil de seguridad. Los comportamientos
contienen métricas que especifican el comportamiento normal de un grupo de dispositivos o
de todos los dispositivos de su cuenta. Para obtener más información y ejemplos, consulte
Métricas (p. 688). Después de crear un conjunto de comportamientos, puede validarlos con
ValidateSecurityProfileBehaviors (p. 733).
4. Utilice la acción CreateSecurityProfile (p. 720) para crear un perfil de seguridad que incluya los
comportamientos. Puede utilizar el parámetro alertTargets para enviar alertas a un destino (un
tema de SNS) cuando un dispositivo vulnere un comportamiento. (Si envía alertas usando SNS, tenga
en cuenta que estas se tendrán en cuenta para calcular la cuota de temas de SNS de la cuenta de
AWS. Si se produce una gran oleada de infracciones, podría superarse la cuota de temas de SNS.
También puede utilizar las métricas de CloudWatch para comprobar las vulneraciones. Para obtener
más información, consulte
Las métricas mostradas por AWS IoT proporcionan información que puede analizar de
diferentes maneras. Los siguientes casos de uso se basan en una situación en la que
tiene diez objetos que se conectan a Internet una vez al día. Cada día:
708
AWS IoT Guía del desarrollador
Cómo utilizar AWS IoT Device Defender Detect
• ¿Cómo se me puede enviar una notificación si mis objetos no publican datos cada
día? (p. 229)
Para asociar un perfil de seguridad a un grupo de dispositivos, debe especificar el ARN del grupo de
objetos que los contiene. El ARN de un grupo de objetos tiene el siguiente formato:
arn:aws:iot:region:account-id:thinggroup/thing-group-name
Para asociar un perfil de seguridad a todos los objetos registrados en una cuenta de AWS (y omitir los
objetos no registrados), debe especificar un ARN con el siguiente formato.
arn:aws:iot:region:account-id:all/registered-things
Para asociar un perfil de seguridad a todos los objetos no registrados, debe especificar un ARN con el
siguiente formato:
arn:aws:iot:region:account-id:all/unregistered-things
Para asociar un perfil de seguridad a todos los dispositivos, debe especificar un ARN con el siguiente
formato:
arn:aws:iot:region:account-id:all/things
Utilice la acción ListViolationEvents (p. 729) para ver qué infracciones se detectaron durante un
período de tiempo especificado. Puede filtrar estos resultados por un dispositivo o perfil de seguridad.
7. Si sus dispositivos infringen los comportamientos definidos con demasiada frecuencia o no lo
suficiente, debe ajustar el comportamiento.
8. Para revisar los perfiles de seguridad que se han configurado y los dispositivos
que se están monitoreando, utilice las acciones ListSecurityProfiles (p. 727),
ListSecurityProfilesForTarget (p. 728) y ListTargetsForSecurityProfile (p. 729).
Utilice la acción DescribeSecurityProfile (p. 724) para obtener más detalles sobre un perfil de
seguridad.
9. Para actualizar un perfil de seguridad, utilice la acción UpdateSecurityProfile (p. 732). Utilice
la acción DetachSecurityProfile (p. 725) para desconectar un perfil de seguridad de destino de
una cuenta o grupo de objetos. Utilice la acción DeleteSecurityProfile (p. 722) para eliminar
completamente un perfil de seguridad.
709
AWS IoT Guía del desarrollador
Permisos
Permisos
Esta sección contiene información sobre cómo configurar los roles y políticas de IAM necesarios para
administrar AWS IoT Device Defender Detect. Para obtener más información, consulte la Guía del usuario
de IAM.
Política de permisos
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"sns:Publish"
],
"Resource":[
"arn:aws:sns:region:account-id:your-topic-name"
]
}
]
}
Política de confianza
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
También necesita una política de permisos de IAM asociada al usuario de IAM que permita al usuario
pasar roles. Consulte Concesión de permisos a un usuario para transferir un rol a un servicio de AWS.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
710
AWS IoT Guía del desarrollador
Envío de métricas desde dispositivos
"Action": [
"iam:GetRole",
"iam:PassRole"
],
"Resource": "arn:aws:iam::account-id:role/Role_To_Pass"
}
]
}
Debe implementar de forma segura el SDK de AWS IoT en los dispositivos o las gateway de dispositivos
conectados a AWS IoT para recopilar métricas del lado del dispositivo. AWS IoT Device Defender
proporciona agentes de muestra que puede utilizar como ejemplos para crear el suyo propio. Si no puede
proporcionar las métricas del dispositivo, podrá disfrutar de una funcionalidad limitada a través de las
métricas del lado de la nube.
$aws/things/THING_NAME/defender/metrics/json
o bien
$aws/things/THING_NAME/defender/metrics/cbor
AWS IoT Device Defender utiliza uno de estos temas para responder con el estado de recepción de los
informes de métricas:
$aws/things/THING_NAME/defender/metrics/json/accepted
$aws/things/THING_NAME/defender/metrics/cbor/accepted
$aws/things/THING_NAME/defender/metrics/json/rejected
$aws/things/THING_NAME/defender/metrics/cbor/rejected
• Para notificar las métricas, un dispositivo debe registrarse como un objeto en AWS IoT.
711
AWS IoT Guía del desarrollador
Envío de métricas desde dispositivos
• Por lo general, un dispositivo debería enviar un informe de métrica una vez cada 5 minutos. Los
dispositivos pueden enviar cómo máximo un informe de métricas cada 5 minutos. (Un dispositivo no
puede realizar más que un informe de métricas cada 5 minutos).
• Los dispositivos debe informar de las métricas actuales. No se permite realizar informes históricos de
métricas.
• Puede utilizar Trabajos (p. 413) para establecer el intervalo de informes de métricas de las instancias del
agente de informes de métricas. En las muestras de AWS IoT Device Defender Agent C, se incluye un
ejemplo. Para obtener más información, consulte el archivo README.md.
Bloque de encabezado
Bloque de métricas:
712
AWS IoT Guía del desarrollador
Envío de métricas desde dispositivos
Conexiones de TCP
established_connections
ec tcp_connectionsN Lista<Conexión> Estado
de TCP
establecido
connections cs established_connections
N Lista<Objeto>
total t established_connections
N Número >= 0 Número de
conexiones
establecidas
listening_tcp_ports
tp métricas N Objeto
total t listening_tcp_ports
N Número >= 0
listening_udp_ports
up métricas N Objeto
713
AWS IoT Guía del desarrollador
Envío de métricas desde dispositivos
total t listening_udp_ports
N Número >= 0
Estadísticas de la red
Example
{
"header": {
"report_id": 1530304554,
"version": "1.0"
},
"metrics": {
"listening_tcp_ports": {
"ports": [
{
"interface": "eth0",
"port": 24800
},
{
"interface": "eth0",
"port": 22
},
{
"interface": "eth0",
"port": 53
}
],
"total": 3
},
"listening_udp_ports": {
"ports": [
{
714
AWS IoT Guía del desarrollador
Envío de métricas desde dispositivos
"interface": "eth0",
"port": 5353
},
{
"interface": "eth0",
"port": 67
}
],
"total": 2
},
"network_stats": {
"bytes_in": 29358693495,
"bytes_out": 26485035,
"packets_in": 10013573555,
"packets_out": 11382615
},
"tcp_connections": {
"established_connections": {
"connections": [
{
"local_interface": "eth0",
"local_port": 80,
"remote_addr": "192.168.0.1:8000"
},
{
"local_interface": "eth0",
"local_port": 80,
"remote_addr": "192.168.0.1:8000"
}
],
"total": 2
}
}
}
}
{
"hed": {
"rid": 1530305228,
"v": "1.0"
},
"met": {
"tp": {
"pts": [
{
"if": "eth0",
"pt": 24800
},
{
"if": "eth0",
"pt": 22
},
{
"if": "eth0",
"pt": 53
}
],
"t": 3
},
"up": {
"pts": [
{
715
AWS IoT Guía del desarrollador
Comandos de detección
"if": "eth0",
"pt": 5353
},
{
"if": "eth0",
"pt": 67
}
],
"t": 2
},
"ns": {
"bi": 29359307173,
"bo": 26490711,
"pi": 10014614051,
"po": 11387620
},
"tc": {
"ec" : {
"cs": [
{
"li": "eth0",
"lp": 80,
"rad": "192.168.0.1:8000"
},
{
"li": "eth0",
"lp": 80,
"rad": "192.168.0.1:8000"
}
],
"t": 2
}
}
}
}
Comandos de detección
Puede utilizar los comandos de AWS IoT Device Defender Detect de esta sección para identificar
comportamientos inusuales que podrían indicar que un dispositivo está comprometido.
CreateDimension (p. 718) Crea una dimensión que puede utilizar para limitar
el ámbito de los comportamientos que defina en un
perfil de seguridad de AWS IoT Device Defender.
716
AWS IoT Guía del desarrollador
AttachSecurityProfile
Nombre Descripción
AttachSecurityProfile
Asocia un perfil de seguridad de AWS IoT Device Defender a uno de los siguientes tipos de destino:
717
AWS IoT Guía del desarrollador
CreateDimension
Cada tipo de destino puede tener hasta cinco perfiles de seguridad asociados.
Sinopsis:
cli-input-json formato:
{
"securityProfileName": "string",
"securityProfileTargetArn": "string"
}
Para asociar un perfil de seguridad a un grupo de dispositivos, debe especificar el ARN del grupo de
objetos que los contiene. El ARN de un grupo de objetos tiene el siguiente formato:
arn:aws:iot:region:account-id:thinggroup/thing-group-name
Para asociar un perfil de seguridad a todos los objetos registrados en una cuenta (y omitir los objetos no
registrados), debe especificar un ARN con el siguiente formato:
arn:aws:iot:region:account-id:all/registered-things
Para asociar un perfil de seguridad a todos los objetos no registrados, debe especificar un ARN con el
siguiente formato:
arn:aws:iot:region:account-id:all/unregistered-things
Para asociar un perfil de seguridad a todos los dispositivos, debe especificar un ARN con el siguiente
formato:
arn:aws:iot:region:accountid:all/things
CreateDimension
Cree una dimensión para controlar el ámbito de comportamiento de un perfil de seguridad de AWS
IoT Device Defender. El ámbito se define proporcionando un valor o patrón que se utiliza como
filtro. TOPIC_FILTER es la única dimensión admitida actualmente. En el caso de las dimensiones
TOPIC_FILTER, este filtro especifica el subconjunto de temas de MQTT a los que se aplica el
comportamiento. Las dimensiones admiten los caracteres comodín # y + de MQTT, así como la variable
${iot:clientiD}.
718
AWS IoT Guía del desarrollador
CreateDimension
Para agregar una dimensión a un perfil de seguridad, consulte CreateSecurityProfile (p. 720).
Sinopsis:
Note
Example
En este ejemplo, se crea una dimensión denominada TopicFilterForAuthMessages que filtra los temas de
MQTT que coinciden con el patrón device/+/auth. La dimensión se aplica a un comportamiento de un perfil
de seguridad.
{
"name": "TopicFilterForAuthMessages",
"arn": "arn:aws:iot:eu-west-2:123456789012:dimension/TopicFilterForAuthMessages"
}
Example
En este ejemplo, se crea una dimensión llamada MyFavoriteTopics con varios temas.
cli-input-json formato:
{
"clientRequestToken": "string",
"tags": [
{
"Key": "string",
"Value": "string"
}
],
"type": "string",
"string-values": "string"
}
719
AWS IoT Guía del desarrollador
CreateSecurityProfile
Salida:
{
"arn": "string",
"name": "string"
}
CreateSecurityProfile
Crea un perfil de seguridad de AWS IoT Device Defender
Sinopsis:
Example
Para definir un comportamiento con una dimensión, utilice el campo MetricDimension
situado junto a la métrica. Para conservar una métrica con una dimensión, utilice el campo
AdditionalMetricsToRetainV2. MetricDimension tiene un campo de operador que permite invertir
filtros de tema.
En el ejemplo siguiente, se muestra una definición que indica que no debería haber mensajes enviados a
otras dimensiones distintas de FavoriteTopics. Además, esta definición permite retener métricas sobre
el número de mensajes enviados al tema de autenticación.
Example
cli-input-json formato:
720
AWS IoT Guía del desarrollador
DeleteDimension
{
"additionalMetricsToRetainV2": [ "string" ],
"alertTargets": {
"string" : {
"alertTargetArn": "string",
"roleArn": "string"
}
},
"behaviors": [
{
"criteria": {
"comparisonOperator": "string",
"consecutiveDatapointsToAlarm": number,
"consecutiveDatapointsToClear": number,
"durationSeconds": number,
"statisticalThreshold": {
"statistic": "string"
},
"value": {
"cidrs": [ "string" ],
"count": number,
"ports": [ number ]
}
},
"metricDimension": [ "string" ],
"metric": "string",
"name": "string"
}
],
"securityProfileDescription": "string",
"tags": [
{
"Key": "string",
"Value": "string"
}
]
}
Salida:
{
"securityProfileName": "string",
"securityProfileArn": "string"
}
DeleteDimension
Elimina una dimensión de AWS IoT Device Defender. Solo se pueden eliminar las dimensiones que no se
estén utilizando en ningún perfil de seguridad.
Para eliminar una dimensión, primero debe desconectar la dimensión del comportamiento del perfil de
seguridad. Para obtener información, consulte UpdateSecurityProfile (p. 732).
Sinopsis:
721
AWS IoT Guía del desarrollador
DeleteSecurityProfile
Ejemplo
cli-input-json formato:
{
"name": "string",
"arn": "string",
"type": "TOPIC_FILTER",
"description": "string"
}
Salida:
Ninguna
DeleteSecurityProfile
Elimina un perfil de seguridad de AWS IoT Device Defender
Sinopsis:
cli-input-json formato:
{
"securityProfileName": "string",
"expectedVersion": "long"
}
Salida:
Ninguna
DescribeDimension
Obtiene información sobre una dimensión que se puede utilizar en comportamientos de un perfil de
seguridad de AWS IoT Device Defender.
722
AWS IoT Guía del desarrollador
DescribeDimension
Sinopsis:
Example
{
"name": "TopicFilterForAuthMessages",
"arn": "arn:aws:iot:eu-west-2:1123456789012:dimension/TopicFilterForAuthMessages",
"type": "TOPIC_FILTER",
"stringValues": [
"device/+/auth"
],
"creationDate": 1578620223.255,
"lastModifiedDate": 1578620223.255
}
cli-input-json formato:
{
"name": "string"
}
Salida:
{
"arn": "string",
"creationDate": number,
"lastModifiedDate": number,
"name": "string",
"type": "string",
"string-values": "string",
"additional-metrics-to-retain-v2": [ "string" ]
}
Example
{
"name": "TopicFilterForAuthMessages",
"arn": "arn:aws:iot:eu-west-2:123456789012:dimension/TopicFilterForAuthMessages",
"type": "TOPIC_FILTER",
"string-values": "device/+/auth",
"creationDate": 1578620223.255,
"lastModifiedDate": 1578620223.255
723
AWS IoT Guía del desarrollador
DescribeSecurityProfile
DescribeSecurityProfile
Obtiene información sobre un perfil de seguridad de AWS IoT Device Defender.
Sinopsis:
cli-input-json formato:
{
"securityProfileName": "string"
}
Salida:
{
"securityProfileName": "string",
"securityProfileArn": "string",
"securityProfileDescription": "string",
"behaviors": [
{
"name": "string",
"metricDimension": [ "string ],
"metric": "string",
"criteria": {
"comparisonOperator": "string",
"value": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"durationSeconds": "integer",
"consecutiveDatapointsToAlarm": "integer",
"consecutiveDatapointsToClear": "integer",
"statisticalThreshold": {
"statistic": "string"
}
}
}
],
"alertTargets": {
"string": {
"alertTargetArn": "string",
"roleArn": "string"
}
},
"additionalMetricsToRetain": [
"string"
],
724
AWS IoT Guía del desarrollador
DetachSecurityProfile
"version": "long",
"creationDate": "timestamp",
"lastModifiedDate": "timestamp"
}
DetachSecurityProfile
Desasocia un perfil de seguridad de AWS IoT Device Defender de un grupo de objetos o de esta cuenta de
AWS.
Sinopsis:
cli-input-json formato:
{
"securityProfileName": "string",
"securityProfileTargetArn": "string"
}
Salida:
Ninguno
ListActiveViolations
Enumera las infracciones activas de un perfil de seguridad de AWS IoT Device Defender.
Sinopsis:
cli-input-json formato:
{
"thingName": "string",
"securityProfileName": "string",
"nextToken": "string",
"maxResults": "integer"
}
Salida:
725
AWS IoT Guía del desarrollador
ListDimensions
{
"activeViolations": [
{
"violationId": "string",
"thingName": "string",
"securityProfileName": "string",
"behavior": {
"name": "string",
"dimensionNames": [ "string" ],
"metric": "string",
"criteria": {
"comparisonOperator": "string",
"value": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"durationSeconds": "integer",
"consecutiveDatapointsToAlarm": "integer",
"consecutiveDatapointsToClear": "integer",
"statisticalThreshold": {
"statistic": "string"
}
}
},
"lastViolationValue": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"lastViolationTime": "timestamp",
"violationStartTime": "timestamp"
}
],
"nextToken": "string"
}
ListDimensions
Muestra las dimensiones definidas en la cuenta de AWS que puede utilizar en los perfiles de seguridad de
AWS IoT Device Defender.
Para ver todos los perfiles de seguridad en los que se aplica una dimensión, utilice
ListSecurityProfiles (p. 727).
Sinopsis:
726
AWS IoT Guía del desarrollador
ListSecurityProfiles
Example
En este ejemplo, se muestran todas las dimensiones definidas para la cuenta de AWS.
cli-input-json formato:
{
"nextToken": "string",
"maxResults": "integer"
}
Salida:
{
"dimensionNames": [ "string" ],
"nextToken": "string"
}
ListSecurityProfiles
Muestra los perfiles de seguridad de AWS IoT Device Defender de la cuenta de AWS. Puede usar filtros
para enumerar solo los perfiles de seguridad asociados con un grupo de objetos o solo los asociados con
su cuenta.
Sinopsis:
Example
En el ejemplo siguiente, se muestran todos los perfiles de seguridad que tienen comportamientos que
utilizan la dimensión TopicFilterForAuthMessages.
{
"securityProfileIdentifiers": [
{
"name": "ExpectedBehaviorsForSmartDevice",
"arn": "arn:aws:iot:eu-west-2:123456789012:securityprofile/
ExpectedBehaviorsForSmartDevice"
}
]
}
727
AWS IoT Guía del desarrollador
ListSecurityProfilesForTarget
cli-input-json formato:
{
"nextToken": "string",
"maxResults": "integer"
}
Salida:
{
"securityProfileIdentifiers": [
{
"name": "string",
"arn": "string"
}
],
"nextToken": "string"
}
ListSecurityProfilesForTarget
Enumera los perfiles de seguridad de AWS IoT Device Defender que se han asociado a un destino (grupo
de objetos).
Sinopsis:
cli-input-json formato:
{
"nextToken": "string",
"maxResults": "integer",
"recursive": "boolean",
"securityProfileTargetArn": "string"
}
Salida:
{
"securityProfileTargetMappings": [
{
"securityProfileIdentifier": {
"name": "string",
"arn": "string"
},
"target": {
"arn": "string"
}
}
],
728
AWS IoT Guía del desarrollador
ListTargetsForSecurityProfile
"nextToken": "string"
}
ListTargetsForSecurityProfile
Enumera los destinos (grupos de objetos) asociados con un perfil de seguridad de AWS IoT Device
Defender determinado.
Sinopsis:
cli-input-json formato:
{
"securityProfileName": "string",
"nextToken": "string",
"maxResults": "integer"
}
Salida:
{
"securityProfileTargets": [
{
"arn": "string"
}
],
"nextToken": "string"
}
ListViolationEvents
Enumera las vulneraciones del perfil de seguridad de AWS IoT Device Defender descubiertas durante el
período de tiempo determinado. Puede usar filtros para limitar los resultados a aquellas alertas emitidas
para un perfil de seguridad, comportamiento u objeto en concreto (dispositivo).
Sinopsis:
729
AWS IoT Guía del desarrollador
UpdateDimension
cli-input-json formato:
{
"startTime": "timestamp",
"endTime": "timestamp",
"thingName": "string",
"securityProfileName": "string",
"nextToken": "string",
"maxResults": "integer"
}
Salida:
{
"violationEvents": [
{
"violationId": "string",
"thingName": "string",
"securityProfileName": "string",
"behavior": {
"name": "string",
"dimensionNames": [ "string" ],
"metric": "string",
"criteria": {
"comparisonOperator": "string",
"value": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"durationSeconds": "integer",
"consecutiveDatapointsToAlarm": "integer",
"consecutiveDatapointsToClear": "integer",
"statisticalThreshold": {
"statistic": "string"
}
}
},
"metricValue": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"violationEventType": "string",
"violationEventTime": "timestamp"
}
],
"nextToken": "string"
}
UpdateDimension
Actualice una dimensión para cambiar el ámbito de la métrica de un perfil de seguridad de AWS IoT Device
Defender. El ámbito se define proporcionando un valor o patrón que se utiliza como filtro. En el caso de las
730
AWS IoT Guía del desarrollador
UpdateDimension
dimensiones TOPIC_FILTER, este filtro especifica el subconjunto de temas de MQTT a los que se aplica el
comportamiento.
Sinopsis:
Example
{
"arn": "arn:aws:iot:eu-west-2:123456789012:dimension/TopicFilterForAuthMessages",
"creationDate": 1578620223.255,
"lastModifiedDate": 1578620223.255,
"name": "TopicFilterForAuthMessages",
"type": "TOPIC_FILTER",
"string-values": "device/+/auth"
}
cli-input-json formato:
{
"string-values": "string"
}
Salida:
{
"arn": "string",
"creationDate": number,
"lastModifiedDate": number,
"name": "string",
"type": "string",
"string-values": "string"
}
731
AWS IoT Guía del desarrollador
UpdateSecurityProfile
UpdateSecurityProfile
Actualiza un perfil de seguridad de AWS IoT Device Defender.
Sinopsis:
cli-input-json formato:
{
"securityProfileName": "string",
"securityProfileDescription": "string",
"behaviors": [
{
"name": "string",
"metricDimension": [ "string" ],
"metric": "string",
"criteria": {
"comparisonOperator": "string",
"value": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"durationSeconds": "integer",
"consecutiveDatapointsToAlarm": "integer",
"consecutiveDatapointsToClear": "integer",
"statisticalThreshold": {
"statistic": "string"
}
}
}
],
"alertTargets": {
"string": {
"alertTargetArn": "string",
"roleArn": "string"
}
},
"additionalMetricsToRetain": [
"string"
],
"deleteBehaviors": "boolean",
"deleteAlertTargets": "boolean",
"deleteAdditionalMetricsToRetain": "boolean",
732
AWS IoT Guía del desarrollador
ValidateSecurityProfileBehaviors
"expectedVersion": "long"
}
Salida:
{
"securityProfileName": "string",
"securityProfileArn": "string",
"securityProfileDescription": "string",
"behaviors": [
{
"name": "string",
"metricDimension": [ "string" ],
"metric": "string",
"criteria": {
"comparisonOperator": "string",
"value": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"durationSeconds": "integer",
"consecutiveDatapointsToAlarm": "integer",
"consecutiveDatapointsToClear": "integer",
"statisticalThreshold": {
"statistic": "string"
}
}
}
],
"alertTargets": {
"string": {
"alertTargetArn": "string",
"roleArn": "string"
}
},
"additionalMetricsToRetain": [
"string"
],
"version": "long",
"creationDate": "timestamp",
"lastModifiedDate": "timestamp"
}
ValidateSecurityProfileBehaviors
Valida la especificación de comportamiento de un perfil de seguridad de AWS IoT Device Defender.
Sinopsis:
cli-input-json formato:
733
AWS IoT Guía del desarrollador
Integración del agente de dispositivo
con AWS IoT Greengrass
{
"behaviors": [
{
"name": "string",
"metricDimension": [ "string" ],
"metric": "string",
"criteria": {
"comparisonOperator": "string",
"value": {
"count": "long",
"cidrs": [
"string"
],
"ports": [
"integer"
]
},
"durationSeconds": "integer",
"consecutiveDatapointsToAlarm": "integer",
"consecutiveDatapointsToClear": "integer",
"statisticalThreshold": {
"statistic": "string"
}
}
}
]
}
Salida:
{
"valid": "boolean",
"validationErrors": [
{
"errorMessage": "string"
}
]
}
Requisitos previos:
En general, el proceso que se describe aquí sigue las instrucciones que se detallan en la secciónCrear y
empaquetar una función Lambda de la Guía para desarrolladores de AWS IoT Greengrass.
734
AWS IoT Guía del desarrollador
Integración del agente de dispositivo
con AWS IoT Greengrass
3. Instale el agente de AWS IoT Device Defender de ejemplo en el entorno virtual. Realice la instalación
desde PyPi.
cd aws-iot-device-defender-agent-sdk-python
#This must be run from the same directory as setup.py
pip install .
5. Cree un directorio vacío para ensamblar su función Lambda. Este es el directorio Lambda.
mkdir metrics_lambda
cd metrics_lambda
unzip ../aws_greengrass_core_sdk/sdk/python_sdk_1_1_0.zip
cp -R ../aws_greengrass_core_sdk/examples/HelloWorld/greengrass_common .
cp -R ../aws_greengrass_core_sdk/examples/HelloWorld/greengrasssdk .
cp -R ../aws_greengrass_core_sdk/examples/HelloWorld/greengrass_ipc_python_sdk .
cp -R ../aws-iot-device-defender-agent-sdk-python/AWSIoTDeviceDefenderAgentSDK .
cp ../aws-iot-device-defender-agent-sdk-python/samples/greengrass/
greengrass_core_metrics_agent/greengrass_defender_agent.py .
10. Personalice el agente de AWS IoT Greengrass para que incluya el nombre de su dispositivo de AWS
IoT Greengrass principal y la velocidad de muestreo de las métricas que desee:
cp -R ../metrics_lambda_environment/lib/python2.7/site-packages/psutil .
cp -R ../metrics_lambda_environment/lib/python2.7/site-packages/cbor .
735
AWS IoT Guía del desarrollador
Prácticas recomendadas de seguridad
para agentes de dispositivos
12. Cree un archivo zip de su función Lambda. Ejecute este comando en el nivel raíz de su directorio
Lambda.
rm *.zip
zip -r greengrass_defender_metrics_lambda.zip *
• Siga las instrucciones de Obtener acceso a recursos locales con funciones Lambda. Use los
siguientes parámetros:
• Nombre del recurso: Core Proc
• Escriba: Volume
• Ruta de origen: /proc
• Ruta de destino: /host_proc
• Permiso de acceso a los archivos del propietario del grupo: añadir automáticamente los permisos
de grupo de SO del grupo de Linux que posea el recurso
• Asocie el recurso con su función Lambda de métricas.
6. Implemente su función Lambda en el grupo de AWS IoT Greengrass.
Para consultar las métricas de un dispositivo AWS IoT Device Defender a través de la consola de
AWS IoT
Al proceso del agente se debe otorgar solo los permisos mínimos necesarios para realizar sus tareas.
Mecanismos básicos
• El agente debe ejecutarse como un usuario no raíz.
• El agente se debe ejecutar como un usuario dedicado, en su propio grupo.
736
AWS IoT Guía del desarrollador
Prácticas recomendadas de seguridad
para agentes de dispositivos
• Al usuario/grupo se le deben otorgar permisos de solo lectura sobre los recursos necesarios para
recopilar y transmitir métricas.
• Ejemplo: solo lectura en /proc /sys para el agente de muestra.
• Para obtener un ejemplo de cómo configurar un proceso para que se ejecute con permisos
reducidos, consulte las instrucciones de configuración que se incluyen con el agente de muestra de
Python.
Hay una serie de mecanismos Linux conocidos que pueden ayudarle a restringir o aislar aún más el
proceso de su agente:
Mecanismos avanzados
• CGroups
• SELinux
• Chroot
• Espacios de nombres Linux
Resiliencia operativa
Un proceso de agente debe ser resiliente a errores y excepciones operativas inesperados y no debe
bloquearse ni salir de forma permanente. El código debe manejar con soltura excepciones y, como
precaución, debe configurarse para reiniciarse automáticamente en caso de terminación inesperada
(por ejemplo, debido a reinicios del sistema o excepciones no detectadas).
Dependencias mínimas
Un agente debe usar el menor número posible de dependencias (es decir, bibliotecas de terceros)
en su implementación. Si el uso de una biblioteca se justifica debido a la complejidad de una tarea
(por ejemplo, Transport Layer Security), use solo dependencias bien mantenidas y establezca un
mecanismo para mantenerlas actualizadas. Si las dependencias agregadas contienen funcionalidades
que el agente no usa y que están activas de manera predeterminada (por ejemplo, abrir puertos,
sockets de dominio), desactívelas en su código o por medio de los archivos de configuración de la
biblioteca.
Aislamiento de procesos
Un proceso de agente solo debe contener la funcionalidad requerida para realizar la recopilación y la
transmisión de métricas del dispositivo. No debe aprovecharse de otros procesos del sistema como
un contenedor ni implementar funcionalidad para otros casos de uso fuera de su ámbito. Además, el
proceso del agente debe abstenerse de crear canales de comunicación de entrada como puertos de
socket de dominio y de servicio de red que permitirían que procesos locales o remotos interfiriesen en
su funcionamiento e influyesen en su integridad y aislamiento.
Sigilo
El nombre de un proceso de agente no debe contener palabras clave como seguridad, monitorización
o auditoría que indiquen su finalidad y valor de seguridad. Se debe optar por nombres genéricos de
códigos y nombres de procesos aleatorios y únicos en cada dispositivo. Se debe seguir el mismo
principio al asignar nombre al directorio en el que residen los binarios del agente y los nombres y
valores de los argumentos del proceso.
Información mínima compartida
Ningún artefacto de agente implementado en los dispositivos debe contener información confidencial
como credenciales con privilegios, depuración ni código muerto, o comentarios insertados o archivos
de documentación que revelen detalles sobre el procesamiento del lado del servidor de métricas
recopiladas por el agente u otros detalles sobre sistemas backend.
Transport Layer Security
Para establecer canales seguros de TLS para la transmisión de datos, un agente debe hacer cumplir
todas las validaciones del lado del cliente, como la validación de certificados y nombres de dominio en
737
AWS IoT Guía del desarrollador
Prácticas recomendadas de seguridad
para agentes de dispositivos
738
AWS IoT Guía del desarrollador
AWS IoT publica mensajes de eventos cuando se producen determinados eventos. Por ejemplo, el registro
genera eventos cuando se añaden, actualizan o eliminan objetos. Cada evento provoca que se envíe un
único mensaje de evento. Los mensajes de evento se publican a través de MQTT con una carga JSON. El
contenido de la carga depende del tipo de evento.
Note
Se garantiza que los mensajes de eventos se publican una vez. Es posible que se publiquen más
de una. No se garantiza el orden de los mensajes de eventos.
Para recibir mensajes de eventos, el dispositivo debe usar una política adecuada que le permita
conectarse a la gateway de dispositivos de AWS IoT y suscribirse a los temas de eventos de MQTT.
También debe suscribirse a los filtros de temas adecuados.
A continuación, mostramos un ejemplo de política necesaria para recibir eventos del ciclo de vida:
{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Action":[
"iot:Subscribe",
"iot:Receive"
],
"Resource":[
"arn:aws:iot:region:account:/$aws/events/*"
]
}]
}
Puede controlar qué tipos de eventos se publican mediante una llamada a la API
UpdateEventConfigurations o utilizar el comando de la CLI update-event-configurations. Por ejemplo:
Todas las comillas (") van precedidas de barras diagonales invertidas (\).
Puede consultar las configuraciones de eventos actuales mediante una llamada a la API
DescribeEventConfigurations o utilizando el comando de la CLI describe-event-configurations. Por ejemplo:
{
"lastModifiedDate": 1552671347.841,
"eventConfigurations": {
"THING_TYPE": {
739
AWS IoT Guía del desarrollador
Eventos de registro
"Enabled": false
},
"JOB_EXECUTION": {
"Enabled": false
},
"THING_GROUP_HIERARCHY": {
"Enabled": false
},
"CERTIFICATE": {
"Enabled": false
},
"THING_TYPE_ASSOCIATION": {
"Enabled": false
},
"THING_GROUP_MEMBERSHIP": {
"Enabled": false
},
"CA_CERTIFICATE": {
"Enabled": false
},
"THING": {
"Enabled": true
},
"JOB": {
"Enabled": false
},
"POLICY": {
"Enabled": false
},
"THING_GROUP": {
"Enabled": false
}
},
"creationDate": 1552671347.84
}
Eventos de registro
El registro publica mensajes de eventos cuando se crean, actualizan o eliminan objetos, tipos de objetos y
grupos de objetos. El registro admite actualmente los siguientes tipos de eventos:
El registro publica los siguientes mensajes de eventos cuando se crean, actualizan o eliminan objetos:
• $aws/events/thing/<thingName>/created
• $aws/events/thing/<thingName>/updated
• $aws/events/thing/<thingName>/deleted
{
"eventType" : "THING_EVENT",
"eventId" : "f5ae9b94-8b8e-4d8e-8c8f-b3266dd89853",
"timestamp" : 1234567890123,
"operation" : "CREATED|UPDATED|DELETED",
"accountId" : "123456789012",
"thingId" : "b604f69c-aa9a-4d4a-829e-c480e958a0b5",
"thingName" : "MyThing",
"versionNumber" : 1,
"thingTypeName" : null,
740
AWS IoT Guía del desarrollador
Eventos de registro
"attributes": {
"attribute3": "value3",
"attribute1": "value1",
"attribute2": "value2"
}
}
Se establece en "THING_EVENT".
eventId
Su ID de cuenta de AWS.
thingId
La versión del objeto que se crea, actualiza o elimina. Este valor se establece en 1 cuando se
crea un objeto. Aumenta en 1 cada vez que se actualiza el objeto.
thingTypeName
El registro publica los siguientes mensajes de eventos cuando se crean, se descartan, se eliminan o
se quita la marca de descartado de los tipos de objetos:
• $aws/events/thingType/<thingTypeName>/created
• $aws/events/thingType/<thingTypeName>/updated
• $aws/events/thingType/<thingTypeName>/deleted
{
"eventType" : "THING_TYPE_EVENT",
"eventId" : "8827376c-4b05-49a3-9b3b-733729df7ed5",
"timestamp" : 1234567890123,
741
AWS IoT Guía del desarrollador
Eventos de registro
"operation" : "CREATED|UPDATED|DELETED",
"accountId" : "123456789012",
"thingTypeId" : "c530ae83-32aa-4592-94d3-da29879d1aac",
"thingTypeName" : "MyThingType",
"isDeprecated" : false|true,
"deprecationDate" : null,
"searchableAttributes" : [ "attribute1", "attribute2", "attribute3" ],
"description" : "My thing type"
}
Se establece en "THING_TYPE_EVENT".
eventId
Su ID de cuenta de AWS.
thingTypeId
El nombre del tipo de objeto que se crea o elimina, o que está descartado.
isDeprecated
Un conjunto de pares nombre-valor asociados con el tipo de objeto que puede utilizarse para
realizar búsquedas.
description
El registro publica los siguientes mensajes de eventos cuando se asocia o desasocia un tipo de objeto
a un objeto.
• $aws/events/thingTypeAssociation/thing/<thingName>/<typeName>
742
AWS IoT Guía del desarrollador
Eventos de registro
"eventId" : "87f8e095-531c-47b3-aab5-5171364d138d",
"eventType" : "THING_TYPE_ASSOCIATION_EVENT",
"operation" : "CREATED|DELETED",
"thingId" : "b604f69c-aa9a-4d4a-829e-c480e958a0b5",
"thingName": "myThing",
"thingTypeName" : "MyThingType",
"timestamp" : 1234567890123,
}
Se establece en "THING_TYPE_ASSOCIATION_EVENT".
operación
El registro publica los siguientes mensajes de eventos cuando se crea, actualiza o elimina un grupo de
objetos.
• $aws/events/thingGroup/<groupName>/created
• $aws/events/thingGroup/<groupName>/updated
• $aws/events/thingGroup/<groupName>/deleted
{
"eventType" : "THING_GROUP_EVENT",
"eventId" : "87f8e095-531c-47b3-aab5-5171364d138d",
"timestamp" : 1234567890123,
"operation" : "CREATED|UPDATED|DELETED",
"accountId" : "123456789012",
"thingGroupId" : "8f82a106-6b1d-4331-8984-a84db5f6f8cb",
"thingGroupName" : "MyRootThingGroup",
"versionNumber" : 1,
"parentGroupName" : null,
"parentGroupId" : null,
"description" : "My root thing group",
"rootToParentThingGroups" : null,
"attributes" : {
"attribute1" : "value1",
743
AWS IoT Guía del desarrollador
Eventos de registro
"attribute3" : "value3",
"attribute2" : "value2"
}
}
Se establece en "THING_GROUP_EVENT".
eventId
Su ID de cuenta de AWS.
thingGroupId
La versión del grupo de objetos. Este valor se establece en 1 cuando se crea un grupo de objetos.
Aumenta en 1 cada vez que se actualiza el grupo de objetos.
parentGroupName
Una matriz de información acerca del grupo principal de objetos. Hay una entrada para cada
grupo principal de objetos, que empieza por el elemento principal del grupo de objetos actual y
continúa hasta que se alcanza el grupo de objetos raíz. Cada entrada contiene el nombre del
grupo de objetos y el ARN del grupo de objetos.
attributes
El registro publica los siguientes mensajes de eventos cuando se añade un objeto a un grupo de
objetos o se elimina de este.
744
AWS IoT Guía del desarrollador
Eventos de registro
• $aws/events/thingGroupMembership/thingGroup/<thingGroupName>/
thing/<thingName>/added
• $aws/events/thingGroupMembership/thingGroup/<thingGroupName>/
thing/<thingName>/removed
{
"eventType" : "THING_GROUP_MEMBERSHIP_EVENT",
"eventId" : "d684bd5f-6f6e-48e1-950c-766ac7f02fd1",
"timestamp" : 1234567890123,
"operation" : "ADDED|REMOVED",
"accountId" : "123456789012",
"groupArn" : "arn:aws:iot:ap-northeast-2:123456789012:thinggroup/
MyChildThingGroup",
"groupId" : "06838589-373f-4312-b1f2-53f2192291c4",
"thingArn" : "arn:aws:iot:ap-northeast-2:123456789012:thing/MyThing",
"thingId" : "b604f69c-aa9a-4d4a-829e-c480e958a0b5",
"membershipId" : "8505ebf8-4d32-4286-80e9-c23a4a16bbd8"
}
Se establece en "THING_GROUP_MEMBERSHIP_EVENT".
eventId
El ID del evento.
timestamp
ADDED cuando se añade un objeto a un grupo de objetos. REMOVED cuando se elimina un objeto
de un grupo de objetos.
accountId
Su ID de cuenta de AWS.
groupArn
El ID del grupo.
thingArn
Un ID que representa la relación entre objeto y el grupo de objetos. Este valor se genera cuando
añade un objeto a un grupo de objetos.
Grupo de objetos añadido o eliminado de un grupo de objetos
El registro publica los siguientes mensajes de eventos cuando se añade un grupo de objetos a otro
grupo de objetos o se elimina de este.
745
AWS IoT Guía del desarrollador
Eventos de trabajos
• $aws/events/thingGroupHierarchy/thingGroup/<parentThingGroupName>/
childThingGroup/<childThingGroupName>/added
• $aws/events/thingGroupHierarchy/thingGroup/<parentThingGroupName>/
childThingGroup/<childThingGroupName>/removed
{
"eventType" : "THING_GROUP_HIERARCHY_EVENT",
"eventId" : "264192c7-b573-46ef-ab7b-489fcd47da41",
"timestamp" : 1234567890123,
"operation" : "ADDED|REMOVED",
"accountId" : "123456789012",
"thingGroupId" : "8f82a106-6b1d-4331-8984-a84db5f6f8cb",
"thingGroupName" : "MyRootThingGroup",
"childGroupId" : "06838589-373f-4312-b1f2-53f2192291c4",
"childGroupName" : "MyChildThingGroup"
}
Se establece en "THING_GROUP_HIERARCHY_EVENT".
eventId
El ID del evento.
timestamp
ADDED cuando se añade un objeto a un grupo de objetos. REMOVED cuando se elimina un objeto
de un grupo de objetos.
accountId
Su ID de cuenta de AWS.
thingGroupId
Eventos de trabajos
El servicio Jobs de AWS IoT también publica en temas reservados en el protocolo MQTT cuando
los trabajos están pendientes, completados o cancelados y cuando un dispositivo informa del éxito
746
AWS IoT Guía del desarrollador
Eventos de trabajos
o del fracaso cuando se ejecuta un trabajo. Los dispositivos o las aplicaciones de administración y
monitorización pueden realizar un seguimiento del estado de los trabajos mediante la suscripción a estos
temas. Utilice la API UpdateEventConfigurations para controlar los tipos de eventos de trabajo que recibe.
Dado que cancelar o eliminar un trabajo puede llevar un tiempo, se envían dos mensajes para indicar
el comienzo y el final de una solicitud. Por ejemplo, cuando se inicia una solicitud de cancelación, se
envía un mensaje al tema $aws/events/job/jobID/cancellation_in_progress. Cuando finaliza
una solicitud de cancelación, se envía un mensaje al tema $aws/events/job/jobID/canceled.
En las solicitudes de eliminación de trabajos se lleva a cabo un proceso parecido. Las aplicaciones de
administración y monitorización pueden suscribirse a estos temas y hacer un seguimiento del estado de los
trabajos.
Para obtener más información acerca de cómo publicar en temas de MQTT y suscribirse a ellos, consulte
Agente de mensajes de AWS IoT (p. 266).
El servicio Jobs de AWS IoT publica un mensaje en un tema de MQTT cuando se completa, cancela o
elimina un trabajo, o bien cuando la cancelación o la eliminación está en curso:
• $aws/events/job/jobID/completed
• $aws/events/job/jobID/canceled
• $aws/events/job/jobID/deleted
• $aws/events/job/jobID/cancellation_in_progress
• $aws/events/job/jobID/deletion_in_progress
{
"eventType": "JOB",
"eventId": "7364ffd1-8b65-4824-85d5-6c14686c97c6",
"timestamp": 1234567890,
"operation": "completed",
"jobId": "27450507-bf6f-4012-92af-bb8a1c8c4484",
"status": "COMPLETED",
"targetSelection": "SNAPSHOT|CONTINUOUS",
"targets": [
"arn:aws:iot:us-east-1:123456789012:thing/a39f6f91-70cf-4bd2-a381-9c66df1a80d0",
"arn:aws:iot:us-east-1:123456789012:thinggroup/2fc4c0a4-6e45-4525-
a238-0fe8d3dd21bb"
],
"description": "My Job Description",
"completedAt": 1234567890123,
"createdAt": 1234567890123,
"lastUpdatedAt": 1234567890123,
"jobProcessDetails": {
"numberOfCanceledThings": 0,
"numberOfRejectedThings": 0,
"numberOfFailedThings": 0,
"numberOfRemovedThings": 0,
"numberOfSucceededThings": 3
}
}
{
"eventType": "JOB",
"eventId": "568d2ade-2e9c-46e6-a115-18afa1286b06",
"timestamp": 1234567890,
747
AWS IoT Guía del desarrollador
Eventos de trabajos
"operation": "canceled",
"jobId": "4d2a531a-da2e-47bb-8b9e-ff5adcd53ef0",
"status": "CANCELED",
"targetSelection": "SNAPSHOT|CONTINUOUS",
"targets": [
"arn:aws:iot:us-east-1:123456789012:thing/Thing0-947b9c0c-ff10-4a80-b4b3-
cd33d0145a0f",
"arn:aws:iot:us-east-1:123456789012:thinggroup/ThingGroup1-95c644d5-1621-41a6-9aa5-
ad2de581d18f"
],
"description": "My job description",
"createdAt": 1234567890123,
"lastUpdatedAt": 1234567890123
}
{
"eventType": "JOB",
"eventId": "568d2ade-2e9c-46e6-a115-18afa1286b06",
"timestamp": 1234567890,
"operation": "deleted",
"jobId": "4d2a531a-da2e-47bb-8b9e-ff5adcd53ef0",
"status": "DELETED",
"targetSelection": "SNAPSHOT|CONTINUOUS",
"targets": [
"arn:aws:iot:us-east-1:123456789012:thing/Thing0-947b9c0c-ff10-4a80-b4b3-
cd33d0145a0f",
"arn:aws:iot:us-east-1:123456789012:thinggroup/
ThingGroup1-95c644d5-1621-41a6-9aa5-ad2de581d18f"
],
"description": "My job description",
"createdAt": 1234567890123,
"lastUpdatedAt": 1234567890123,
"comment": "Comment for this operation"
}
{
"eventType": "JOB",
"eventId": "568d2ade-2e9c-46e6-a115-18afa1286b06",
"timestamp": 1234567890,
"operation": "cancellation_in_progress",
"jobId": "4d2a531a-da2e-47bb-8b9e-ff5adcd53ef0",
"status": "CANCELLATION_IN_PROGRESS",
"targetSelection": "SNAPSHOT|CONTINUOUS",
"targets": [
"arn:aws:iot:us-east-1:123456789012:thing/Thing0-947b9c0c-ff10-4a80-b4b3-
cd33d0145a0f",
"arn:aws:iot:us-east-1:123456789012:thinggroup/
ThingGroup1-95c644d5-1621-41a6-9aa5-ad2de581d18f"
],
"description": "My job description",
"createdAt": 1234567890123,
"lastUpdatedAt": 1234567890123,
"comment": "Comment for this operation"
}
748
AWS IoT Guía del desarrollador
Eventos del ciclo de vida
"eventType": "JOB",
"eventId": "568d2ade-2e9c-46e6-a115-18afa1286b06",
"timestamp": 1234567890,
"operation": "deletion_in_progress",
"jobId": "4d2a531a-da2e-47bb-8b9e-ff5adcd53ef0",
"status": "DELETION_IN_PROGRESS",
"targetSelection": "SNAPSHOT|CONTINUOUS",
"targets": [
"arn:aws:iot:us-east-1:123456789012:thing/Thing0-947b9c0c-ff10-4a80-b4b3-
cd33d0145a0f",
"arn:aws:iot:us-east-1:123456789012:thinggroup/
ThingGroup1-95c644d5-1621-41a6-9aa5-ad2de581d18f"
],
"description": "My job description",
"createdAt": 1234567890123,
"lastUpdatedAt": 1234567890123,
"comment": "Comment for this operation"
}
El servicio Jobs de AWS IoT publica un mensaje cuando un dispositivo actualiza la ejecución de un
trabajo al estado final:
• $aws/events/jobExecution/jobID/succeeded
• $aws/events/jobExecution/jobID/failed
• $aws/events/jobExecution/jobID/rejected
• $aws/events/jobExecution/jobID/canceled
• $aws/events/jobExecution/jobID/timed_out
• $aws/events/jobExecution/jobID/removed
• $aws/events/jobExecution/jobID/deleted
{
"eventType": "JOB_EXECUTION",
"eventId": "cca89fa5-8a7f-4ced-8c20-5e653afb3572",
"timestamp": 1234567890,
"operation": "succeeded|failed|rejected|canceled|removed|timed_out",
"jobId": "154b39e5-60b0-48a4-9b73-f6f8dd032d27",
"thingArn": "arn:aws:iot:us-east-1:123456789012:myThing/6d639fbc-8f85-4a90-924d-
a2867f8366a7",
"status": "SUCCEEDED|FAILED|REJECTED|CANCELED|REMOVED|TIMED_OUT",
"statusDetails": {
"key": "value"
}
}
Es posible que los mensajes de ciclo de vida se envíen de forma desordenada. Puede que reciba
mensajes duplicados.
749
AWS IoT Guía del desarrollador
Eventos de conexión/desconexión
Eventos de conexión/desconexión
AWS IoT publica un mensaje en los siguientes temas MQTT cuando un cliente se conecta o se
desconecta:
A continuación, se muestra una lista de elementos JSON que se encuentran en los mensajes de conexión/
desconexión publicados en el tema $aws/events/presence/connected/clientId.
clientId
Los ID de cliente que contienen los símbolos # o + no recibirán eventos del ciclo de vida.
clientInitiatedDisconnect
True si el cliente inició la desconexión. De lo contrario, devuelve false. Solo se encuentra en los
mensajes de desconexión.
disconnectReason
La razón por la que el cliente se está desconectando. Sólo se encuentra en mensajes de desconexión.
La tabla siguiente contiene valores válidos.
750
AWS IoT Guía del desarrollador
Eventos de conexión/desconexión
eventType
La dirección IP del cliente que se conecta. Puede estar en formato IPv4 o IPv6. Sólo se encuentra en
los mensajes de conexión.
principalIdentifier
Las credenciales que se utilizan para la autenticación. En el caso de los certificados de autenticación
mutua de TLS, se trata del ID de certificado. En cuanto a las demás conexiones, se trata de las
credenciales de IAM.
sessionIdentifier
Un identificador único global de AWS IoT que existe durante toda la vida de la sesión.
timestamp
Aproximación del momento en que se produjo el evento, expresada en milisegundos según la fecha de
inicio Unix. La precisión de la marca de tiempo es de +/- 2 minutos.
versionNumber
El número de versión del evento del ciclo de vida. Se trata de un valor entero largo que aumenta de
forma monótona para cada conexión de un ID de cliente. El número de versión puede utilizarlo un
suscriptor para deducir el orden de los eventos del ciclo de vida.
Note
Los mensajes de conexión y desconexión de una conexión de cliente tienen el mismo número
de versión.
El número de versión podría saltarse algunos valores y no se garantiza que se vaya a
incrementar de forma coherente en 1 para cada evento.
Si un cliente no se conecta durante aproximadamente una hora, el número de versión se
restablece a 0. Para las sesiones persistentes, el número de versión se restablece a 0
después de que un cliente se haya desconectado durante un periodo mayor que el tiempo de
vida (TTL) configurado para la sesión persistente.
751
AWS IoT Guía del desarrollador
Eventos de suscripción/cancelación de suscripción
{
"clientId": "186b5",
"timestamp": 1573002230757,
"eventType": "connected",
"sessionIdentifier": "a4666d2a7d844ae4ac5d7b38c9cb7967",
"principalIdentifier": "12345678901234567890123456789012",
"ipAddress": "192.0.2.0",
"versionNumber": 0
}
{
"clientId": "186b5",
"timestamp": 1573002340451,
"eventType": "disconnected",
"sessionIdentifier": "a4666d2a7d844ae4ac5d7b38c9cb7967",
"principalIdentifier": "12345678901234567890123456789012",
"clientInitiatedDisconnect": true,
"disconnectReason": "CLIENT_INITIATED_DISCONNECT",
"versionNumber": 0
}
$aws/events/subscriptions/subscribed/clientId
$aws/events/subscriptions/unsubscribed/clientId
Donde clientId es el ID de cliente MQTT que se conecta con el agente de mensajes de AWS IoT.
{
"clientId": "186b5",
"timestamp": 1460065214626,
"eventType": "subscribed" | "unsubscribed",
"sessionIdentifier": "00000000-0000-0000-0000-000000000000",
752
AWS IoT Guía del desarrollador
Eventos de suscripción/cancelación de suscripción
"principalIdentifier": "000000000000/ABCDEFGHIJKLMNOPQRSTU:some-user/
ABCDEFGHIJKLMNOPQRSTU:some-user",
"topics" : ["foo/bar","device/data","dog/cat"]
}
A continuación, se ofrece una lista de elementos JSON que se encuentran en los mensajes suscritos y no
suscritos publicados en los temas $aws/events/subscriptions/subscribed/clientId y $aws/
events/subscriptions/unsubscribed/clientId.
clientId
Los ID de cliente que contienen los símbolos # o + no recibirán eventos del ciclo de vida.
eventType
Las credenciales que se utilizan para la autenticación. En el caso de los certificados de autenticación
mutua de TLS, se trata del ID de certificado. En cuanto a las demás conexiones, se trata de las
credenciales de IAM.
sessionIdentifier
Un identificador único global de AWS IoT que existe durante toda la vida de la sesión.
timestamp
Aproximación del momento en que se produjo el evento, expresada en milisegundos según la fecha de
inicio Unix. La precisión de la marca de tiempo es de +/- 2 minutos.
topics
Note
Es posible que los mensajes de ciclo de vida se envíen de forma desordenada. Puede que reciba
mensajes duplicados.
753
AWS IoT Guía del desarrollador
Actualmente, los dispositivos de IoT domésticos inteligentes se fabrican con microcontroladores de bajo
costo (MCU) que tienen memoria limitada para ejecutar sistemas operativos en tiempo real. Anteriormente,
las soluciones AVS para productos integrados de Alexa requerían costosos dispositivos basados en
procesadores de aplicaciones con más de 50 MB de memoria ejecutándose en Linux o Android. Con
estos costosos requisitos de hardware, resultaba prohibitivo integrar Alexa Voice en dispositivos IoT con
recursos limitados. AVS para AWS IoT permite integrar la funcionalidad de Alexa en MCU, como la clase
de procesadores ARM Cortex M con menos de 1 MB de RAM integrada. Para ello, AVS transfiere las
tareas de memoria y computación a un dispositivo virtual de Alexa integrado en la nube. Esto reduce el
costo de eBoM hasta en un 50 %.
Para obtener más información sobre los procesadores de la serie ARM Cortex-M, consulte ARM o
Wikipedia. Para obtener más información acerca de los requisitos de hardware para los productos
integrados de Alexa, consulte Aumento de la CPU, la memoria y el almacenamiento del dispositivo
integrado de Alexa en el portal para desarrolladores de Amazon Alexa.
Note
AVS para AWS IoT está disponible en todas las regiones de AWS en las que el AWS IoT está
disponible, excepto en las regiones de China (Pekín y Ningxia). Para obtener la lista actual de
regiones de AWS, consulte la tabla de regiones de AWS.
• Un conjunto de temas de MQTT reservados para transferir mensajes de audio entre dispositivos
compatibles con Alexa y AVS.
• Un dispositivo virtual habilitado para Alexa en la nube que transfiere las tareas relacionadas con la
recuperación de medios, la descodificación de audio, la mezcla de audio y la administración del estado
del dispositivo físico al dispositivo virtual.
• Un conjunto de API que permiten la recepción y el envío de mensajes a través de temas reservados, la
interacción con el micrófono y el altavoz del dispositivo, y la administración del estado del dispositivo.
El siguiente diagrama ilustra cómo estos componentes funcionan juntos. También muestra cómo los
fabricantes de dispositivos utilizan el servicio Login with Amazon para autenticarse en el servicio AVS.
754
AWS IoT Guía del desarrollador
Introducción a Integración Alexa Voice Service
(AVS) para AWS IoT en un dispositivo NXP
Los fabricantes de dispositivos tienen dos opciones para comenzar a utilizar la integración de AVS para
AWS IoT .
• Kits de desarrollo: los kits de desarrollo lanzados por nuestros socios permiten empezar a utilizar
el servicio fácilmente. Los kits de desarrollo de NXP i.MX RT 106 A y Qualcomm Home Hub 100
Development Kit for Amazon AVS son los dos primeros kits disponibles en el mercado. Puede
encontrarlos en Kits de desarrollo para AVS. Los kits incluyen conectividad inmediata con AWS IoT,
algoritmos de audio aptos para AVS para captura de voz de largo alcance, cancelación de eco, Alexa
Wake Word y AVS para código de aplicación de AWS IoT. Puede usar el código de la aplicación para
crear rápidamente prototipos de un dispositivo y mover la implementación al diseño de MCU elegido
para las pruebas y producción de dispositivos cuando esté listo.
• Código de aplicación personalizado del lado del dispositivo: los desarrolladores también pueden
escribir una aplicación de AVS para AWS IoT personalizada mediante la API disponible públicamente.
La documentación de esta API está disponible en la página para desarrolladores de AVS. Puede
descargar el SDK de FreeRTOS y AWS IoT Device desde la consola de FreeRTOS (https://
console.aws.amazon.com/freertos/) o GitHub.
Para empezar a utilizar un kit de desarrollo NXP i.MX 106A, consulte Introducción a Integración Alexa
Voice Service (AVS) para AWS IoT en un dispositivo NXP.
755
AWS IoT Guía del desarrollador
Vista previa de Integración Alexa Voice Service (AVS)
para AWS IoT con una cuenta de NXP preconfigurada
de la funcionalidad con la cuenta de NXP, debe personalizar el firmware, el código fuente de la aplicación y
la aplicación móvil de NXP proporcionada con el kit para usar su propia cuenta. En este tema se describen
los pasos para obtener una vista previa con la cuenta preconfigurada y personalizar el dispositivo con su
propia cuenta.
Temas
• Vista previa de Integración Alexa Voice Service (AVS) para AWS IoT con una cuenta de NXP
preconfigurada (p. 756)
• Utilice sus cuentas de desarrollador de AWS y Alexa Voice Service para configurar AVS para AWS
IoT (p. 759)
756
AWS IoT Guía del desarrollador
Vista previa de Integración Alexa Voice Service (AVS)
para AWS IoT con una cuenta de NXP preconfigurada
Cuando la placa tenga alimentación, el LED D1 se iluminará con una luz verde. El LED D2 (más
cercano al altavoz) indica el estado del dispositivo. Cuando el dispositivo se enciende, este LED
parpadea en varios colores. Cuando el dispositivo ejecuta el código de la aplicación, el LED D2
parpadea en amarillo. Cuando se completa la inicialización del dispositivo, la luz del LED D2 cambia a
color naranja para indicar que está esperando a que se añadan las credenciales de la conexión wifi al
dispositivo.
La Guía del usuario de NXP contiene una descripción de los controles físicos del dispositivo.
757
AWS IoT Guía del desarrollador
Vista previa de Integración Alexa Voice Service (AVS)
para AWS IoT con una cuenta de NXP preconfigurada
3. Utilice la aplicación del terminal para saber cómo funciona la aplicación cliente en el dispositivo.
También puede usarla para depurar y asegurarse de que el dispositivo tenga el estado correcto.
a. Siga estos pasos para aprovisionar las credenciales de la conexión wifi mediante la aplicación
móvil.
i. Cuando el dispositivo arranca desde su nuevo estado de fábrica, crea un punto de acceso
wifi. Abra la aplicación móvil auxiliar y elija WIFI PROVISION (APROVISIONAR WIFI) para
conectarse a este punto de acceso.
ii. Elija una red de la lista.
iii. Escriba su contraseña y elija Send (Enviar) para transmitir las credenciales al kit del
dispositivo.
758
AWS IoT Guía del desarrollador
Utilice sus cuentas de desarrollador de AWS y Alexa
Voice Service para configurar AVS para AWS IoT
Para ello, pulse el botón Discover (Detectar) en la aplicación móvil. Cuando termine la detección,
verá una lista de números de serie de los kits de dispositivo disponibles que se encuentran cerca.
Si hay más de uno disponible, puede confirmar el número de serie único de su kit escribiendo
serial_number en la aplicación del terminal.
4. Elija el kit de dispositivo que desea usar. La aplicación móvil utiliza el servicio Login with Amazon
para solicitarle sus credenciales de usuario de Amazon. El kit del dispositivo comienza a registrar el
dispositivo en AVS. La luz del LED D2 cambia a morado para indicar que el registro del dispositivo ha
comenzado.
Note
Después de iniciar sesión en su cuenta de Amazon, la aplicación auxiliar realiza los siguientes pasos:
1. El kit del dispositivo recibe el token de acceso del servicio Login with Amazon y comienza a conectar el
dispositivo a AWS IoT y AVS. La aplicación móvil muestra un porcentaje de finalización. La luz del LED
D2 del dispositivo cambia a naranja.
2. El LED D1 parpadea en verde cada 500 milisegundos hasta que el dispositivo se conecta a AWS IoT.
3. Cuando el dispositivo se conecta a AWS IoT, el kit del dispositivo comienza a conectar el dispositivo a
AVS. El LED D1 parpadea en verde cada 250 milisegundos.
4. Cuando el dispositivo se conecta a AVS, el color del número de serie del kit del dispositivo cambia a
amarillo en la aplicación móvil. La aplicación móvil muestra el mensaje Complete (Completado). El LED
D1 se apaga y el dispositivo emite un sonido de campana. El dispositivo está ahora conectado a la
cuenta de AWS IoT de NXP.
759
AWS IoT Guía del desarrollador
Utilice sus cuentas de desarrollador de AWS y Alexa
Voice Service para configurar AVS para AWS IoT
Utilice el siguiente script y los siguientes comandos para convertir los certificados y las claves. El script
bin_dump.py está en la carpeta Tools\Ivaldi.zip\Scripts\sln_alexa_iot_utils.
Para obtener información acerca de las opciones para generar credenciales para dispositivos de
producción a escala, consulte Aprovisionamiento de dispositivos (p. 535).
760
AWS IoT Guía del desarrollador
Utilice sus cuentas de desarrollador de AWS y Alexa
Voice Service para configurar AVS para AWS IoT
3. En Android Studio, elija Build Project (Crear proyecto) y Generate a Signed Bundle/APK (Generar un
paquete firmado/APK). Para obtener más información, consulte la sección 4 "Creación y generación
de la aplicación móvil" en la Guía de migración de NXP. Para obtener más información acerca de
cómo realizar la autorización con Alexa de esta manera, consulte la página sobre cómo autorizar
desde una aplicación auxiliar (Android/iOS).
4. Instale la aplicación móvil actualizada en su dispositivo móvil. Configure ADB en su equipo Mac e
instale el archivo APK de Android actualizado en su teléfono móvil mediante la consola del terminal. Si
instaló la aplicación móvil para obtener una vista previa del servicio AVS para AWS IoT con la cuenta
de NXP preconfigurada, debe desinstalar y volver a instalar la aplicación.
1. Siga las instrucciones de la sección 3 y la sección 4 de la Guía para desarrolladores de NXP y realice
las modificaciones necesarias en el controlador Segger J-Link. En estas instrucciones, también se
explica cómo importar los proyectos bootstrap, Bootloader y ais_demo utilizando el IDE de
MCUxPresso.
2. Siga las instrucciones para actualizar el código fuente y volver a crear la aplicación que se indican en
la sección 7 "Cambios en el firmware RT106A" de la Guía de migración de NXP. Le recomendamos
que utilice MCUXPRESSOPresso v10.3.1.
Estos cambios en el código fuente permiten que el firmware del dispositivo se comunique con su
cuenta de AWS y su producto AVS en lugar de con la cuenta de NXP predeterminada.
1. Restablezca el dispositivo a los ajustes de fábrica. Si ha obtenido una vista previa del servicio AVS
para AWS IoT con la cuenta de NXP preconfigurada, debe restablecer el firmware del dispositivo antes
de iniciar sesión de nuevo con la aplicación móvil auxiliar. Esto garantiza que la aplicación móvil y el
dispositivo utilicen su perfil de seguridad. Asegúrese de que el dispositivo está conectado al equipo.
Pulse SW1 durante 10 segundos para iniciar el restablecimiento de fábrica.
La Guía del usuario de NXP, que se incluye en el paquete de software de NXP, contiene una
descripción de los controles físicos del dispositivo.
2. Vuelva a programar el firmware para utilizar el certificado y la clave que generó para el dispositivo.
Agregue la clave y el certificado a los binarios Bootstrap y Ais_demo actualizados que creó en el
procedimiento anterior. También es recomendable volver a programar el firmware con los binarios
Intelligent toolbox, app_crt y CA_crt predeterminados.
761
AWS IoT Guía del desarrollador
SDK de AWS Mobile para Android
Los SDK de AWS IoT para dispositivos y móviles le permiten conectar los dispositivos a AWS IoT de
forma sencilla y rápida. Los de AWS IoT para dispositivos y móviles contienen bibliotecas de código
abierto, guías para desarrolladores con ejemplos y guías de portabilidad para que pueda crear innovadores
productos y soluciones de IoT en las plataformas de hardware que prefiera. Para obtener información
sobre los SDK de AWS que se utilizan para acceder a las API de AWS, consulte los SDKs y las
herramientas de AWS.
Note
762
AWS IoT Guía del desarrollador
AWS IoT Device SDK para Embedded C
763
AWS IoT Guía del desarrollador
AWS IoT device SDK for JavaScript
764
AWS IoT Guía del desarrollador
Diagnóstico de problemas de conectividad
Tareas
• Diagnóstico de problemas de conectividad (p. 765)
• Diagnóstico de problemas de las reglas (p. 765)
• Diagnóstico de problemas relacionados con las sombras (p. 766)
• Diagnosticar problemas con acciones del flujo de entrada de Salesforce IoT (p. 768)
• Solución de problemas de consultas de agregación en el servicio de indexación de flotas (p. 769)
• Guía para solucionar problemas de AWS IoT Device Defender (p. 770)
• Errores de AWS IoT (p. 772)
Ejecute el comando s_client de OpenSSL para probar una conexión con el punto de enlace de
AWS IoT:
Para obtener más información sobre el uso de openssl s_client, consulte Documentación de
OpenSSL s_client.
Autorización
He recibido una respuesta PUBNACK o SUBNACK del agente. ¿Qué tengo que hacer?
Asegúrese de que el certificado que utilice para llamar a AWS IoT tenga una política asociada. De
forma predeterminada, todas las operaciones de publicación o suscripción se deniegan.
El problema más habitual de las reglas es la autorización. Los registros se muestran si el rol no está
autorizado a realizar operaciones AssumeRole en el recurso. A continuación hay un log de ejemplo
generado por el registro detallado (p. 225):
765
AWS IoT Guía del desarrollador
Diagnóstico de problemas relacionados con las sombras
{
"timestamp": "2017-12-09 22:49:17.954",
"logLevel": "ERROR",
"traceId": "ff563525-6469-506a-e141-78d40375fc4e",
"accountId": "123456789012",
"status": "Failure",
"eventType": "RuleExecution",
"clientId": "iotconsole-123456789012-3",
"topicName": "test-topic",
"ruleName": "rule1",
"ruleAction": "DynamoAction",
"resources": {
"ItemHashKeyField": "id",
"Table": "trashbin",
"Operation": "Insert",
"ItemHashKeyValue": "id",
"IsPayloadJSON": "true"
},
"principalId": "ABCDEFG1234567ABCD890:outis",
"details": "User: arn:aws:sts::123456789012:assumed-role/dynamo-testbin/5aUMInJH
is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-
east-1:123456789012:table/testbin (Service: AmazonDynamoDBv2; Status Code: 400; Error Code:
AccessDeniedException; Request ID: AKQJ987654321AKQJ123456789AKQJ987654321AKQJ987654321)"
}
A continuación hay un log de ejemplo similar generado por el registro global (p. 223):
Para obtener más información, consulte the section called “Visualización de registros de AWS IoT en la
consola de CloudWatch” (p. 239).
El usuario final controla los servicios externos. Antes de ejecutar la regla, asegúrese de que los servicios
externos estén configurados con suficientes unidades de capacidad y procesamiento.
766
AWS IoT Guía del desarrollador
Diagnóstico de problemas relacionados con las sombras
He recibido un error que indica que la sombra del La sombra del dispositivo admite únicamente
dispositivo supera el tamaño máximo permitido. 8 KB de datos. Intente acortar los nombres de los
campos que están dentro del documento JSON
o cree más sombras generando más objetos.
Un dispositivo puede tener asociado un número
ilimitado de objetos o sombras. El único requisito
es que cada nombre de objeto debe ser único en la
cuenta.
Cuando recibo la sombra de un dispositivo, esta En la recepción, el servicio de AWS IoT agrega
supera los 8 KB. ¿Por qué pasa esto? metadatos a la sombra del dispositivo. El servicio
incluye estos datos en su respuesta, pero no
cuentan para el límite de 8 KB. Para calcular el
límite, solo se tienen en cuenta los datos de estado
desired y reported del documento de estado
enviado a la sombra del dispositivo.
Mi solicitud se ha rechazado porque la versión es Realice una operación GET para sincronizarse con
incorrecta. ¿Qué tengo que hacer? la última versión del documento de estado. Al usar
MQTT, suscríbase al tema /update/accepted para
recibir notificaciones sobre cambios de estado y la
última versión del documento JSON.
La marca de tiempo está desajustada en varios El servicio AWS IoT actualiza la marca de tiempo
segundos. de algunos campos individuales y de todo el
documento JSON cuando los recibe; la marca de
tiempo también se actualiza cuando el documento
de estado se publica en el mensaje ./update/
accepted y ./update/delta. Los mensajes pueden
retrasarse en la red, lo que puede provocar una
demora de varios segundos en la marca de tiempo.
Mi dispositivo puede publicar en los temas de Compruebe que haya creado políticas en IAM que
sombra correspondientes y suscribirse a ellos, permitan a sus credenciales tener acceso a estos
pero cuando intento actualizar el documento de temas y a su acción correspondiente (UPDATE/
sombra mediante la API de REST de HTTP, recibo GET/DELETE). Las políticas de IAM y las de
un mensaje HTTP 403. certificado son independientes.
767
AWS IoT Guía del desarrollador
Diagnosticar problemas con acciones de Salesforce
Consulte la sección Monitoreo de AWS IoT mediante CloudWatch Logs (p. 239). Una vez que haya
activado los registros, podrá ver el seguimiento de la ejecución de la acción de Salesforce.
Consulte los registros generados por la ejecución de la acción de Salesforce en CloudWatch Logs.
Si aparece Action executed successfully, eso significa que el motor de reglas de AWS IoT
recibió la confirmación de Salesforce IoT de que el mensaje se envió correctamente al flujo de entrada
de destino.
Si tiene problemas con la plataforma de Salesforce IoT, póngase en contacto con la ayuda de
Salesforce IoT.
¿Qué hago si los mensajes no se han enviado correctamente a un flujo de entrada de Salesforce IoT?
Consulte los registros generados por la ejecución de la acción de Salesforce en CloudWatch Logs. En
función de la entrada de registro, puede realizar las siguientes operaciones:
Failed to locate the host
Compruebe que el parámetro url de la acción es correcto y que el flujo de entrada de Salesforce
IoT existe.
Received Internal Server Error from Salesforce
Salesforce IoT no admite una carga binaria en este momento. Compruebe que está enviando una
carga JSON.
Received Unauthorized Exception from Salesforce
Compruebe que el parámetro token de la acción es correcto y que su token sigue siendo válido.
Received Not Found Exception from Salesforce
Compruebe que el parámetro url de la acción es correcto y que el flujo de entrada de Salesforce
IoT existe.
Si recibe un error que no aparece aquí, póngase en contacto con AWS Support.
768
AWS IoT Guía del desarrollador
Solución de problemas de consultas de
agregación en el servicio de indexación de flotas
Cuando realiza consultas de agregación en campos no administrados, solo puede especificar un campo
definido en el argumento customFields pasado a UpdateIndexingConfiguration o update-
indexing-configuration. Si el valor del campo no coincide con el tipo de datos del campo configurado, este
valor se omite al realizar una consulta de agregación.
El servicio de indexación de flotas envía un registro de errores a CloudWatch Logs cuando un campo no
se puede indexar debido a un tipo no coincidente. El registro de errores contiene el nombre del campo,
el valor que no se pudo convertir y el nombre de objeto del dispositivo. A continuación, se muestra un
ejemplo de registro de error.
{
"timestamp": "2017-02-20 20:31:22.932",
"logLevel": "ERROR",
"traceId": "79738924-1025-3a00-a669-7bec69f7f07a",
"accountId": "000000000000",
"status": "SucceededWithIssues",
"eventType": "IndexingCustomFieldFailed",
"thingName": "thing0",
"failedCustomFields": [
{
"Name": "attributeName1",
"Value": "apple",
"ExpectedType": "String"
},
{
"Name": "attributeName2",
"Value": "2",
"ExpectedType": "Boolean"
}
]
}
769
AWS IoT Guía del desarrollador
Guía para solucionar problemas
de AWS IoT Device Defender
P: ¿Hay algún requisito previo para usar AWS IoT Device Defender?
R: Si desea utilizar métricas registradas por el dispositivo, primero debe implementar un agente en
sus dispositivos AWS IoT conectados o en las gateways de dispositivos. Los dispositivos deben
proporcionar un identificador de cliente o nombre de objeto coherentes.
Auditoría
P: Permití una comprobación y mi auditoría ha estado mostrando "En curso" durante mucho tiempo. ¿Hay
algún problema? ¿Cuándo recibiré los resultados?
Detect
P: ¿Cómo puedo conocer los umbrales que se establecen en un comportamiento del perfil de seguridad de
AWS IoT Device Defender?
R: Comience por crear un comportamiento del perfil de seguridad con umbrales bajos y asócielo a un
grupo de objetos que conste de un conjunto representativo de dispositivos. Puede utilizar AWS IoT
Device Defender para ver las métricas actuales y después ajustar el comportamiento de los umbrales
para que coincidan con su caso de uso.
P: He creado un comportamiento, pero no activa una vulneración cuando la espero. ¿Cómo debo
solucionarlo?
{
"name": "Listening TCP Ports",
"metric": "aws:listening-tcp-ports",
"criteria": {
"comparisonOperator": "in-port-set",
"value": {
"ports": [ 8888 ]
}
}
}
Si la cámara realiza una conexión TCP en el puerto TCP 443, el comportamiento del dispositivo se
infringiría y se activaría una alerta.
P: Se están vulnerando uno o más de mis comportamientos. ¿Cómo elimino la vulneración?
R: Las alarmas se desactivan después de que el dispositivo retoma un comportamiento esperado, tal
y como se define en los perfiles de comportamiento. Los perfiles de comportamiento se evalúan al
770
AWS IoT Guía del desarrollador
Guía para solucionar problemas
de AWS IoT Device Defender
recibir los datos de las métricas de su dispositivo. Si el dispositivo no publica ninguna métrica durante
más de dos días, el evento de vulneración se establece en alarm-invalidated automáticamente.
P: Eliminé un comportamiento que generaba una vulneración; ¿cómo puedo detener las alertas?
Métricas de dispositivo
P: Estoy enviando informes de métricas que sé que vulneran mis comportamientos, pero no se activa
ninguna vulneración. ¿Por qué?
R: Verifique que sus informes de métricas se estén aceptando suscribiéndose a los siguientes temas
de MQTT:
$aws/things/THING_NAME/defender/metrics/FORMAT/rejected
$aws/things/THING_NAME/defender/metrics/FORMAT/accepted
donde THING_NAME es el nombre del objeto que informa de la métrica y FORMAT es "json" o "cbor",
según el formato del informe de métricas que envía el objeto.
Una vez que se haya suscrito, debe recibir mensajes sobre estos temas para cada informe de métrica
enviado. Un mensaje rejected indica que hubo un problema al analizar el informe de métrica. Se
incluye un mensaje de error en la carga del mensaje para ayudarle a corregir cualquier error en su
informe de métrica. Un mensaje accepted indica que se ha analizado correctamente el informe de
métrica.
P: ¿Qué sucede si envío una métrica vacía en mi informe de métrica?
R: Una lista vacía de puertos o direcciones IP se considera siempre que está en conformidad con el
comportamiento correspondiente. Si el comportamiento correspondiente supusiera una vulneración, la
vulneración se eliminaría.
P: ¿Por qué los informes de métricas de mi dispositivo contienen mensajes para dispositivos que no están
en el registro de AWS IoT?
Si tiene uno o varios perfiles de seguridad asociados a todos los objetos o a todos los objetos no
registrados, AWS IoT Device Defender incluye métricas de los objetos no registrados. Si desea excluir
las métricas de objetos no registrados, puede asociar los perfiles a todos los dispositivos registrados
en lugar de a todos los dispositivos.
P: No veo los mensajes de uno o varios dispositivos no registrados a pesar de que puedo aplicar un perfil
de seguridad a todos los dispositivos no registrados o a todos los dispositivos. ¿Cómo puedo solucionarlo?
Compruebe que está enviando un informe de métricas en uno de los formatos compatibles. Para
obtener más información, consulte Especificación de documentos de métricas de dispositivos (p. 712).
Compruebe que los dispositivos no registrados utilizan un identificador de cliente o nombre de objeto
coherentes. Los mensajes registrados por los dispositivos se rechazan si el nombre del objeto
contiene caracteres de control o si el nombre del objeto tiene más de 128 bytes de caracteres con
codificación UTF-8.
P: ¿Qué sucede si un dispositivo no registrado se añade al registro o si un dispositivo registrado deja de
estarlo?
771
AWS IoT Guía del desarrollador
Errores de AWS IoT
vulneraciones activas de la identidad antigua dejan de aparecer al cabo de dos días, pero están
disponibles en el historial de vulneraciones durante un máximo de 14 días.
P: ¿Qué valor debo proporcionar en el campo de ID del informe de métricas de mi dispositivo?
R: Utilice un valor único para cada informe de métrica, expresado como un número entero positivo.
Una práctica común es utilizar una marca de tiempo Epoch de Unix.
P: ¿Debo crear una conexión con MQTT dedicada para las métricas de AWS IoT Device Defender?
Para dispositivos (objetos) que estén el registro de AWS IoT registro, utilice el nombre del objeto
registrado. Para los productos que no estén en el registro de AWS IoT, utilice un identificador
coherente al conectarse a AWS IoT. Esta práctica le permite crear una correspondencia entre las
vulneraciones y el nombre de objeto.
P: ¿Puedo publicar métricas para un dispositivo con un ID de cliente diferente?
Es posible publicar métricas en nombre de otro objeto. Para ello, publique las métricas en el tema de
AWS IoT Device Defender reservado para dicho dispositivo. Por ejemplo, Thing-1 desea publicar
métricas de sí mismo y también en nombre de Thing-2. Thing-1 recopila sus propias métricas y las
publica en el tema de MQTT:
$aws/things/Thing-1/defender/metrics/json
Thing-1 obtiene las métricas de Thing-2 y publica dichas métricas en el tema de MQTT:
$aws/things/Thing-2/defender/metrics/json
R: Consulte los puntos de enlace y las cuotas de AWS IoT Device Defender.
P: ¿Qué aspecto tiene un rol de destino prototípico para un destino de alerta?
R: Un rol que permite a AWS IoT Device Defender publicar alertas en un destino de alerta (tema de
SNS) requiere dos cosas:
• Una relación de confianza que especifique iot.amazonaws.com como la entidad de confianza y
• Una política asociada que conceda a AWS IoT permiso para publicar en un tema de SNS
especificado. Por ejemplo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "<sns-topic-arn>"
}
]
}
772
AWS IoT Guía del desarrollador
Errores de AWS IoT
403 prohibido.
403 prohibido.
404 No encontrado.
409 Conflicto.
773
AWS IoT Guía del desarrollador
774