So konfigurieren Sie den lokalen Ressourcenzugriff über die AWS Befehlszeilenschnittstelle - AWS IoT Greengrass

AWS IoT Greengrass Version 1 trat am 30. Juni 2023 in die erweiterte Lebensphase ein. Weitere Informationen finden Sie in der AWS IoT Greengrass V1 Wartungsrichtlinie. Nach diesem Datum AWS IoT Greengrass V1 werden keine Updates mehr veröffentlicht, die Funktionen, Verbesserungen, Bugfixes oder Sicherheitspatches bieten. Geräte, die auf laufen, werden AWS IoT Greengrass V1 nicht gestört und funktionieren weiterhin und stellen eine Verbindung zur Cloud her. Wir empfehlen Ihnen dringend, zu migrieren AWS IoT Greengrass Version 2, da dies wichtige neue Funktionen und Unterstützung für zusätzliche Plattformen bietet.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

So konfigurieren Sie den lokalen Ressourcenzugriff über die AWS Befehlszeilenschnittstelle

Diese Funktion ist für AWS IoT Greengrass Core v1.3 und höher verfügbar.

Um eine lokale Ressource zu verwenden, müssen Sie eine Ressourcendefinition zur Gruppendefinition hinzufügen, die auf Ihrem Greengrass Core-Gerät bereitgestellt wird. Die Gruppendefinition muss ebenfalls eine Lambda-Funktionsdefinition enthalten, in der Sie Ihren Lambda-Funktionen Zugriffsberechtigungen für lokale Ressourcen erteilen. Weitere Informationen einschließlich Anforderungen und Einschränkungen finden Sie unter Greifen Sie mit Lambda-Funktionen und -Konnektoren auf lokale Ressourcen zu.

In diesem Tutorial wird beschrieben, wie Sie eine lokale Ressource erstellen und den Zugriff darauf mithilfe der AWS Command Line Interface (CLI) konfigurieren. Sie müssen bereits eine Greengrass-Gruppe wie in Erste Schritte mit AWS IoT Greengrass beschrieben erstellt haben, um die Schritte im Tutorial auszuführen.

Ein Tutorial, in dem die AWS Management Console verwendet wird, finden Sie unter So konfigurieren Sie den lokalen Ressourcenzugriff mithilfe der AWS Management Console.

Erstellen lokaler Ressourcen

Zuerst erstellen Sie eine Ressourcendefinition, die die Ressourcen festlegt, auf die mit dem Befehl CreateResourceDefinition zugegriffen wird. In diesem Beispiel erstellen wir die beiden Ressourcen TestDirectory und 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: eine Liste von Resource-Objekten in der Greengrass-Gruppe. Eine Greengrass-Gruppe kann bis zu 50 Ressourcen aufweisen.

Resource#Id: die eindeutige Kennung der Ressource. Die ID wird verwendet, um auf eine Ressource in der Konfiguration der Lambda-Funktion zu verweisen. Maximale Länge: 128 Zeichen. Muster: [a-zA-Z0-9:_-]+.

Resource#Name: der Name der Ressource. Die Ressourcenname wird in der Greengrass-Konsole angezeigt. Maximale Länge: 128 Zeichen. Muster: [a-zA-Z0-9:_-]+.

LocalDeviceResourceData#SourcePath: Der lokale absolute Pfad der Geräteressource. Der Quellpfad für eine Geräteressource kann nur auf ein zeichenorientiertes Gerät oder Blockgerät unter /dev verweisen.

LocalVolumeResourceData#SourcePath: Der lokale absolute Pfad der Volume-Ressource auf dem Greengrass-Kerngerät. Dieser Speicherort befindet sich außerhalb des Containers, indem die Funktion ausgeführt wird. Der Quellpfad für einen Volume-Ressourcentyp darf nicht mit /sys beginnen.

LocalVolumeResourceData#DestinationPath: Der absolute Pfad der Volume-Ressource in der Lambda-Umgebung. Dieser Speicherort befindet sich innerhalb des Containers, indem die Funktion ausgeführt wird.

GroupOwnerSetting: Ermöglicht Ihnen die Konfiguration zusätzlicher Gruppenberechtigungen für den Lambda-Prozess. Dies ist ein optionales Feld. Weitere Informationen finden Sie unter Dateizugriffsberechtigung des Gruppenbesitzers.

GroupOwnerSetting#AutoAddGroupOwner: Wenn „true“, fügt Greengrass den angegebenen Linux-OS-Gruppenbesitzer der Ressource automatisch zu den Lambda-Prozessberechtigungen hinzu. Auf diese Weise erhält der Lambda-Prozess die Dateizugriffsberechtigungen der hinzugefügten Linux-Gruppe.

GroupOwnerSetting#GroupOwner: Gibt den Namen der Linux-Betriebssystemgruppe an, deren Berechtigungen dem Lambda-Prozess hinzugefügt werden. Dies ist ein optionales Feld.

Der ARN einer Ressourcendefinitionsversion wird durch CreateResourceDefinition zurückgegeben. Der ARN sollte beim Aktualisieren einer Gruppendefinition verwendet werden.

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

Erstellen der Greengrass-Funktion

Erstellen Sie nach der Erstellung der Ressourcen mithilfe des CreateFunctionDefinition-Befehls die Greengrass-Funktion und erteilen Sie der Funktion Zugriff auf die 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: Enthält die resourceId und permission, die der Lambda-Funktion Zugriff auf die Ressource gewähren. Eine Lambda-Funktion kann auf maximal 20 Ressourcen zugreifen.

ResourceAccessPolicy#Permission : Gibt an, welche Berechtigungen die Lambda-Funktion für die Ressource hat. Die verfügbaren Optionen sind rw (lesen/schreiben) oder ro (schreibgeschützt).

AccessSysfs: Wenn „true“, kann der Lambda-Prozess Lesezugriff auf den /sys Ordner auf dem Greengrass-Kerngerät haben. Dies wird in Fällen verwendet, in denen die Greengrass-Lambda-Funktion Geräteinformationen aus lesen muss/sys.

Auch hier gibt CreateFunctionDefinition den ARN einer Funktionsdefinitionsversion zurück. Der ARN sollte in Ihrer Gruppendefinitionsversion verwendet werden.

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

Hinzufügen der Lambda-Funktion zur Gruppe

Fügen Sie zum Schluss die Funktion mit CreateGroupVersion zur Gruppe hinzu. Beispielsweise:

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

Wie Sie die Gruppen-ID abrufen, die mit diesem Befehl verwendet wird, erfahren Sie unter Abrufen der Gruppen-ID.

Es wird eine neue Gruppenversion zurückgegeben:

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

Ihre Greengrass-Gruppe enthält jetzt die lraTest-Lambda-Funktion, die Zugriff auf zwei Ressourcen hat: TestDirectory und TestCamera.

Diese in Python geschriebene Lambda-Beispielfunktion lraTest.py schreibt in die lokale Volume-Ressource:

# 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

Diese Befehle werden von der Greengrass-API bereitgestellt, um Ressourcendefinitionen und Ressourcendefinitionsversionen zu erstellen und zu verwalten:

Fehlerbehebung

  • F: Warum schlägt meine Greengrass-Gruppenbereitstellung mit einer Fehlermeldung wie der folgenden fehl:

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

    A: Dieser Fehler gibt an, dass der Lambda-Prozess nicht für den Zugriff auf die angegebene Ressource berechtigt ist. Die Lösung besteht darin, die Dateiberechtigung der Ressource zu ändern, sodass Lambda darauf zugreifen kann. (Für Einzelheiten vgl. Dateizugriffsberechtigung des Gruppenbesitzers).

  • F: Warum startet die Lambda-Funktion nicht und gibt eine Fehlermeldung in "runtime.log" aus, wenn ich /var/run als Volume-Ressource konfiguriere?

    [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\\\"\""

    A: AWS IoT Greengrass Core unterstützt derzeit nicht die Konfiguration von /var/var/run, und /var/lib als Volume-Ressourcen. Um dieses Problem zu umgehen, können Sie zuerst /var, /var/run oder /var/lib in einen anderen Ordner mounten und anschließend den Ordner als Volume-Ressource konfigurieren.

  • F: Warum startet die Lambda-Funktion nicht und gibt eine Fehlermeldung in „runtime.log“ aus, wenn ich /dev/shm als Volume-Ressource mit Berechtigung für den schreibgeschützten Zugriff konfiguriere?

    [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\\\"\""”

    A: /dev/shm kann nur mit Lese-/Schreibzugriff konfiguriert werden. Ändern Sie die Ressourcenberechtigung zu rw, um dieses Problem zu beheben.