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 Greengrass Core
-
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.
O AWS IoT Greengrass fornece o SDK do AWS IoT Greengrass Core nas seguintes linguagens e plataformas no GitHub.
Para incluir a dependência do SDK do AWS IoT Greengrass Core no pacote de implantação da função do Lambda:
-
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.
-
Descompacte o pacote obtido por download para obter o SDK. O SDK é a pasta do
greengrasssdk
. -
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:
-
Navegue até o diretório SDK que contém o arquivo
requirements.txt
. Esse arquivo lista as dependências. -
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 a função do código. 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 osem 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
ouread-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.
-
No console do AWS IoT, abra a página Cliente de teste MQTT.
-
Inscreva-se no tópico
test/topic_results
selecionando a guia Inscrever-se em um tópico. -
Publique uma mensagem no tópico
test/input_message
selecionando a guia Publicar em um tópico. Para este exemplo, você deve incluir a propriedadetest-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
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âmetroGG_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 manipuladorSIGTERM
.
O snippet a seguir é o método main
do exemplo de código simple_handler.c
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-namefunction-name
\ --handlerexecutable-name
\ --rolerole-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
\ --regionaws-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
\ --namealias-name
\ --function-versionversion-number
\ --regionaws-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.