Ejecutar funciones de Lambda en el núcleo de AWS IoT Greengrass - AWS IoT Greengrass

AWS IoT Greengrass Version 1 entró en la fase de vida útil prolongada el 30 de junio de 2023. Para obtener más información, consulte la política de mantenimiento de AWS IoT Greengrass V1 Después de esta fecha, AWS IoT Greengrass V1 no se publicarán actualizaciones que proporcionen funciones, mejoras, correcciones de errores o parches de seguridad. Los dispositivos que se ejecuten AWS IoT Greengrass V1 no se verán afectados y seguirán funcionando y conectándose a la nube. Le recomendamos encarecidamente que migre a AWS IoT Greengrass Version 2, ya que añade importantes funciones nuevas y es compatible con plataformas adicionales.

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

Ejecutar funciones de Lambda en el núcleo de AWS IoT Greengrass

AWS IoT Greengrass ofrece un entorno de tiempo de ejecución de Lambda en contenedores para código definido por el usuario que usted autoriza en AWS Lambda. Las funciones de Lambda que se implementa en un núcleo de AWS IoT Greengrass se ejecutan en el tiempo de ejecución de Lambda local del núcleo. Las funciones de Lambda locales pueden ser activadas por eventos locales, mensajes de la nube y otros orígenes, lo que lleva la funcionalidad de computación local a los dispositivos del cliente. Por ejemplo, puede utilizar funciones de Lambda Greengrass para filtrar los datos del dispositivo antes de transmitir los datos a la nube.

Para implementar una función de Lambda en un núcleo, añada la función a un grupo de Greengrass (haciendo referencia a la función de Lambda existente), defina una configuración específica del grupo y, a continuación, implemente el grupo. Si la función obtiene acceso a servicios de AWS, también debe agregar los permisos necesarios para el rol del grupo de Greengrass.

Puede configurar parámetros que determinan cómo se ejecutan las funciones de Lambda, incluidos permisos, aislamiento, límites de memoria, etc. Para obtener más información, consulte Control de la ejecución de funciones de Greengrass Lambda utilizando la configuración específica del grupo.

nota

Esta configuración también permite ejecutar AWS IoT Greengrass en un contenedor de Docker. Para obtener más información, consulte Ejecución de AWS IoT Greengrass en un contenedor Docker.

En la siguiente tabla se muestran los entornos de tiempo de ejecución de AWS Lambda compatibles y las versiones del software de AWS IoT Greengrass Core en las que puedan ejecutarse.

Lenguaje o plataforma Versión de GGC
Python 3.8 1.11
Python 3.7 1.9 o posteriores
Python 2.7 * 1.0 o posteriores
Java 8 1.1 o posteriores
Node.js 12.x * 1.10 o posteriores
Node.js 8.10 * 1.9 o posteriores
Node.js 6.10 * 1.1 o posteriores
C, C++ 1.6 o posteriores

* Puede ejecutar funciones de Lambda que utilicen estos entornos de tiempos de ejecución en versiones compatibles de AWS IoT Greengrass, pero no puede crearlas en AWS Lambda. Si el tiempo de ejecución de su dispositivo es diferente del tiempo de ejecución de Lambda AWS especificado para esa función, puede elegir su propio tiempo de ejecución utilizando FunctionRuntimeOverride en FunctionDefintionVersion. Para obtener más información, consulte CreateFunctionDefinition. Para más informació sobre los tiempos de ejecución compatibles, consulte la Política de soporte en tiempo de ejecución en la Guía de desarrolladores de AWS Lambda.

SDK para funciones de Lambda de Greengrass

AWS ofrece tres SDK que pueden utilizar las funciones de Lambda de Greengrass que se ejecutan en un núcleo de AWS IoT Greengrass. Estos SDK están contenidos en distintos paquetes, por lo que las funciones pueden utilizarlos de forma simultánea. Para utilizar un SDK en una función de Lambda de Greengrass, inclúyalo en el paquete de implementación de funciones de Lambda que subió a AWS Lambda.

SDK de AWS IoT Greengrass Core

Permite que las funciones de Lambda locales interactúen con el núcleo para:

  • Intercambiar mensajes MQTT con AWS IoT Core.

  • Intercambiar mensajes MQTT con conectores, dispositivos y otras funciones de Lambda en el grupo de Greengrass.

  • Interactuar con el servicio de sombra local.

  • Invocar otras funciones de Lambda locales.

  • Tener acceso a recursos de secretos.

  • Interactuar con el administrador de secuencias.

AWS IoT Greengrassproporciona el SDK AWS IoT Greengrass principal en los siguientes idiomas y plataformas en GitHub.

Para incluir la dependencia del SDK de AWS IoT Greengrass Core en el paquete de implementación de funciones de Lambda:

  1. Descargue el idioma o la plataforma del paquete del SDK del AWS IoT Greengrass Core que coincida con el tiempo de ejecución de su función de Lambda.

  2. Descomprima el paquete descargado para obtener el SDK. El SDK es la carpeta greengrasssdk.

  3. Incluya greengrasssdk en el paquete de implementación de funciones de Lambda que contiene su código de función. Este es el paquete que sube a AWS Lambda cuando crea la función de Lambda.

 

StreamManagerClient

Estos son los únicos SDK de AWS IoT Greengrass Core que se pueden utilizar con las operaciones del administrador de secuencias:

  • SDK de Java (v 1.4.0 o posterior)

  • SDK de Python (versión 1.5.0 o posterior)

  • SDK de Node.js (v 1.6.0 o posterior)

Para usar el SDK de AWS IoT Greengrass Core de Python para interactuar con el administrador de secuencias, debe instalar Python 3.7 o una versión posterior. También debe instalar dependencias para incluirlas en sus paquetes de implementación de funciones de Lambda de Python:

  1. Vaya al directorio de SDK que contiene el archivo de requirements.txt. Este archivo registra las dependencias.

  2. Instale las dependencias del SDK. Por ejemplo, ejecute el siguiente comando de pip para instalarlas en el directorio actual:

    pip install --target . -r requirements.txt

 

Instale el SDK de AWS IoT Greengrass Core para Python en el dispositivo del núcleo

Si está ejecutando funciones de Lambda de Python, también puede utilizar pip para instalar el AWS IoT Greengrass para Python en el dispositivo principal. A continuación, puede implementar las funciones sin incluir el SDK en el paquete de implementación de la función de Lambda. Para obtener más información, consulte greengrasssdk.

Este soporte está dirigido a núcleos con restricciones de tamaño. Le recomendamos que incluya el SDK en sus paquetes de implementación de funciones de Lambda cuando sea posible.

 

SDK de machine learning de AWS IoT Greengrass

Permite a las funciones de Lambda consumir modelos de machine learning (ML) que se implementan en el núcleo de Greengrass como recursos de ML. Las funciones de Lambda pueden usar el SDK para invocar e interactuar con un servicio de inferencia local que se implementa en el núcleo como un conector. Las funciones de Lambda y los conectores de ML también pueden usar el SDK para enviar datos al conector de ML Feedback para cargarlos y publicarlos. Para obtener más información, incluidos los ejemplos de código que utiliza el SDK, consulte Conector de la clasificación de ML Image, Conector de detección de ML Object y Conector de ML Feedback.

En la siguiente tabla se muestran lenguajes o plataformas admitidos para versiones de SDK y las versiones del software AWS IoT Greengrass Core en las que se pueden ejecutar.

Versión de SDK Lenguaje o plataforma Versión de GGC necesaria Registro de cambios
1.1.0 Python 3.7 o 2.7 1.9.3 o posteriores Se ha añadido compatibilidad con Python 3.7 y un nuevo cliente feedback.
1.0.0 Python 2.7 1.7 o posteriores Versión inicial.

Para obtener información sobre la descarga, consulte Software del SDK de aprendizaje automático de AWS IoT Greengrass.

SDK de AWS

Habilita funciones de Lambda locales para hacer llamadas directas a los servicios de AWS, como Amazon S3, DynamoDB, AWS IoT y AWS IoT Greengrass. Para utilizar un SDK de AWS en una función de Lambda de Greengrass, debe incluirlo en el paquete de implementación. Si se utiliza el SDK de AWS en el mismo paquete que el SDK de AWS IoT Greengrass Core, asegúrese de que las funciones de Lambda usan los espacios de nombres correctos. Las funciones de Lambda de Greengrass no pueden comunicarse con los servicios en la nube cuando el núcleo está desconectado.

Descargue los SDK de AWS del Centro de recursos introductorios.

Para obtener más información acerca de la creación de un paquete de implementación, consulte Crear y empaquetar una función de Lambda en el tutorial de introducción o Creación de un paquete de implementación en la Guía del desarrollador de AWS Lambda.

Migración de funciones de Lambda basadas en la nube

El SDK de AWS IoT Greengrass Core sigue el modelo de programación del SDK de AWS, lo que facilita el traslado de las funciones de Lambda que se desarrollan para la nube a funciones de Lambda que se ejecutan en un núcleo de AWS IoT Greengrass.

Por ejemplo, la siguiente función de Lambda de Python usa el AWS SDK for Python (Boto3) a fin de publicar un mensaje en el tema some/topic en la nube:

import boto3 iot_client = boto3.client("iot-data") response = iot_client.publish( topic="some/topic", qos=0, payload="Some payload".encode() )

Para trasladar la función para un núcleo de AWS IoT Greengrass, en la declaración import y la inicialización client, cambie el nombre del módulo boto3 a greengrasssdk, como se muestra en el siguiente ejemplo:

import greengrasssdk iot_client = greengrasssdk.client("iot-data") iot_client.publish(topic="some/topic", qos=0, payload="Some payload".encode())
nota

El SDK de AWS IoT Greengrass Core solo permite enviar mensajes MQTT con QoS = 0. Para obtener más información, consulte Mensaje de calidad del servicio.

La similitud entre los modelos de programación también le permite desarrollar sus funciones de Lambda en la nube y luego migrarlas a AWS IoT Greengrass con un esfuerzo mínimo. Los ejecutables de Lambda no se ejecutan en la nube, por lo que no puede utilizar el SDK de AWS para desarrolarlos en la nube antes de la implementación.

Referencia a funciones de Lambda por alias o versión

Los grupos de Greengrass pueden hacer referencia a una función de Lambda por versión o alias (recomendado). El uso de un alias facilita la gestión de las actualizaciones del código porque no tiene que cambiar la tabla de suscripción o la definición del grupo cuando se actualiza el código de la función. En su lugar, basta con apuntar el alias a la nueva versión de la función. Los alias se resuelven en números de versión durante la implementación del grupo. Cuando utiliza alias, la versión resuelta se actualiza a la versión a la que apunta el alias en el momento de la implementación.

AWS IoT Greengrass no admite alias de Lambda; para versiones de $LATEST. Las versiones $LATEST de no están vinculadas a versiones de función publicadas, inmutables y se pueden cambiar en cualquier momento, lo cual va en contra del principio de inmutabilidad de AWS IoT Greengrass.

Una práctica habitual para mantener las funciones de Lambda Greengrass actualizadas con cambios en el código es utilizar un alias denominado PRODUCTION en su grupo y suscripciones de Greengrass. A medida que promueve nuevas versiones de su función de Lambda a producción, apunte el alias a la versión estable más reciente y, a continuación, vuelva a implementar el grupo. También puede usar este método para revertir a una versión anterior.

Flujos de comunicación para las funciones de Lambda de Greengrass

Las funciones de Lambda de Greengrass pueden utilizar diversos métodos para comunicarse con otros miembros del grupo de AWS IoT Greengrass, servicios locales y servicios en la nube (incluidos los servicios de AWS).

Comunicación con mensajes MQTT

Las funciones de Lambda pueden enviar y recibir mensajes MQTT utilizando un patrón publish-subscribe (publicar-suscribir) que se controla a través de las suscripciones.

Este flujo de comunicación permite que las funciones de Lambda intercambien mensajes con las siguientes entidades:

  • Dispositivos cliente en el grupo.

  • Conectores en el grupo.

  • Otras funciones de Lambda del grupo.

  • AWS IoT.

  • Servicio de sombra del dispositivo local.

Las suscripciones especifican un origen del mensaje, un destino del mensaje y un tema (o asunto), que se utilizan para direccionar los mensajes desde el origen hasta el destino. Los mensajes que se publican en una función de Lambda se transfieren al controlador registrado de la función. Las suscripciones permiten más seguridad y proporcionan interacciones predecibles. Para obtener más información, consulte Suscripciones administradas en el flujo de trabajo de mensajería de MQTT.

nota

Cuando el dispositivo central está sin conexión, las funciones de Lambda de Greengrass pueden intercambiar mensajes con otros dispositivos cliente, conectores, otras funciones y sombras locales, pero los mensajes dirigidos a AWS IoT se ponen en cola. Para obtener más información, consulte Cola de mensajes MQTT para objetivos en la nube.

Otros flujos de comunicación

  • Para interactuar con los modelos de machine learning y los recursos de volumen y dispositivos locales en un dispositivo central, las funciones de Lambda de G utilizan las interfaces del sistema operativo específico de la plataforma. Por ejemplo, puede utilizar el método de open en el módulo os en las funciones de Python 2.7. Para permitir que una función acceda a un recurso, la función debe estar asociada con el recurso y tener el permiso read-only o read-write. Para obtener más información, incluida la disponibilidad de las versiones principales de AWS IoT Greengrass, consulte Acceder a recursos locales con conectores y funciones de Lambda y Acceso a recursos de machine learning desde el código de la función de Lambda.

    nota

    Si ejecuta la función de Lambda sin creación de contenedores, no puede utilizar los recursos de volumen y dispositivos locales asociados, y debe acceder a dichos recursos directamente.

  • Las funciones de Lambda pueden utilizar el cliente de Lambda en el SDK de AWS IoT Greengrass Core para invocar otras funciones de Lambda en el grupo de Greengrass.

  • Las funciones de Lambda pueden usar el SDK de AWS para comunicarse con los servicios de AWS. Para obtener más información, consulte SDK de AWS.

  • Las funciones de Lambda pueden usar interfaces de terceros para comunicarse con servicios en la nube externos, de modo similar a las funciones de Lambda basadas en la nube.

nota

Las funciones de Lambda de Greengrass no pueden comunicarse con AWS u otros servicios en la nube cuando el núcleo está desconectado.

Recuperación del tema (o asunto) de MQTT de entrada

AWS IoT Greengrass utiliza suscripciones para controlar el intercambio de mensajes MQTT entre dispositivos de cliente, funciones de Lambda y conectores en un grupo, y con AWS IoT o el servicio de sombras local. Las suscripciones definen el origen del mensaje, el destino del mensaje y el tema de MQTT utilizados para dirigir los mensajes. Cuando el destino es una función de Lambda, el controlador de la función se invoca cuando el origen publica un mensaje. Para obtener más información, consulte Comunicación con mensajes MQTT.

En el siguiente ejemplo, se muestra cómo una función de Lambda puede obtener el tema de entrada desde el context pasado al controlador. Para ello, obtiene acceso a la clave subject desde la jerarquía del contexto (context.client_context.custom['subject']). El ejemplo analiza también el mensaje JSON de entrada y, a continuación, publica el tema analizado y el mensaje.

nota

En la API de AWS IoT Greengrass, el tema de una suscripción se representa mediante la propiedad subject.

import greengrasssdk import logging client = greengrasssdk.client('iot-data') OUTPUT_TOPIC = 'test/topic_results' def get_input_topic(context): try: topic = context.client_context.custom['subject'] except Exception as e: logging.error('Topic could not be parsed. ' + repr(e)) return topic def get_input_message(event): try: message = event['test-key'] except Exception as e: logging.error('Message could not be parsed. ' + repr(e)) return message def function_handler(event, context): try: input_topic = get_input_topic(context) input_message = get_input_message(event) response = 'Invoked on topic "%s" with message "%s"' % (input_topic, input_message) logging.info(response) except Exception as e: logging.error(e) client.publish(topic=OUTPUT_TOPIC, payload=response) return

Para probar la función, añádala a su grupo utilizando las opciones de configuración predeterminadas. A continuación, añada las siguientes suscripciones e implemente el grupo. Para obtener instrucciones, consulte Módulo 3 (primera parte): Funciones de Lambda en AWS IoT Greengrass.

Fuente Destino Filtro de temas
IoT Cloud (Nube de IoT) Esta función test/input_message
Esta función IoT Cloud (Nube de IoT) test/topic_results

Una vez completada la implementación, invoque la función.

  1. En la consola de AWS IoT, abra la página del cliente de pruebas MQTT.

  2. Para suscribirse al tema test/topic_results, seleccione la pestaña Suscribirse a un tema.

  3. Publique un mensaje en el tema test/input_message seleccionando la pestaña Publicar en un tema. En este ejemplo, debe incluir la propiedad test-key en el mensaje JSON.

    { "test-key": "Some string value" }

    Si todo es correcto, la función publica el tema de entrada y la cadena del mensaje en el tema test/topic_results.

Configuración del ciclo de vida de las funciones de Lambda de Greengrass

El ciclo de vida de la función de Lambda de Greengrass determina cuándo se inicia una función y cómo crea y utiliza contenedores. El ciclo de vida también determina cómo se conservan las variables y la lógica de procesamiento previo que está fuera del controlador de la función.

AWS IoT Greengrass admite ciclos de vida bajo demanda (predeterminado) o de larga duración.

  • Las funciones bajo demanda se inician cuando se invocan y se detienen cuando no quedan tareas que ejecutar. Una invocación de la función crea un contenedor independiente (o entorno de pruebas) para procesar invocaciones, a menos que haya un contenedor disponible que se pueda reutilizar. Los datos que se envíe a la función pueden extraerse de cualquiera de los contenedores.

    Es posible ejecutar en paralelo varias invocaciones de una función bajo demanda.

    No se conserva ninguna variable ni lógica de procesamiento previo que se defina fuera del controlador de la función cuando se crean nuevos contenedores.

  • Las funciones de larga duración (o adjuntas) se inician automáticamente cuando se inicia el núcleo de AWS IoT Greengrass y se ejecutan en un solo contenedor. Todos los datos que se envían a la función los extrae el mismo contenedor.

    Hay varias invocaciones en la cola hasta que se ejecuten las invocaciones anteriores.

    Las variables y lógica de procesamiento previo que se definen fuera del controlador de la función se conservan para cada invocación del controlador.

    Las funciones de Lambda de larga duración resultan útiles cuando necesita empezar a trabajar sin ninguna entrada inicial. Por ejemplo, una función de larga duración puede cargar e iniciar el procesamiento de un modelo de ML para que esté listo para cuando la función empiece a recibir los datos del dispositivo.

    nota

    Recuerde que las funciones de larga duración tienen tiempos de espera que están asociados con invocaciones de su controlador. Si desea ejecutar de forma indefinida el código en ejecución, debe iniciarlo fuera del controlador. Asegúrese de que no haya código de bloqueo fuera del controlador que pudiera impedir la inicialización de la función.

    Estas funciones se ejecutan a menos que el núcleo se detenga (por ejemplo, al reiniciarse una implementación de grupo o un dispositivo) o que la función adopte un estado de error (por ejemplo, un error de tiempo de espera del controlador, una excepción no detectada o si se superan los límites de memoria).

Para obtener más información acerca de la reutilización de contenedores, consulte Comprender la reutilización de contenedores AWS Lambda en el AWSBlog de informática de .

Ejecutables de Lambda

Esta característica está disponible para AWS IoT Greengrass Core versión 1.6 y posteriores.

Un ejecutable es un tipo de función de Lambda de Greengrass que puede utilizar para ejecutar código binario en el entorno del núcleo. Le permite ejecutar la funcionalidad específica del dispositivo de manera nativa y se beneficia de una menor huella de código compilado. Los ejecutables de Lambda pueden ser invocados por eventos, pueden invocar otras funciones y pueden acceder a recursos locales.

Los ejecutables de Lambda admite solo el tipo de cifrado binario (no JSON) pero, por lo demás, puede administrarlos en su grupo de Greengrass e implementarlos como otras funciones de Lambda de Greengrass. Sin embargo, el proceso de creación de Lambda es diferente de la creación de funciones de Lambda, Python, Java y Node.js:

  • No puede utilizar la consola de AWS Lambda para crear (o gestionar) un ejecutable de Lambda. Solo puede crear un ejecutable de Lambda mediante la API de AWS Lambda.

  • Puede cargar el código de la función a AWS Lambda como un ejecutable compilado que incluye el SDK de AWS IoT Greengrass Core para C..

  • Especificará el nombre del ejecutable como el controlador de la función.

Los ejecutables de Lambda deben implementar determinadas llamadas y patrones de programación en su código de la función. Por ejemplo, el método main debe:

  • Llamar a gg_global_init para inicializar variables globales internas de Greengrass. Esta función debe llamarse antes de crear subprocesos y antes de llamar a cualquier otra función de SDK de AWS IoT Greengrass Core.

  • Llame a gg_runtime_start para registrar el controlador de la función con el tiempo de ejecución de Lambda de Greengrass. Esta función debe llamarse durante la inicialización. Al llamar a esta función el tiempo de ejecución utiliza el subproceso actual. El parámetro GG_RT_OPT_ASYNC opcional indica a esta función que no bloquee, sino que cree un nuevo subproceso para el tiempo de ejecución. Esta función utiliza un controlador SIGTERM.

El siguiente fragmento es el main método utilizado en el ejemplo de código simple_handler.c en adelante. GitHub

int main() { gg_error err = GGE_SUCCESS; err = gg_global_init(0); if(err) { gg_log(GG_LOG_ERROR, "gg_global_init failed %d", err); goto cleanup; } gg_runtime_start(handler, 0); cleanup: return -1; }

Para obtener más información acerca de los requisitos exigidos, las restricciones y otros detalles de implementación, consulte SDK de AWS IoT Greengrass Core para C.

Crear un ejecutable de Lambda

Después de compilar el código junto con el SDK, utilice la API de AWS Lambda para crear una función de Lambda y cargar un ejecutable compilado.

nota

La función deberá elaborarse con un compilador C89 compatible.

En el siguiente ejemplo se utiliza el comando de CLI create-function para crear un ejecutable de Lambda. El comando especifica:

  • El nombre del ejecutable para el controlador. Debe ser el nombre exacto del ejecutable compilado.

  • La ruta del archivo .zip que contiene el ejecutable compilado.

  • arn:aws:greengrass:::runtime/function/executable para el tiempo de ejecución. Este es el tiempo de ejecución para todos los ejecutables de Lambda.

nota

Para role puede especificar el ARN de cualquier rol de ejecución de Lambda. AWS IoT Greengrass no utiliza este rol, pero el parámetro es necesario para crear la función. Para obtener más información sobre los roles de ejecución de Lambda, consulte modelo de permisos de AWS Lambda en la Guía para desarrolladores de AWS Lambda.

aws lambda create-function \ --region aws-region \ --function-name function-name \ --handler executable-name \ --role role-arn \ --zip-file fileb://file-name.zip \ --runtime arn:aws:greengrass:::runtime/function/executable

A continuación, utilice la API de AWS Lambda para publicar una versión y crear un alias.

  • Utilice publish-version para publicar una versión de la función.

    aws lambda publish-version \ --function-name function-name \ --region aws-region
  • Utilice create-alias para crear un alias que apunte a la versión que acaba de publicar. Recomendamos que el alias haga referencia a funciones de Lambda cuando las añade a un grupo de Greengrass.

    aws lambda create-alias \ --function-name function-name \ --name alias-name \ --function-version version-number \ --region aws-region
nota

La consola de AWS Lambda no muestra los ejecutables de Lambda. Para actualizar el código de la función, debe utilizar la API de AWS Lambda.

A continuación, añada el ejecutable de Lambda a un grupo de Greengrass, configúrelo para aceptar los datos de entrada binarios en su configuración específica del grupo e implemente el grupo. Puede hacerlo en la consola de AWS IoT Greengrass o utilizando la API AWS IoT Greengrass.