Esegui le funzioni Lambda sul core AWS IoT Greengrass - AWS IoT Greengrass

AWS IoT Greengrass Version 1 è entrato nella fase di estensione della vita utile il 30 giugno 2023. Per ulteriori informazioni, consulta la politica AWS IoT Greengrass V1 di manutenzione. Dopo questa data, AWS IoT Greengrass V1 non rilascerà aggiornamenti che forniscano funzionalità, miglioramenti, correzioni di bug o patch di sicurezza. I dispositivi che funzionano AWS IoT Greengrass V1 non subiranno interruzioni e continueranno a funzionare e a connettersi al cloud. Ti consigliamo vivamente di eseguire la migrazione a AWS IoT Greengrass Version 2, che aggiunge nuove importanti funzionalità e supporto per piattaforme aggiuntive.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esegui le funzioni Lambda sul core AWS IoT Greengrass

AWS IoT Greengrassfornisce un ambiente di runtime Lambda containerizzato per il codice definito dall'utente in cui si crea. AWS Lambda Funzioni Lambda distribuite in un'esecuzione principale nel AWS IoT Greengrass runtime Lambda locale del core. Le funzioni Lambda locali possono essere attivate da eventi locali, messaggi dal cloud e altre fonti, il che offre funzionalità di elaborazione locale ai dispositivi client. Ad esempio, puoi utilizzare le funzioni Greengrass Lambda per filtrare i dati del dispositivo prima di trasmetterli al cloud.

Per distribuire una funzione Lambda su un core, si aggiunge la funzione a un gruppo Greengrass (facendo riferimento alla funzione Lambda esistente), si configurano le impostazioni specifiche del gruppo per la funzione e quindi si distribuisce il gruppo. Se la funzione accede AWS ai servizi, è inoltre necessario aggiungere le autorizzazioni necessarie al ruolo del gruppo Greengrass.

Puoi configurare parametri che determinano l'esecuzione delle funzioni Lambda, tra cui autorizzazioni, isolamento, limiti di memoria e altro. Per ulteriori informazioni, consulta Controllo dell'esecuzione delle funzioni Greengrass Lambda utilizzando la configurazione specifica del gruppo.

Nota

Queste impostazioni consentono anche di eseguire AWS IoT Greengrass in un container Docker. Per ulteriori informazioni, consulta Esecuzione di AWS IoT Greengrass in un container Docker.

La tabella seguente elenca i runtime AWS Lambda supportati e le versioni del software AWS IoT Greengrass Core sul quale possono essere eseguite.

Lingua o piattaforma Versione GGC
Python 3.8 1.11
Python 3.7 1.9 o versioni successive
Python 2.7 * 1.0 o versione successiva
Java 8 1.1 o versione successiva
Node.js 12.x * 1.10 o versione successiva
Node.js 8.10 1.9 o versione successiva
Node.js 6.10 * 1.1 o versione successiva
C, C++ 1.6 o versione successiva

* È possibile eseguire funzioni Lambda che utilizzano questi runtime su versioni supportate diAWS IoT Greengrass, ma non è possibile crearle in. AWS Lambda Se il runtime sul tuo dispositivo è diverso dal runtime AWS Lambda specificato per quella funzione, puoi scegliere il tuo runtime utilizzando FunctionRuntimeOverride in. FunctionDefintionVersion Per ulteriori informazioni, consulta CreateFunctionDefinition. Per ulteriori informazioni sui runtime supportati, consulta la politica di supporto Runtime nella AWS LambdaDeveloper Guide.

SDK per le funzioni Greengrass Lambda

AWSfornisce tre SDK che possono essere utilizzati dalle funzioni Greengrass Lambda in esecuzione su un core. AWS IoT Greengrass Le funzioni possono utilizzare contemporaneamente questi SDK poiché sono inclusi in pacchetti differenti. Per utilizzare un SDK in una funzione Greengrass Lambda, includilo nel pacchetto di distribuzione della funzione Lambda su cui carichi. AWS Lambda

Core SDK AWS IoT Greengrass

Consente alle funzioni Lambda locali di interagire con il core per:

  • Scambio di messaggi MQTT con AWS IoT Core.

  • Scambia messaggi MQTT con connettori, dispositivi client e altre funzioni Lambda nel gruppo Greengrass.

  • Interagire con il servizio shadow locale.

  • Richiama altre funzioni Lambda locali.

  • Accesso a risorse segrete.

  • Interagire con stream manager.

AWS IoT Greengrassfornisce il AWS IoT Greengrass Core SDK nelle seguenti lingue e piattaforme su. GitHub

Per includere la dipendenza AWS IoT Greengrass Core SDK nel pacchetto di distribuzione della funzione Lambda:

  1. Scarica la lingua o la piattaforma del pacchetto AWS IoT Greengrass Core SDK che corrisponde al runtime della tua funzione Lambda.

  2. Decomprimere il pacchetto scaricato per ottenere l'SDK. Il kit SDK è la cartella greengrasssdk.

  3. Includi greengrasssdk nel pacchetto di distribuzione della funzione Lambda che contiene il codice della funzione. Questo è il pacchetto su cui carichi AWS Lambda quando crei la funzione Lambda.

 

StreamManagerClient

Solo i seguenti AWS IoT Greengrass Core SDK possono essere utilizzati per le operazioni di gestione flussi :

  • Java SDK (v1.4.0 o versione successiva)

  • Python SDK (v1.5.0 o successivo)

  • Node.js SDK (v1.6.0 o successivo)

Per utilizzare AWS IoT Greengrass Core SDK for Python per interagire con lo stream manager, devi installare Python 3.7 o versione successiva. È inoltre necessario installare le dipendenze da includere nei pacchetti di distribuzione delle funzioni Python Lambda:

  1. Passare alla directory SDK che contiene il file requirements.txt. Questo file elenca le dipendenze.

  2. Installare le dipendenze SDK. Ad esempio, eseguire il comando pip seguente per installarle nella directory corrente:

    pip install --target . -r requirements.txt

 

Installa AWS IoT Greengrass Core SDK per Python sul dispositivo principale

Se stai eseguendo funzioni Python Lambda, puoi anche usarle pipper installare Core AWS IoT Greengrass SDK per Python sul dispositivo principale. Quindi puoi distribuire le tue funzioni senza includere l'SDK nel pacchetto di distribuzione delle funzioni Lambda. Per ulteriori informazioni, consulta greengrasssdk.

Questo supporto è destinato ai core con vincoli di dimensione. Ti consigliamo di includere l'SDK nei pacchetti di distribuzione delle funzioni Lambda, quando possibile.

 

AWS IoT GreengrassSDK per il Machine Learning

Consente alle funzioni Lambda locali di utilizzare modelli di machine learning (ML) distribuiti nel core di Greengrass come risorse ML. Le funzioni Lambda possono utilizzare l'SDK per richiamare e interagire con un servizio di inferenza locale distribuito nel core come connettore. Le funzioni Lambda e i connettori ML possono anche utilizzare l'SDK per inviare dati al connettore ML Feedback per il caricamento e la pubblicazione. Per ulteriori informazioni, inclusi esempi di codice che utilizzano l'SDK, consulta Connettore ML Image Classification, Connettore ML Object Detection e Connettore di feedback ML.

Nella tabella seguente sono elencate le lingue o le piattaforme supportate per le versioni SDK e le versioni del software AWS IoT Greengrass Core sul quale possono essere eseguite.

Versione SDK Lingua o piattaforma Versione GGC richiesta Changelog
1.1.0 Python 3.7 o 2.7 1.9.3 o versione successiva Aggiunto supporto Python 3.7 e nuovo cliente feedback.
1.0.0 Python 2.7 1.7 o versione successiva Versione iniziale.

Per informazioni di download, consulta Software SDK AWS IoT Greengrass ML.

SDK AWS

Consente alle funzioni Lambda locali di effettuare chiamate dirette a AWS servizi come Amazon S3, DynamoDB AWS IoT e. AWS IoT Greengrass Per utilizzare un AWS SDK in una funzione Greengrass Lambda, è necessario includerlo nel pacchetto di distribuzione. Quando utilizzi l'AWSSDK nello stesso pacchetto dell'SDK AWS IoT Greengrass Core, assicurati che le funzioni Lambda utilizzino i namespace corretti. Le funzioni Greengrass Lambda non possono comunicare con i servizi cloud quando il core è offline.

Scarica gli SDK AWS dal Centro risorse per le nozioni di base.

Per ulteriori informazioni sulla creazione di un pacchetto di distribuzione, consulta Creare e includere in un pacchetto una funzione Lambda il tutorial Getting Started o Creating a deployment package nella AWS LambdaDeveloper Guide.

Migrazione delle funzioni Lambda basate sul cloud

Il AWS IoT Greengrass Core SDK segue il modello di programmazione AWS SDK, che semplifica il trasferimento delle funzioni Lambda sviluppate per il cloud in funzioni Lambda eseguite su un core. AWS IoT Greengrass

Ad esempio, la seguente funzione Python Lambda utilizza AWS SDK for Python (Boto3) per pubblicare un messaggio sull'argomento some/topic nel cloud:

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

Per eseguire il porting della funzione per un AWS IoT Greengrass core, nell'importistruzione e nell'clientinizializzazione, modificate il nome del boto3 modulo ingreengrasssdk, come mostrato nell'esempio seguente:

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

Core SDK AWS IoT Greengrass supporta l'invio di messaggi MQTT solo con QoS = 0. Per ulteriori informazioni, consulta Messaggio di qualità del servizio.

La somiglianza tra i modelli di programmazione consente inoltre di sviluppare le funzioni Lambda nel cloud e quindi AWS IoT Greengrass migrarle con il minimo sforzo. Gli eseguibili Lambda non vengono eseguiti nel cloud, quindi non puoi utilizzare l'AWSSDK per svilupparli nel cloud prima della distribuzione.

Fai riferimento alle funzioni Lambda per alias o versione

I gruppi Greengrass possono fare riferimento a una funzione Lambda tramite alias (consigliato) o per versione. L'utilizzo di un alias semplifica la gestione degli aggiornamenti del codice perché non è necessario modificare la tabella di sottoscrizione o la definizione del gruppo quando il codice della funzione viene aggiornato. Invece, è sufficiente indirizzare l'alias alla nuova versione della funzione. Gli alias si trasformano in numeri di versione durante la distribuzione di gruppo. Quando si utilizzano gli alias, la versione risolta viene aggiornata alla versione a cui punta l'alias al momento della distribuzione.

AWS IoT Greengrassnon supporta gli alias Lambda per le versioni $LATEST. Le versioni $LATEST non sono legate a versioni di funzioni pubblicate e immutabili e possono essere modificate in qualsiasi momento, il che è contrario al principio dell'immutabilità della versione. AWS IoT Greengrass

Una pratica comune per mantenere aggiornate le funzioni di Greengrass Lambda con le modifiche al codice consiste nell'utilizzare un alias denominato nel gruppo Greengrass e negli PRODUCTION abbonamenti. Man mano che promuovi nuove versioni della tua funzione Lambda in produzione, indirizza l'alias all'ultima versione stabile e quindi ridistribuisci il gruppo. Puoi anche scegliere di utilizzare questo metodo per eseguire il rollback a una versione precedente.

Flussi di comunicazione per le funzioni Greengrass Lambda

Le funzioni di Greengrass Lambda supportano diversi metodi di comunicazione con altri membri del AWS IoT Greengrass gruppo, servizi locali e servizi cloud (inclusi i servizi). AWS

Comunicazione tramite messaggi MQTT

Le funzioni Lambda possono inviare e ricevere messaggi MQTT utilizzando un pattern di pubblicazione e sottoscrizione controllato dagli abbonamenti.

Questo flusso di comunicazione consente alle funzioni Lambda di scambiare messaggi con le seguenti entità:

  • Dispositivi client del gruppo.

  • Connettori nel gruppo.

  • Altre funzioni Lambda del gruppo.

  • AWS IoT.

  • Servizio Device Shadow locale

Una sottoscrizione definisce un'origine del messaggio, una destinazione del messaggio e un argomento (o oggetto) utilizzato per instradare i messaggi dall'origine alla destinazione. I messaggi pubblicati su una funzione Lambda vengono passati al gestore registrato della funzione. Le sottoscrizioni garantiscono maggiore sicurezza e consentono interazioni prevedibili. Per ulteriori informazioni, consulta Sottoscrizioni gestite nel flusso di lavoro di messaggistica MQTT.

Nota

Quando il core è offline, le funzioni di Greengrass Lambda possono scambiare messaggi con dispositivi client, connettori, altre funzioni e shadow locali, ma i messaggi vengono messi in coda. AWS IoT Per ulteriori informazioni, consulta Coda di messaggi MQTT per destinazioni sul cloud.

Altri flussi di comunicazione

  • Per interagire con le risorse locali di dispositivi e volumi e i modelli di machine learning su un dispositivo principale, le funzioni Greengrass Lambda utilizzano interfacce di sistema operativo specifiche della piattaforma. Ad esempio, puoi utilizzare il metodo open nel modulo os nelle funzioni Python. Per poter accedere a una risorsa, una funzione deve essere affiliata alla risorsa e deve disporre dell'autorizzazione read-only o read-write. Per ulteriori informazioni, inclusa la disponibilità della versione AWS IoT Greengrass base, vedere e. Accedi alle risorse locali con funzioni e connettori Lambda Accesso alle risorse di machine learning dal codice della funzione Lambda

    Nota

    Se esegui la funzione Lambda senza containerizzazione, non puoi utilizzare le risorse locali e di volume collegate e devi accedere direttamente a tali risorse.

  • Le funzioni Lambda possono utilizzare il Lambda client nell'SDK AWS IoT Greengrass Core per richiamare altre funzioni Lambda nel gruppo Greengrass.

  • Le funzioni Lambda possono utilizzare l'AWSSDK per comunicare con i servizi. AWS Per ulteriori informazioni, consulta AWS SDK.

  • Le funzioni Lambda possono utilizzare interfacce di terze parti per comunicare con servizi cloud esterni, in modo simile alle funzioni Lambda basate sul cloud.

Nota

Le funzioni di Greengrass Lambda non possono comunicare con AWS altri servizi cloud quando il core è offline.

Recupero dell'argomento MQTT di input (o oggetto)

AWS IoT Greengrassutilizza gli abbonamenti per controllare lo scambio di messaggi MQTT tra dispositivi client, funzioni Lambda e connettori in un gruppo e con AWS IoT o il servizio shadow locale. Le sottoscrizioni definiscono un'origine messaggio, destinazione messaggio e un argomento MQTT utilizzati per instradare i messaggi. Quando la destinazione è una funzione Lambda, il gestore della funzione viene richiamato quando l'origine pubblica un messaggio. Per ulteriori informazioni, consulta Comunicazione tramite messaggi MQTT.

L'esempio seguente mostra come una funzione Lambda può ottenere l'argomento di input da context quello passato al gestore. A tale scopo, esegue l'accesso alla chiave subject dalla gerarchia del contesto (context.client_context.custom['subject']). Nell'esempio viene inoltre analizzato il messaggio JSON di input e quindi pubblicati l'argomento e il messaggio analizzati.

Nota

Nell'API AWS IoT Greengrass, l'argomento di una sottoscrizione è rappresentato dalla proprietà 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

Per testare la funzione, aggiungerlo al gruppo utilizzando le impostazioni di configurazione predefinite. Quindi, aggiungere le seguenti sottoscrizioni e distribuire il gruppo. Per istruzioni, consulta Modulo 3 (Parte 1): Lambda suAWS IoT Greengrass.

Origine Target Filtro di argomenti
IoT Cloud Questa funzione test/input_message
Questa funzione IoT Cloud test/topic_results

Al termine della distribuzione, invoca la funzione.

  1. Nella AWS IoT console, aprite la pagina del client di test MQTT.

  2. Effettuate la sottoscrizione all'test/topic_resultsargomento selezionando la scheda Sottoscrivi a un argomento.

  3. Pubblica un messaggio sull'test/input_messageargomento selezionando la scheda Pubblica su un argomento. Per questo esempio, devi includere la proprietà test-key nel messaggio JSON.

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

    In caso di esito positivo, la funzione pubblica l'argomento di input e la stringa di messaggio nell'argomento test/topic_results.

Configurazione del ciclo di vita per le funzioni Greengrass Lambda

Il ciclo di vita della funzione Greengrass Lambda determina quando una funzione viene avviata e come crea e utilizza i contenitori. Inoltre, il ciclo di vita determina il modo in cui vengono conservate le variabili e la logica di preelaborazione che sono al di fuori dell'handler della funzione.

AWS IoT Greengrass supporta i cicli di vita on demand (impostazione predefinita) o di lunga durata:

  • Le funzioni on demand vengono avviate quando vengono richiamate e terminano quando non vi sono più attività da eseguire. Il richiamo di una funzione crea un container (o sandbox) separato per elaborare i richiami, a meno che un container esistente non sia disponibile per essere riutilizzato. I dati inviati alla funzione possono essere stati estratti da uno qualsiasi dei container.

    È possibile eseguire in parallelo più richiami di una funzione on demand.

    Le variabili e la logica di preelaborazione definite al di fuori dell'handler della funzione non vengono conservate quando vengono creati nuovi container.

  • Le funzioni di lunga durata (o bloccate) si avviano automaticamente all'avvio e all'esecuzione del AWS IoT Greengrass core in un singolo contenitore. Tutti i dati inviati alla funzione vengono estratti dallo stesso container.

    Numerosi richiami vengono messi in coda finché non vengono eseguiti i richiami precedenti.

    Le variabili e la logica di preelaborazione definite al di fuori dell'handler della funzione vengono conservate per ogni richiamo dell'handler.

    Le funzioni Lambda di lunga durata sono utili quando è necessario iniziare a lavorare senza alcun input iniziale. Ad esempio, una funzione di lunga durata è in grado di caricare e avviare l'elaborazione di un modello ML in modo che sia pronto quando la funzione inizia a ricevere i dati del dispositivo.

    Nota

    Ricorda che le funzioni di lunga durata dispongono di timeout associati ai richiami dell'handler. Per eseguire il codice in esecuzione a tempo indeterminato, è necessario avviarlo al di fuori dell'handler. Assicurati che al di fuori dell'handler non vi sia alcun codice di blocco che possa impedire il completamento dell'inizializzazione della funzione.

    Queste funzioni vengono eseguite a meno che il core non si arresti (ad esempio, durante una distribuzione di gruppo o il riavvio di un dispositivo) o che la funzione non entri in uno stato di errore (come un timeout del gestore, un'eccezione non rilevata o quando supera i limiti di memoria).

Per ulteriori informazioni sul riutilizzo dei contenitori, consulta Understanding Container Reuse nel blog di Compute. AWS Lambda AWS

Eseguibili Lambda

Questa funzionalità è disponibile per AWS IoT Greengrass Core v1.6 e versioni successive.

Un eseguibile Lambda è un tipo di funzione Greengrass Lambda che è possibile utilizzare per eseguire codice binario nell'ambiente principale. Consente di eseguire funzionalità specifiche del dispositivo in modo nativo e di sfruttare l'ingombro ridotto del codice compilato. Gli eseguibili Lambda possono essere richiamati da eventi, richiamare altre funzioni e accedere a risorse locali.

Gli eseguibili Lambda supportano solo il tipo di codifica binaria (non JSON), ma per il resto puoi gestirli nel tuo gruppo Greengrass e distribuirli come le altre funzioni di Greengrass Lambda. Tuttavia, il processo di creazione degli eseguibili Lambda è diverso dalla creazione delle funzioni Lambda Python, Java e Node.js:

  • Non puoi usare la AWS Lambda console per creare (o gestire) un eseguibile Lambda. Puoi creare un eseguibile Lambda solo utilizzando l'AWS LambdaAPI.

  • Carichi il codice della funzione AWS Lambda come eseguibile compilato che include AWS IoT GreengrassCore SDK per C.

  • È necessario specificare il nome dell'eseguibile come handler della funzione.

Gli eseguibili Lambda devono implementare determinate chiamate e modelli di programmazione nel codice della funzione. Ad esempio, il metodo main deve effettuare le seguenti operazioni:

  • Eseguire una chiamata a gg_global_init per inizializzare le variabili globali interne Greengrass. Questa funzione deve essere richiamata prima di creare qualsiasi thread e prima di chiamare qualsiasi altra funzione di Core SDK AWS IoT Greengrass.

  • Chiama gg_runtime_start per registrare il gestore di funzioni con il runtime Greengrass Lambda. Questa funzione deve essere chiamata durante l'inizializzazione. La chiamata di questa funzione fa sì che il thread corrente venga utilizzato dal runtime. Il parametro facoltativo GG_RT_OPT_ASYNC indica a questa funzione di non bloccare, ma di creare un nuovo thread per il runtime. Questa funzione utilizza un handler SIGTERM.

Il frammento seguente è il main metodo tratto dall'esempio di codice simple_handler.c in poi. 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; }

Per ulteriori informazioni su requisiti, vincoli e altri dettagli di implementazione, consulta Core SDK for C. AWS IoT Greengrass

Creare un file eseguibile Lambda

Dopo aver compilato il codice insieme all'SDK, usa l'AWS LambdaAPI per creare una funzione Lambda e caricare l'eseguibile compilato.

Nota

La funzione devono essere compilata utilizzando un compilatore compatibile con C89.

L'esempio seguente utilizza il comando CLI create-function per creare un eseguibile Lambda. Il comando specifica:

  • Il nome dell'eseguibile per l'handler. Deve corrispondere al nome esatto dell'eseguibile compilato.

  • Il percorso del file .zip contenente l'eseguibile compilato.

  • arn:aws:greengrass:::runtime/function/executable per il runtime. Questo è il runtime per tutti gli eseguibili Lambda.

Nota

Infattirole, puoi specificare l'ARN di qualsiasi ruolo di esecuzione Lambda. AWS IoT Greengrassnon utilizza questo ruolo, ma il parametro è necessario per creare la funzione. Per ulteriori informazioni sui ruoli di esecuzione Lambda, consulta il modello di AWS Lambda autorizzazioni nella Guida per gli AWS Lambda sviluppatori.

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 questo punto, utilizza l'API AWS Lambda per pubblicare una versione e creare un alias.

  • Utilizza publish-version per pubblicare una versione della funzione.

    aws lambda publish-version \ --function-name function-name \ --region aws-region
  • Utilizza create-alias per creare un alias che punti alla versione appena pubblicata. Ti consigliamo di fare riferimento alle funzioni Lambda tramite alias quando le aggiungi a un gruppo Greengrass.

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

La AWS Lambda console non visualizza gli eseguibili Lambda. Per aggiornare il codice della funzione, è necessario utilizzare l'API AWS Lambda.

Quindi, aggiungi l'eseguibile Lambda a un gruppo Greengrass, configuralo per accettare dati di input binari nelle impostazioni specifiche del gruppo e distribuisci il gruppo. È possibile farlo nella console AWS IoT Greengrass o utilizzando l'API AWS IoT Greengrass.