AWS IoT Greengrass Version 1 entró en la fase de vida útil prolongada el 30 de junio de 2023. Para obtener más información, consulte la política de mantenimiento de AWS IoT Greengrass V1 Después de esta fecha, AWS IoT Greengrass V1 no publicará actualizaciones que proporcionen características, mejoras, correcciones de errores o parches de seguridad. Los dispositivos que se ejecuten en AWS IoT Greengrass V1 no se verán afectados y seguirán funcionando y conectándose a la nube. Le recomendamos encarecidamente que migre a AWS IoT Greengrass Version 2, ya que añade importantes características nuevas y es compatible con más plataformas.
Cómo configurar el acceso a recursos locales mediante la interfaz de la línea de comando de AWS
Esta característica está disponible en la versión 1.3 y posteriores de AWS IoT Greengrass Core.
Para utilizar un recurso local, debe añadir una definición del recurso a la definición del grupo que se ha implementado en su dispositivo del núcleo de Greengrass. La definición del grupo también debe contener la definición de una función de Lambda en la que se conceden permisos de acceso para recursos locales a las funciones de Lambda. Para obtener más información, incluidos los requisitos y las restricciones, consulte Acceder a recursos locales con conectores y funciones de Lambda.
En este tutorial, se describe el proceso para crear un recurso local y configurar el acceso a él mediante la AWS Command Line Interface (CLI). Para seguir los pasos del tutorial, debe haber creado un grupo de Greengrass como se describe en Introducción a AWS IoT Greengrass.
Para ver un tutorial que utilice la AWS Management Console, consulte Cómo configurar el acceso a recursos locales mediante AWS Management Console.
Creación de recursos locales
En primer lugar, utilice el comando CreateResourceDefinition
para crear una definición de recurso que especifique los recursos a los que se accederá. En este ejemplo, se crean dos recursos, TestDirectory
y 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": "" } } } } ] } }'
Recursos: una lista de objetos Resource
del grupo de Greengrass. Un grupo de Greengrass puede tener hasta 50 recursos.
Resource#Id: el identificador único del recurso. El ID se utiliza para consultar un recurso en la configuración de la función de Lambda. Longitud máxima 128 caracteres. Patrón: [a-zA-Z0-9:_-]+.
Nombre del recurso: el nombre del recurso. El nombre del recurso se muestra en la consola de Greengrass. Longitud máxima 128 caracteres. Patrón: [a-zA-Z0-9:_-]+.
LocalDeviceResourceData#SourcePath: la ruta local completa del dispositivo del recurso. La ruta de origen de un recurso de dispositivo solo puede consultar un dispositivo de carácter o dispositivo de bloques bajo /dev
.
LocalVolumeResourceData#SourcePath: la ruta local completa del recurso de volumen del dispositivo del núcleo de Greengrass. Esta ubicación se encuentra fuera del contenedor en el que se ejecuta la característica. La ruta de origen de un tipo de recurso de volumen no puede empezar con /sys
.
LocalVolumeResourceData#DestinationPath: la ruta completa del recurso de volumen en el entorno Lambda. Esta ubicación se encuentra dentro del contenedor en el que se ejecuta la característica.
GroupOwnerSetting: le permite configurar privilegios de grupo adicionales para el proceso Lambda. Este campo es opcional. Para obtener más información, consulte Group owner file access permission (Permiso de acceso a los archivos del propietario del grupo).
GroupOwnerSetting#AutoAddGroupOwner: si está marcado como "true", Greengrass añade automáticamente el propietario del grupo del sistema operativo Linux especificado, propietario del recurso a los privilegios del proceso Lambda. El proceso Lambda tiene los permisos de acceso a los archivos del grupo de Linux añadido.
GroupOwnerSetting#GroupOwner: especifica el nombre del grupo del sistema operativo Linux cuyos privilegios se añaden al proceso Lambda. Este campo es opcional.
CreateResourceDefinition
devuelve un ARN de la versión de la definición del recurso. El ARN debe utilizarse al actualizar la definición de un grupo.
{ "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" }
Creación de la función de Greengrass
Después de crear los recursos, utilice el comando CreateFunctionDefinition
para crear la característica de Greengrass y conceder a la característica acceso al recurso:
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 resourceId
y permission
, y permiten que la función de Lambda pueda acceder al recurso. Una función de Lambda puede acceder a un máximo de 20 recursos.
ResourceAccessPolicy#Permission: especifica los permisos que tiene la función de Lambda en el recurso. Las opciones disponibles son rw
(lectura/escritura) o ro
(solo lectura).
AccessSysfs: si es "true", el proceso Lambda puede tener acceso de lectura a la carpeta /sys
del dispositivo de Greengrass Core. Esto se utiliza en casos en los que la función de Lambda Greengrass debe leer información del dispositivo de /sys
.
De nuevo, CreateFunctionDefinition
devuelve un ARN de versión de la definición de la característica. El ARN se debe utilizar en la versión de la definición del grupo.
{ "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" }
Añadir la función de Lambda al grupo
Por último, utilice CreateGroupVersion
para añadir la característica al grupo. Por ejemplo:
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
Para obtener información sobre cómo obtener el ID del grupo para utilizarlo con este comando, consulte Obtener el ID del grupo.
Se devuelve una nueva versión del grupo:
{ "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" }
Ahora el grupo de Greengrass contiene una función de Lambda lraTest que tiene acceso a dos recursos: TestDirectory y TestCamera.
Este ejemplo de función de Lambda lraTest.py
, escrito en Python, escribe en el recurso del volumen local:
# 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
Estos comandos los proporciona la API de Greengrass para crear y gestionar definiciones del recurso y versiones de definiciones del recurso:
Resolución de problemas
-
P: ¿Por qué la implementación de mi grupo de Greengrass falla con un error similar a:
group config is invalid: ggc_user or [ggc_group root tty] don't have ro permission on the file: /dev/tty0
R: Este error indica que el proceso Lambda no tiene permiso para acceder a los recursos especificados. La solución es cambiar el permiso a los archivos del recurso para que Lambda pueda acceder a él. (Consulte Group owner file access permission (Permiso de acceso a los archivos del propietario del grupo) para obtener información).
-
P: Cuando configuro
/var/run
como un recurso de volumen, ¿por qué la función de Lambda falla al iniciar con un mensaje de error en 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: Actualmente, AWS IoT Greengrass core no es compatible con la configuración de
/var
,/var/run
y/var/lib
como recursos de volumen. Una alternativa es montar/var
,/var/run
o/var/lib
en otra carpeta primero y, a continuación, configurar la carpeta como un recurso de volumen. -
P: Cuando configuro
/dev/shm
como un recurso de volumen con un permiso de solo lectura, ¿por qué la función de Lambda no se inicia y da un error en 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
solo se puede configurar como de lectura o escritura. Cambie el permiso en el nivel de recursos arw
para resolver el problema.