Comment configurer l'accès aux ressources locales à l'aide de l'interface de ligne de AWS commande - AWS IoT Greengrass

AWS IoT Greengrass Version 1 est entré dans la phase de durée de vie prolongée le 30 juin 2023. Pour plus d'informations, consultez la politique de AWS IoT Greengrass V1 maintenance. Après cette date, AWS IoT Greengrass V1 ne publiera pas de mises à jour fournissant des fonctionnalités, des améliorations, des corrections de bogues ou des correctifs de sécurité. Les appareils qui fonctionnent AWS IoT Greengrass V1 sous tension ne seront pas perturbés et continueront à fonctionner et à se connecter au cloud. Nous vous recommandons vivement de migrer vers AWS IoT Greengrass Version 2, qui ajoute de nouvelles fonctionnalités importantes et prend en charge des plateformes supplémentaires.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Comment configurer l'accès aux ressources locales à l'aide de l'interface de ligne de AWS commande

Cette fonctionnalité est disponible pour AWS IoT Greengrass Core v1.3 et versions ultérieures.

Pour utiliser une ressource locale, vous devez ajouter une définition de ressource à la définition de groupe déployée sur votre appareil principal Greengrass. La définition de groupe doit également contenir une définition de fonction Lambda dans laquelle vous accordez les autorisations d'accès à vos fonctions Lambda pour les ressources locales. Pour en savoir plus, notamment les exigences et contraintes, consultez Accédez à des ressources locales avec des fonctions et des connecteurs Lambda.

Ce didacticiel décrit le processus de création d'une ressource locale et de configuration de l'accès à celle-ci à l'aide de la AWS Command Line Interface (CLI). Pour suivre les étapes de ce didacticiel, vous devez avoir déjà créé un groupe Greengrass comme décrit dans Commencer avec AWS IoT Greengrass.

Pour obtenir un didacticiel qui utilise AWS Management Console, consultez Configuration de l'accès aux ressources locales à l'aide de l'AWS Management Console.

Création de ressources locales

Tout d'abord, utilisez la commande CreateResourceDefinition pour créer une définition de ressource qui spécifie les ressources auxquelles vous voulez accéder. Dans cet exemple, nous créons deux ressources, TestDirectory et 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": "" } } } } ] } }'

Ressources : liste des objets Resource du groupe Greengrass. Un groupe Greengrass peut avoir jusqu'à 50 ressources.

Resource#Id : identifiant unique de la ressource. L'ID est utilisé pour se référer à une ressource dans la configuration de la fonction Lambda. Longueur maximale de 128 caractères. Modèle : [a-zA-Z0-9:_-]+.

Resource#Name : nom de la ressource. Le nom de la ressource s'affiche dans la console Greengrass. Longueur maximale de 128 caractères. Modèle : [a-zA-Z0-9:_-]+.

LocalDeviceResourceData# SourcePath : Le chemin absolu local de la ressource de l'appareil. Le chemin source d'une ressource d'appareil ne peut faire référence qu'à un appareil caractère ou un appareil bloc sous /dev.

LocalVolumeResourceData# SourcePath : Le chemin absolu local de la ressource de volume sur le périphérique principal de Greengrass. Cet emplacement est en dehors du conteneur dans lequel la fonction s'exécute. Le chemin source d'un type de ressource de volume ne peut pas commencer par /sys.

LocalVolumeResourceData# DestinationPath : Le chemin absolu de la ressource volumique dans l'environnement Lambda. Cet emplacement est dans le conteneur dans lequel la fonction s'exécute.

GroupOwnerSetting: vous permet de configurer des privilèges de groupe supplémentaires pour le processus Lambda. Ce champ est facultatif. Pour plus d’informations, consultez Autorisation d'accès fichier pour le propriétaire du groupe.

GroupOwnerSetting# AutoAddGroupOwner : Si vrai, Greengrass ajoute automatiquement le propriétaire du groupe de système d'exploitation Linux spécifié pour la ressource aux privilèges du processus Lambda. Ainsi, le processus Lambda a les autorisations d'accès aux fichiers du groupe Linux ajouté.

GroupOwnerSetting# GroupOwner : Spécifie le nom du groupe de systèmes d'exploitation Linux dont les privilèges sont ajoutés au processus Lambda. Ce champ est facultatif.

Un ARN de version de définition de ressource est renvoyé par CreateResourceDefinition. L'ARN doit être utilisé lors de la mise à jour d'une définition de groupe.

{ "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" }

Création de la fonction Greengrass

Une fois les ressources créées, utilisez la commande CreateFunctionDefinition pour créer la fonction Greengrass et lui accorder l'accès à la ressource :

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: contient le resourceId et permission qui permet à la fonction Lambda d'accéder à la ressource. Une fonction Lambda peut accéder à un maximum de 20 ressources.

ResourceAccessPolicy#Permission : Spécifie les autorisations dont dispose la fonction Lambda sur la ressource. Les options disponibles sont rw (lecture/écriture) ou ro (lecture seule).

AccessSysfs: Si c'est vrai, le processus Lambda peut avoir un accès en lecture au /sys dossier sur le périphérique principal de Greengrass. Ceci est utilisé dans les cas où la fonction Greengrass Lambda doit lire les informations de l'appareil. /sys

Là encore, CreateFunctionDefinition renvoie un ARN de version de définition de fonction. L'ARN doit être utilisé dans votre version de définition de groupe.

{ "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" }

Ajoutez la fonction Lambda au groupe

Enfin, utilisez CreateGroupVersion pour ajouter la fonction au groupe. Par exemple :

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"
Note

Pour savoir comment obtenir l'ID de groupe à utiliser avec ces commandes, veuillez consulter Obtention de l'ID de groupe.

Une nouvelle version de groupe est retournée :

{ "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" }

Votre groupe Greengrass contient désormais la fonction LRatest Lambda qui a accès à deux ressources : et. TestDirectory TestCamera

Cet exemple de fonction Lambda, lraTest.py, écrite en Python, écrit sur la ressource de 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

Ces commandes sont fournies par l'API Greengrass pour créer et gérer des définitions de ressource et des versions de définitions de ressources :

Résolution des problèmes

  • Q : Pourquoi le déploiement de mon groupe Greengrass échoue-t-il avec une erreur similaire à :

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

    R : Cette erreur indique que le processus Lambda n'a pas l'autorisation d'accéder à la ressource spécifiée. La solution est de modifier l'autorisation de fichier de la ressource afin que Lambda puisse y accéder. (Consultez Autorisation d'accès fichier pour le propriétaire du groupe pour plus de détails).

  • Q : Quand je configure /var/run comme ressource de volume, pourquoi la fonction Lambda ne réussit-elle pas à démarrer avec un message d'erreur dans le 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 : le AWS IoT Greengrass noyau ne prend actuellement pas en charge la configuration de /var et /var/run en /var/lib tant que ressources de volume. Une solution de contournement consiste à monter d'abord /var, /var/run ou /var/lib dans un autre dossier, puis à configurer le dossier comme ressource de volume.

  • Q : Quand je configure /dev/shm comme ressource de volume avec l'autorisation en lecture seule, pourquoi la fonction Lambda ne réussit-elle pas à démarrer avec un message d'erreur dans le 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 ne peut être configuré qu'en lecture/écriture. Modifiez l'autorisation de la ressource en rw pour résoudre le problème.