Come configurare l'accesso alle risorse locali utilizzando l'interfaccia AWS a riga di comando - 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à.

Come configurare l'accesso alle risorse locali utilizzando l'interfaccia AWS a riga di comando

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

Per utilizzare una risorsa locale, è necessario aggiungere una definizione di risorsa alla definizione di gruppo che viene distribuita sul dispositivo core di Greengrass. La definizione di gruppo deve contenere anche una definizione di funzione Lambda in cui si concedono le autorizzazioni di accesso per le risorse locali alle funzioni Lambda. Per ulteriori informazioni, inclusi i requisiti e i vincoli, consulta Accedi alle risorse locali con funzioni e connettori Lambda.

Questo tutorial descrive il processo per creare una risorsa locale e configurare l'accesso ad essa utilizzando AWS Command Line Interface (CLI). Per seguire i passaggi del tutorial, devi aver già creato un gruppo Greengrass come descritto in Guida introduttiva con AWS IoT Greengrass.

Per un tutorial che usa il AWS Management Console, consulta Come configurare l'accesso alle risorse locali mediante la AWS Management Console.

Creazione di risorse locali

In primo luogo, puoi usare il comando CreateResourceDefinition per creare una definizione di risorsa che specifica le risorse a cui accedere. In questo esempio, creiamo due risorse, TestDirectory e TestCamera:

aws greengrass create-resource-definition --cli-input-json '{ "Name": "MyLocalVolumeResource", "InitialVersion": { "Resources": [ { "Id": "data-volume", "Name": "TestDirectory", "ResourceDataContainer": { "LocalVolumeResourceData": { "SourcePath": "/src/LRAtest", "DestinationPath": "/dest/LRAtest", "GroupOwnerSetting": { "AutoAddGroupOwner": true, "GroupOwner": "" } } } }, { "Id": "data-device", "Name": "TestCamera", "ResourceDataContainer": { "LocalDeviceResourceData": { "SourcePath": "/dev/video0", "GroupOwnerSetting": { "AutoAddGroupOwner": true, "GroupOwner": "" } } } } ] } }'

Resources: un elenco di oggetti Resource nel gruppo Greengrass. Un gruppo Greengrass può avere fino a 50 risorse.

Resource#Id: identificatore univoco della risorsa. L'ID è usato per riferirsi a una risorsa nella configurazione della funzione Lambda. Limitazioni della lunghezza: 128 caratteri. Modello: [a-zA-Z0-9:_-]+.

Resource#Name: il nome della risorsa. Il nome della risorsa viene visualizzato nella console Greengrass. Limitazioni della lunghezza: 128 caratteri. Modello: [a-zA-Z0-9:_-]+.

LocalDeviceResourceData# SourcePath: Il percorso assoluto locale della risorsa del dispositivo. Il percorso di origine di una risorsa di dispositivo può riferirsi solo a un dispositivo a caratteri o a blocchi in /dev.

LocalVolumeResourceData# SourcePath: Il percorso assoluto locale della risorsa di volume sul dispositivo principale Greengrass. Questa posizione è esterna al container in cui viene eseguita la funzione. Il percorso di origine per un tipo di risorsa di volume non può iniziare con /sys.

LocalVolumeResourceData# DestinationPath: il percorso assoluto della risorsa di volume all'interno dell'ambiente Lambda. Questa posizione è interna al container in cui viene eseguita la funzione.

GroupOwnerSetting: consente di configurare privilegi di gruppo aggiuntivi per il processo Lambda. Questo campo è facoltativo. Per ulteriori informazioni, consulta Autorizzazione di accesso ai file dell'owner del gruppo.

GroupOwnerSetting# AutoAddGroupOwner: Se vero, Greengrass aggiunge automaticamente il proprietario del gruppo del sistema operativo Linux specificato della risorsa ai privilegi del processo Lambda. In questo modo il processo Lambda dispone delle autorizzazioni di accesso ai file del gruppo Linux aggiunto.

GroupOwnerSetting# GroupOwner: specifica il nome del gruppo di sistemi operativi Linux i cui privilegi vengono aggiunti al processo Lambda. Questo campo è facoltativo.

Un ARN di versione della definizione di risorsa viene restituito da CreateResourceDefinition. L'ARN deve essere utilizzato quando si aggiorna una definizione di gruppo.

{ "LatestVersionArn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/definition/resources/ab14d0b5-116e-4951-a322-9cde24a30373/versions/a4d9b882-d025-4760-9cfe-9d4fada5390d", "Name": "MyLocalVolumeResource", "LastUpdatedTimestamp": "2017-11-15T01:18:42.153Z", "LatestVersion": "a4d9b882-d025-4760-9cfe-9d4fada5390d", "CreationTimestamp": "2017-11-15T01:18:42.153Z", "Id": "ab14d0b5-116e-4951-a322-9cde24a30373", "Arn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/resources/ab14d0b5-116e-4951-a322-9cde24a30373" }

Creazione della funzione Greengrass

Dopo che le risorse sono state create, utilizzare il comando CreateFunctionDefinition per creare la funzione Greengrass e concedere alla funzione l'accesso alla risorsa:

aws greengrass create-function-definition --cli-input-json '{ "Name": "MyFunctionDefinition", "InitialVersion": { "Functions": [ { "Id": "greengrassLraTest", "FunctionArn": "arn:aws:lambda:us-west-2:012345678901:function:lraTest:1", "FunctionConfiguration": { "Pinned": false, "MemorySize": 16384, "Timeout": 30, "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "data-volume", "Permission": "rw" }, { "ResourceId": "data-device", "Permission": "ro" } ], "AccessSysfs": true } } } ] } }'

ResourceAccessPolicies: contiene gli resourceId e permission che garantiscono alla funzione Lambda l'accesso alla risorsa. Una funzione Lambda può accedere a un massimo di 20 risorse.

ResourceAccessPolicy#Permission: specifica quali autorizzazioni ha la funzione Lambda sulla risorsa. Le opzioni disponibili sono rw (lettura/scrittura) o ro (solo lettura).

AccessSysfs: Se impostato su true, il processo Lambda può avere accesso in lettura alla /sys cartella sul dispositivo principale Greengrass. Viene utilizzato nei casi in cui la funzione Greengrass Lambda deve leggere le informazioni sul dispositivo. /sys

Come in precedenza, CreateFunctionDefinition restituisce un ARN di versione della definizione della funzione. L'ARN deve essere usato nella versione di definizione del gruppo.

{ "LatestVersionArn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/definition/functions/3c9b1685-634f-4592-8dfd-7ae1183c28ad/versions/37f0d50e-ef50-4faf-b125-ade8ed12336e", "Name": "MyFunctionDefinition", "LastUpdatedTimestamp": "2017-11-22T02:28:02.325Z", "LatestVersion": "37f0d50e-ef50-4faf-b125-ade8ed12336e", "CreationTimestamp": "2017-11-22T02:28:02.325Z", "Id": "3c9b1685-634f-4592-8dfd-7ae1183c28ad", "Arn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/3c9b1685-634f-4592-8dfd-7ae1183c28ad" }

Aggiungere la funzione Lambda al gruppo

Infine, utilizzare CreateGroupVersion per aggiungere la funzione al gruppo. Per esempio:

aws greengrass create-group-version --group-id "b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5" \ --resource-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/resources/db6bf40b-29d3-4c4e-9574-21ab7d74316c/versions/31d0010f-e19a-4c4c-8098-68b79906fb87" \ --core-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/cores/adbf3475-f6f3-48e1-84d6-502f02729067/versions/297c419a-9deb-46dd-8ccc-341fc670138b" \ --function-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/d1123830-da38-4c4c-a4b7-e92eec7b6d3e/versions/a2e90400-caae-4ffd-b23a-db1892a33c78" \ --subscription-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/subscriptions/7a8ef3d8-1de3-426c-9554-5b55a32fbcb6/versions/470c858c-7eb3-4abd-9d48-230236bfbf6a"
Nota

Per informazioni su come ottenere l'ID del gruppo da utilizzare con questo comando, consulta Ottenere l'ID del gruppo.

Viene restituita una nuova versione del gruppo:

{ "Arn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/groups/b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5/versions/291917fb-ec54-4895-823e-27b52da25481", "Version": "291917fb-ec54-4895-823e-27b52da25481", "CreationTimestamp": "2017-11-22T01:47:22.487Z", "Id": "b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5" }

Il tuo gruppo Greengrass ora contiene la funzione LRAtest Lambda che ha accesso a due risorse: e. TestDirectory TestCamera

In questo esempio, la funzione Lambda, lraTest.py, scritta in Python, scrive sulla risorsa di volume locale:

# Demonstrates a simple use case of local resource access. # This Lambda function writes a file test to a volume mounted inside # the Lambda environment under destLRAtest. Then it reads the file and # publishes the content to the AWS IoT LRAtest topic. import sys import greengrasssdk import platform import os import logging # Setup logging to stdout logger = logging.getLogger(__name__) logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) # Create a Greengrass Core SDK client. client = greengrasssdk.client('iot-data') volumePath = '/dest/LRAtest' def function_handler(event, context): try: client.publish(topic='LRA/test', payload='Sent from AWS IoT Greengrass Core.') volumeInfo = os.stat(volumePath) client.publish(topic='LRA/test', payload=str(volumeInfo)) with open(volumePath + '/test', 'a') as output: output.write('Successfully write to a file.') with open(volumePath + '/test', 'r') as myfile: data = myfile.read() client.publish(topic='LRA/test', payload=data) except Exception as e: logger.error('Failed to publish message: ' + repr(e)) return

Questi comandi sono forniti dall'API Greengrass per creare e gestire le definizioni delle risorse e le versioni di definizione delle risorse:

Risoluzione dei problemi

  • D: Perché la distribuzione del mio gruppo Greengrass non riesce con un errore simile:

    group config is invalid: ggc_user or [ggc_group root tty] don't have ro permission on the file: /dev/tty0

    R: Questo errore indica che il processo Lambda non ha l'autorizzazione per accedere alla risorsa specificata. La soluzione è quella di modificare l'autorizzazione dei file della risorsa in modo che Lambda possa accedervi. (Vedi Autorizzazione di accesso ai file dell'owner del gruppo per informazioni dettagliate).

  • D: Quando configuro /var/run come risorsa di volume, perché la funzione Lambda non si avvia con un messaggio di errore nel runtime.log:

    [ERROR]-container_process.go:39,Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:62: mounting \\\"/var/run\\\" to rootfs \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys\\\" at \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys/run\\\" caused \\\"invalid argument\\\"\""

    R: AWS IoT Greengrass core attualmente non supporta la configurazione di e /var/lib come risorse di /var /var/run volume. Una soluzione è quella di montare prima /var, /var/run o /var/lib in una cartella diversa e quindi configurare la cartella come risorsa di volume.

  • D: Quando configuro /dev/shm come risorsa di volume con autorizzazioni di sola lettura, perché la funzione Lambda non si avvia con un errore nel runtime.log:

    [ERROR]-container_process.go:39,Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:62: mounting \\\"/dev/shm\\\" to rootfs \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys\\\" at \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys/dev/shm\\\" caused \\\"operation not permitted\\\"\""”

    R: /dev/shm può essere configurato solo in lettura/scrittura Cambia l'autorizzazione a livello di risorsa per rw per risolvere il problema.