Execute funções do Lambda no núcleo do AWS IoT Greengrass - AWS IoT Greengrass

AWS IoT Greengrass Version 1 entrou na fase de vida útil prolongada em 30 de junho de 2023. Para obter mais informações, consulte política de manutenção do AWS IoT Greengrass V1. Após essa data, AWS IoT Greengrass V1 não lançaremos atualizações que forneçam recursos, aprimoramentos, correções de erros ou patches de segurança. Os dispositivos que funcionam AWS IoT Greengrass V1 não serão interrompidos e continuarão operando e se conectando à nuvem. É altamente recomendável que você migre para AWS IoT Greengrass Version 2, o que adiciona novos recursos significativos e suporte para plataformas adicionais.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Execute funções do Lambda no núcleo do AWS IoT Greengrass

O AWS IoT Greengrass fornece um ambiente de runtime do Lambda em contêineres para código definido pelo usuário que você cria em AWS Lambda. As funções do Lambda implantadas em um AWS IoT Greengrass são executadas no runtime local do Lambda do núcleo. As funções do Lambda locais podem ser acionadas por eventos locais, mensagens da nuvem e outras fontes, o que oferece funcionalidade de computação local para dispositivos cliente. Por exemplo, você pode usar funções do Lambda do Greengrass para filtrar dados do dispositivo antes de transmitir os dados para a nuvem.

Para implantar uma função do Lambda para um núcleo, você adiciona a função a um grupo do Greengrass (referenciando a função do Lambda existente), define as configurações específicas de grupo da função e implanta o grupo. Se a função acessar serviços da AWS, você também deverá adicionar todas as permissões necessárias à função do grupo do Greengrass.

Você pode configurar parâmetros que determinam como as funções do Lambda são executadas, incluindo permissões, isolamento, limites de memória e muito mais. Para ter mais informações, consulte Controlar a execução de funções do Lambda do Greengrass usando a configuração específica do grupo.

nota

Essas configurações também possibilitam a execução do AWS IoT Greengrass em um contêiner do Docker. Para ter mais informações, consulte Como executar o AWS IoT Greengrass em um contêiner do Docker.

A tabela a seguir lista os tempos de execução compatíveis do AWS Lambda e as versões de software de núcleo do AWS IoT Greengrass nas quais eles podem ser executados.

Linguagem ou plataforma Versão do GGC
Python 3.8 1.11
Python 3.7 1.9 ou posterior
Python 2.7 * 1.0 ou posterior
Java 8 1.1 ou posterior
Node.js 12.x * 1.10 ou posterior
Node.js 8.10 * 1.9 ou posterior
Node.js 6.10 * 1.1 ou posterior
C, C++ 1.6 ou posterior

* É possível executar funções do Lambda que usam esses tempos de execução em versões compatíveis do AWS IoT Greengrass, mas não é possível criá-las no AWS Lambda. Se o runtime de seu dispositivo for diferente do runtime do Lambda AWS especificado para essa função, você poderá escolher seu próprio runtime usando FunctionRuntimeOverride no FunctionDefintionVersion. Para obter mais informações, consulte CreateFunctionDefinition. Para obter mais informações sobre os runtimes compatíveis, consulte a Política de suporte do runtime no Guia do desenvolvedor do AWS Lambda.

SDKs para funções do Lambda do Greengrass

A AWS fornece três SDKs que podem ser usados por funções do Lambda do Greengrass em execução em um núcleo AWS IoT Greengrass. Esses SDKs estão contidos em pacotes separados para que as funções possam usá-los simultaneamente. Para usar um SDK em uma função do Lambda do Greengrass, inclua-o no pacote de implantação da função do Lambda que você transfere por upload para o AWS Lambda.

SDK do AWS IoT GreengrassCore

Habilita funções do Lambda locais para interagir com o núcleo para:

  • Troque mensagens MQTT com o AWS IoT Core.

  • Troque mensagens MQTT com conectores, dispositivos cliente e outras funções do Lambda no grupo do Greengrass.

  • Interaja com o serviço de shadow local.

  • Invoque outras funções locais do Lambda.

  • Acesse recursos secretos.

  • Interaja com o gerenciador de fluxo.

AWS IoT Greengrassfornece o SDK AWS IoT Greengrass principal nos seguintes idiomas e plataformas em GitHub.

Para incluir a dependência do SDK do AWS IoT Greengrass Core no pacote de implantação da função do Lambda:

  1. Faça download do idioma ou da plataforma do pacote do SDK do AWS IoT Greengrass Core que corresponder ao runtime da sua função do Lambda.

  2. Descompacte o pacote obtido por download para obter o SDK. O SDK é a pasta do greengrasssdk.

  3. Inclua greengrasssdk no pacote de implantação da função do Lambda que contém seu código de função. Este é o pacote que você transfere por upload para o AWS Lambda ao criar a função do Lambda.

 

StreamManagerClient

Somente os AWS IoT Greengrass Core SDKs podem ser usados para as operações do gerenciador de fluxo:

  • SDK do Java (v1.4.0 ou posterior)

  • SDK do Python (v1.5.0 ou posterior)

  • SDK do Node.js (v1.6.0 ou posterior)

Para usar o SDK do AWS IoT Greengrass Core para Python para interagir com o gerenciador de fluxos, você deve instalar o Python 3.7 ou posterior. Você também deve instalar dependências para incluir em seus pacotes de implantação da função do Lambda em Python:

  1. Navegue até o diretório SDK que contém o arquivo requirements.txt. Esse arquivo lista as dependências.

  2. Instale as dependências do SDK. Por exemplo, execute o seguinte comando pip para instalar as dependências no diretório atual:

    pip install --target . -r requirements.txt

 

Instale o SDK do AWS IoT Greengrass Core para Python no dispositivo de núcleo

Se estiver executando funções Python do Lambda, você poderá usar pip para instalar o SDK do AWS IoT Greengrass Core para Python no dispositivo de núcleo. Em seguida, você poderá implantar suas funções sem incluir o SDK no pacote de implantação da função do Lambda. Para obter mais informações, consulte greengrasssdk.

Esse suporte destina-se a núcleos com restrição de tamanho. Recomendamos que você inclua o SDK em seus pacotes de implantação de função do Lambda quando possível.

 

SDK do AWS IoT Greengrass de Machine learning

Permite que as funções locais do Lambda consumam modelos de machine learning (ML) implantados no núcleo do Greengrass como recursos de ML. As funções do Lambda podem usar o SDK para invocar e interagir com um serviço de inferência local implantado no núcleo como um conector. As funções do Lambda e os conectores de ML também podem usar o SDK para enviar dados ao conector de feedback de ML para fazer uploads e publicações. Para obter mais informações, incluindo exemplos de código que usam o SDK, consulte Conector de classificação de imagem do ML, Conector de detecção de objetos do ML e Conector ML Feedback.

A tabela a seguir lista as linguagens ou plataformas com suporte às versões do SDK e às versões de software de núcleo do AWS IoT Greengrass em que podem ser executadas.

Versão do SDK Linguagem ou plataforma Versão necessária do GGC Changelog
1.1.0 Python 3.7 ou 2.7 1.9.3 ou posterior Adicionado suporte ao Python 3.7 e novo cliente feedback.
1.0.0 Python 2.7 1.7 ou posterior Versão inicial.

Para baixar as informações, consulte AWS IoT Greengrass Software ML SDK.

SDKs da AWS

Habilita funções locais do Lambda a fim de fazer chamadas diretas para serviços da AWS , como Amazon S3, o DynamoDB, o AWS IoT, e o AWS IoT Greengrass. Para usar um SDK do AWS em uma função do Lambda do Greengrass, você deverá incluí-lo no pacote de implantação. Ao usar o SDK do AWS Core no mesmo pacote que o SDK do AWS IoT Greengrass Core, certifique-se de que as funções do Lambda usem os namespaces corretos. As funções do Lambda do Greengrass não podem se comunicar com serviços em nuvem quando o núcleo está off-line.

Faça download dos AWS SDKs no Centro de recursos de conceitos básicos.

Para obter mais informações sobre como criar um pacote de implantação, consulte Crie e empacote uma função do Lambda no tutorial Conceitos básicos ou Criar um pacote de implantação no Guia do desenvolvedor do AWS Lambda.

Migrando funções do Lambda baseadas em nuvem

O SDK do AWS IoT Greengrass Core segue o modelo de programação do SDK da AWS, que facilita a portabilidade de funções do Lambda desenvolvidas para a nuvem para funções do Lambda executadas em um núcleo AWS IoT Greengrass.

Por exemplo, a função Python do Lambda usa o AWS SDK for Python (Boto3) a fim de publicar uma mensagem no tópico some/topic na nuvem:

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

Para portar a função para um núcleo AWS IoT Greengrass, na instrução import e na inicialização client, altere o nome do módulo boto3 para greengrasssdk, conforme mostrado no seguinte exemplo:

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

O SDK do AWS IoT Greengrass Core oferece suporte somente ao envio de mensagens MQTT com QoS = 0. Para ter mais informações, consulte Enviar mensagem sobre a qualidade de serviço.

A semelhança entre os modelos de programação também possibilita que você desenvolva suas funções do Lambda na nuvem e depois as migre para AWS IoT Greengrass sem muito esforço. Os executáveis do Lambda não são executados na nuvem, portanto, você não pode usar o SDK da AWS para testá-los na nuvem antes da implantação.

Referência de funções do Lambda por alias ou versão

Os grupos do Greengrass podem fazer referência a uma função do Lambda por alias (recomendado) ou por versão. Usar um alias facilita o gerenciamento de atualizações de código porque você não precisa alterar a tabela de assinaturas nem a definição do grupo ao atualizar o código da função. Em vez disso, você pode simplesmente apontar o alias para a nova versão da função. Os aliases se tornam números de versão durante a implantação do grupo. Quando você usa aliases, a versão resolvida é atualizada para a versão para a qual o alias aponta no momento da implantação.

O AWS IoT Greengrass não oferece suporte a alias do Lambda para as versões $LATEST. As versões $LATEST não estão vinculadas a versões de função imutável e publicada e podem ser alteradas a qualquer momento, que é a resposta ao princípio do AWS IoT Greengrass de imutabilidade da versão.

Uma prática comum para manter as funções do Lambda do Greengrass atualizadas com alterações feitas no código é usar um alias chamado PRODUCTION no grupo e nas assinaturas do Greengrass. Conforme você promove novas versões da função do Lambda para produção, aponte o alias para a versão estável mais recente e, em seguida, reimplante o grupo. Você também pode usar esse método a fim de reverter para uma versão anterior.

Fluxos de comunicação para funções do Lambda do Greengrass

As funções do Lambda do Greengrass oferecem suporte a vários métodos de comunicação com outros membros do grupo AWS IoT Greengrass, serviços locais e serviços em nuvem (inclusive serviços da AWS).

Comunicação usando mensagens MQTT

As funções do Lambda podem enviar e receber mensagens MQTT usando um padrão de publicação/assinatura que é controlado por assinaturas.

Esse fluxo de comunicação permite que as funções do Lambda troquem mensagens com as seguintes entidades:

  • Dispositivos cliente no grupo.

  • Conectores no grupo.

  • Outras funções do Lambda no grupo.

  • AWS IoT.

  • Serviço Device Shadow local.

Uma assinatura define uma origem de mensagem, um destino de mensagem e um tópico (ou assunto) que é usado para rotear mensagens da origem para o destino. As mensagens publicadas em uma função do Lambda são passadas para o manipulador registrado da função. As assinaturas permitem mais segurança e oferecem interações previsíveis. Para ter mais informações, consulte Assinaturas gerenciadas no fluxo de trabalho de mensagens MQTT.

nota

Quando o núcleo está offline, as funções do Lambda do Greengrass podem trocar mensagens com dispositivos cliente, conectores, outras funções e sombras locais, mas as mensagens para o AWS IoT serão colocadas em fila. Para ter mais informações, consulte Fila de mensagens MQTT para destinos de nuvem.

Outros fluxos de comunicação

  • Para interagir com modelos de machine learning e recursos locais de dispositivo e volume em um dispositivo de núcleo, as funções do Lambda do Greengrass usam interfaces do sistema operacional específicas da plataforma. Por exemplo, você pode usar o método open no módulo os em funções do Python. Para permitir que uma função acesse um recurso, a função deve ser afiliada ao recurso e receber a permissão read-only ou read-write. Para obter mais informações, inclusive disponibilidade da versão do AWS IoT Greengrass Core, consulte Acesso aos recursos locais com funções e conectores do Lambda e Acessando os recursos de machine learning do código de função do Lambda.

    nota

    Se executar a função do Lambda sem conteinerização, você não poderá usar recursos locais de dispositivo e volume anexados e deverá acessar esses recursos diretamente.

  • As funções do Lambda podem usar o cliente Lambda no SDK do AWS IoT Greengrass Core para invocar outras funções do Lambda no grupo do Greengrass.

  • As funções do Lambda podem usar o SDK da AWS para se comunicar com os serviços da AWS. Para obter mais informações, consulte SDKs da AWS.

  • As funções do Lambda podem usar interfaces de terceiros para se comunicar com serviços em nuvem externos, semelhantes a funções do Lambda baseadas em nuvem.

nota

As funções do Lambda não podem se comunicar com a AWS ou outros serviços em nuvem quando o núcleo está offline.

Recuperar o tópico MQTT de entrada (ou assunto)

O AWS IoT Greengrass usa assinaturas para controlar a troca de mensagens MQTT entre dispositivos cliente, as funções do Lambda e os conectores em um grupo e com o AWS IoT ou o serviço de sombra local. As assinaturas definem a origem de uma mensagem, o destino de uma mensagem e um tópico MQTT usado para rotear mensagens. Quando o destino é uma função do Lambda, o manipulador da função é invocado quando a origem publica uma mensagem. Para ter mais informações, consulte Comunicação usando mensagens MQTT.

O exemplo a seguir mostra como uma função do Lambda pode obter o tópico de entrada do context que é passado para o manipulador. Ele faz isso acessando a subject chave da hierarquia de contexto (context.client_context.custom['subject']). O exemplo também analisa a mensagem de entrada do JSON e, em seguida, publica o tópico e a mensagem analisados.

nota

Na API do AWS IoT Greengrass API, o tópico de uma assinatura é representado pela propriedade 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 testar a função, adicione-a ao seu grupo usando as definições de configuração padrão. Em seguida, adicione as assinaturas a seguir e implante o grupo. Para obter instruções, consulte Módulo 3 (parte 1): Funções do Lambda no AWS IoT Greengrass.

Origem Destino Filtro de tópicos
IoT Cloud Essa função test/input_message
Essa função IoT Cloud test/topic_results

Depois que a implantação for concluída, invoque a função.

  1. No console do AWS IoT, abra a página Cliente de teste MQTT.

  2. Inscreva-se no tópico test/topic_results selecionando a guia Inscrever-se em um tópico.

  3. Publique uma mensagem no tópico test/input_message selecionando a guia Publicar em um tópico. Para este exemplo, você deve incluir a propriedade test-key na mensagem JSON.

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

    Se for bem-sucedido, a função publicará o tópico de entrada e a string de mensagem para o tópico test/topic_results.

Configuração do ciclo de vida das funções do Lambda do Greengrass

O ciclo de vida da função do Lambda do Greengrass determina quando uma função começa e como ela cria e usa contêineres. O ciclo de vida também determina como as variáveis e a lógica de pré-processamento que estão fora do manipulador da função são retidas.

O AWS IoT Greengrass oferece suporte a ciclos de vida sob demanda (padrão) ou de longa duração:

  • As funções sob demanda começam quando são invocadas e param quando não há tarefas a serem executadas. Uma invocação da função cria um contêiner à parte (ou sandbox) para processar invocações, a menos que um contêiner existente esteja disponível para reutilização. Os dados enviados para a função podem ser obtidos por qualquer um dos contêineres.

    Várias invocações de uma função sob demanda podem ser executadas em paralelo.

    Variáveis e lógica de pré-processamento que estão definidas fora do manipulador de funções não são mantidas quando novos contêineres são criados.

  • As funções de longa duração (ou fixas) são iniciadas automaticamente quando o núcleo AWS IoT Greengrass é iniciado e executado em um único contêiner. Todos os dados enviados para a função são obtidos pelo mesmo contêiner.

    Várias invocações serão enfileiradas até as invocações anteriores terem sido executadas.

    Variáveis e lógica de pré-processamento que estão definidas fora do manipulador de funções são mantidas para cada invocação do manipulador.

    As funções do Lambda de longa duração são úteis quando você precisa começar a trabalhar sem qualquer entrada inicial. Por exemplo, uma função de longa duração pode carregar e iniciar o processamento de um modelo ML para estar pronto quando a função começa a receber dados do dispositivo.

    nota

    Lembre-se de que as funções de longa duração têm tempos limite associados a invocações do manipulador. Se quiser executar indefinidamente executando código, você deverá iniciá-lo fora do manipulador. Certifique-se de que não haja código de bloqueio fora do manipulador que possa evitar que a função conclua a inicialização.

    Essas funções serão executadas, a menos que o núcleo seja interrompido (por exemplo, durante a implantação de um grupo ou a reinicialização de um dispositivo) ou a função inserirá um estado de erro (como um tempo limite do manipulador, exceção não capturada ou limite excedido de memória).

Para obter mais informações sobre a reutilização de contêineres, consulte Noções básicas da reutilização de contêineres no AWS Lambda no blog de computação da AWS.

Executáveis do Lambda

Esse atributo está disponível para o AWS IoT Greengrass Core v1.6 e posterior.

Um executável do Lambda é um tipo de função do Lambda do Greengrass que você pode usar para executar o código binário no ambiente básico. Ele permite executar a funcionalidade específica do dispositivo de maneira nativa e se beneficiar do espaço menor do código compilado. Os executáveis do Lambda podem ser invocados por eventos, invocar outras funções e acessar recursos locais.

Os executáveis do Lambda só oferecem suporte ao tipo de codificação binária (e não JSON), mas você pode gerenciá-los no grupo do Greengrass e implantá-los como outras funções do Lambda do Greengrass. No entanto, o processo de criar executáveis do Lambda é diferente de criar funções do Lambda no Python, Java e Node.js:

  • Você não pode usar o console do AWS Lambda para criar (ou gerenciar) um executável do Lambda. Você só pode criar um executável do Lambda usando a API do AWS Lambda.

  • Você faz upload do código da função para o AWS Lambda como um executável compilado que inclui o SDK do AWS IoT Greengrass Core para C.

  • Você especifica o nome do executável como o manipulador de funções.

Os executáveis do Lambda devem implementar determinadas chamadas e padrões de programação no código de função. Por exemplo, o método main deve:

  • Chame gg_global_init para inicializar variáveis globais internas do Greengrass. Essa função deverá ser chamada antes de criar todos os threads e antes de chamar qualquer outra função do SDK do AWS IoT Greengrass Core.

  • Chame gg_runtime_start para registrar o manipulador de funções com o runtime do Lambda do Greengrass. Essa função deve ser chamada durante a inicialização. Chamar essa função faz o thread atual ser usado pelo runtime. O parâmetro GG_RT_OPT_ASYNC opcional orienta essa função a não bloquear, mas, em vez disso, criar um novo thread para o runtime. Essa função usa um manipulador SIGTERM.

O trecho a seguir é o main método do exemplo de código simple_handler.c em. 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 obter mais informações sobre requisitos, restrições e outros detalhes de implementação, consulte SDK do AWS IoT Greengrass Core para C.

Crie um executável do Lambda

Depois que você compilar o código com o SDK, use a API do AWS Lambda para criar uma função do Lambda e fazer upload do executável compilado.

nota

A função deve ser compilado com um compilador C89 compatível.

O exemplo a seguir usa o comando da CLI create-function para criar um executável do Lambda. O comando especifica:

  • O nome do executável do manipulador. Ele deve ser o nome exato do executável compilado.

  • O caminho do arquivo .zip que contém o executável compilado.

  • arn:aws:greengrass:::runtime/function/executable do runtime. Este é o runtime de todos os executáveis do Lambda.

nota

Para role, você pode especificar o ARN de qualquer função do Lambda de execução. O AWS IoT Greengrass não usa essa função, mas o parâmetro é obrigatório para a criação da função. Para obter informações sobre funções do Lambda de execução, consulte Modelo de permissões do AWS Lambda no Guia do desenvolvedor do 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

Em seguida, use a API do AWS Lambda para publicar uma versão e crie um alias.

  • Use publish-version para publicar uma versão da função.

    aws lambda publish-version \ --function-name function-name \ --region aws-region
  • Use create-alias para criar um alias que aponte para a versão recém-publicada. Recomendamos fazer referência a funções do Lambda por alias quando você as adiciona a um grupo do Greengrass.

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

O console do AWS Lambda não exibe executáveis do Lambda. Para atualizar o código da função, você deve usar a API do AWS Lambda.

Em seguida, adicione o executável do Lambda a um grupo do Greengrass, configure-o para aceitar dados de entrada binários nas configurações específicas do grupo e implantar o grupo. Você pode fazer isso no console do AWS IoT Greengrass ou usando a API AWS IoT Greengrass.