Cómo configurar el acceso a recursos locales mediante la interfaz de la línea de comando de AWS - AWS IoT Greengrass

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 se publicarán actualizaciones que proporcionen funciones, mejoras, correcciones de errores o parches de seguridad. Los dispositivos que se ejecuten 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 funciones nuevas y es compatible con plataformas adicionales.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Cómo configurar el acceso a recursos locales mediante la interfaz de la línea de comando de AWS

Esta característica está disponible para AWS IoT Greengrass Core versión 1.3 y posteriores.

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 interfaz de la línea de comandos (CLI) de AWS Command Line Interface. Para seguir los pasos del tutorial, debe haber creado un grupo de Greengrass como se describe en Empezar con 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 absoluta local del recurso del dispositivo. 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 absoluta local del recurso de volumen en el dispositivo principal 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 absoluta del recurso de volumen dentro del 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 es verdadero, Greengrass añade automáticamente el propietario del recurso al grupo de sistemas operativos Linux especificado a los privilegios del proceso de 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 de sistemas operativos Linux cuyos privilegios se agregan 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 los resourceId y permission que otorgan a la función Lambda acceso al recurso. Una función de Lambda puede acceder a un máximo de 20 recursos.

ResourceAccessPolicy#Permission: Especifica qué permisos tiene la función Lambda en el recurso. Las opciones disponibles son rw (lectura/escritura) o ro (solo lectura).

AccessSysfs: Si es verdadero, el proceso Lambda puede tener acceso de lectura a la /sys carpeta del dispositivo principal de Greengrass. 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" }

Su grupo de Greengrass ahora contiene la función LRATest Lambda que tiene acceso a dos recursos: y. TestDirectory 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:

Solució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 a rw para resolver el problema.