

Aviso de fin de soporte: el 7 de octubre de 2026, AWS suspenderemos el soporte para AWS IoT Greengrass Version 1. Después del 7 de octubre de 2026, ya no podrá acceder a los AWS IoT Greengrass V1 recursos. Para obtener más información, visita [Migrar desde AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html).

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.

# Ejecute funciones Lambda en el núcleo AWS IoT Greengrass
<a name="lambda-functions"></a>

AWS IoT Greengrass proporciona un entorno de ejecución Lambda en contenedores para el código definido por el usuario en el que se crea. AWS Lambda Las funciones de Lambda que se implementan en un AWS IoT Greengrass núcleo se ejecutan en el entorno de ejecución de Lambda local del núcleo. Las funciones de Lambda locales pueden ser activadas por eventos locales, mensajes de la nube y otros orígenes, lo que lleva la funcionalidad de computación local a los dispositivos del cliente. Por ejemplo, puede utilizar funciones de Lambda de Greengrass para filtrar los datos del dispositivo antes de transmitir los datos a la nube.

Para implementar una función de Lambda en un núcleo, añada la función a un grupo de Greengrass (haciendo referencia a la función de Lambda existente), defina una configuración específica del grupo y, a continuación, implemente el grupo. Si la función accede a AWS los servicios, también debe añadir los permisos necesarios al rol de grupo [Greengrass](group-role.md).

Puede configurar parámetros que determinan cómo se ejecutan las funciones de Lambda, incluidos permisos, aislamiento, límites de memoria, etc. Para obtener más información, consulte [Control de la ejecución de funciones de Lambda de Greengrass utilizando la configuración específica del grupo](lambda-group-config.md).

**nota**  
Esta configuración también permite ejecutarla AWS IoT Greengrass en un contenedor de Docker. Para obtener más información, consulte [Ejecución AWS IoT Greengrass en un contenedor Docker](run-gg-in-docker-container.md).

La siguiente tabla muestra los [AWS Lambda tiempos de ejecución](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) compatibles y las versiones del software AWS IoT Greengrass principal en las que se pueden ejecutar.


****  

| Lenguaje o plataforma | Versión de GGC | 
| --- | --- | 
| Python 3.8 | 1.11 | 
| Python 3.7 | 1.9 o posteriores | 
| Python 2.7 \$1 | 1.0 o posteriores | 
| Java 8 | 1.1 o posteriores | 
| Node.js 12.x \$1 | 1.10 o posteriores | 
| Node.js 8.10 \$1 | 1.9 o posteriores | 
| Node.js 6.10 \$1 | 1.1 o posteriores | 
| C, C\$1\$1 | 1.6 o posteriores | 

\$1 Puede ejecutar funciones de Lambda que usen estos tiempos de ejecución en las versiones compatibles de AWS IoT Greengrass, pero no puede crearlas en. AWS Lambda Si el tiempo de ejecución de su dispositivo es diferente del tiempo de ejecución de Lambda AWS especificado para esa función, puede elegir su propio tiempo de ejecución utilizando `FunctionRuntimeOverride` en `FunctionDefintionVersion`. Para obtener más información, consulte [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html). Para más información sobre los tiempos de ejecución compatibles, consulte la [Política de soporte en tiempo de ejecución](https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html) en la *Guía de desarrolladores de AWS Lambda *.

## SDKs para funciones Lambda de Greengrass
<a name="lambda-sdks"></a>

AWS proporciona tres funciones Lambda de Greengrass SDKs que se ejecutan en un núcleo. AWS IoT Greengrass SDKs Están contenidas en paquetes diferentes, por lo que las funciones pueden usarlas simultáneamente. Para utilizar un SDK en una función de Lambda de Greengrass, inclúyalo en el paquete de implementación de funciones de Lambda que subió a AWS Lambda.

**AWS IoT Greengrass SDK básico**  <a name="lambda-sdks-core"></a>
Permite que las funciones de Lambda locales interactúen con el núcleo para:  <a name="gg-core-sdk-functionality"></a>
+ Intercambia mensajes MQTT con AWS IoT Core.
+ Intercambiar mensajes MQTT con conectores, dispositivos de cliente y otras funciones de Lambda en el grupo de Greengrass.
+ Interactuar con el servicio de sombra local.
+ Invocar otras funciones de Lambda locales.
+ Tener acceso a [recursos de secretos](secrets.md).
+ Interactuar con el [administrador de secuencias](stream-manager.md).
AWS IoT Greengrass proporciona el SDK AWS IoT Greengrass principal en los siguientes idiomas y plataformas GitHub.  <a name="gg-core-sdk-download-list"></a>
+ [AWS IoT Greengrass Core SDK for Java](https://github.com/aws/aws-greengrass-core-sdk-java/)
+ [AWS IoT Greengrass SDK básico para Node.js](https://github.com/aws/aws-greengrass-core-sdk-js/)
+ [AWS IoT Greengrass SDK básico para Python](https://github.com/aws/aws-greengrass-core-sdk-python/)
+ [AWS IoT Greengrass SDK básico para C](https://github.com/aws/aws-greengrass-core-sdk-c/)
Para incluir la dependencia del SDK AWS IoT Greengrass principal en el paquete de implementación de funciones Lambda:  

1. Descargue el idioma o la plataforma del paquete AWS IoT Greengrass Core SDK que coincida con el tiempo de ejecución de la función Lambda.

1. Descomprima el paquete descargado para obtener el SDK. El SDK es la carpeta `greengrasssdk`.

1. Incluya `greengrasssdk` en el paquete de implementación de funciones de Lambda que contiene su código de función. Este es el paquete en el que se carga AWS Lambda al crear la función Lambda.
   
 **StreamManagerClient**  
Solo se SDKs puede usar el siguiente AWS IoT Greengrass núcleo para las operaciones del [administrador de flujos](stream-manager.md):  <a name="streammanagerclient-sdk-versions"></a>
+ SDK de Java (versión 1.4.0 o posterior)
+ SDK de Python (versión 1.5.0 o posterior)
+ SDK de Node.js (versión 1.6.0 o posterior)
Para usar el SDK AWS IoT Greengrass principal de Python para interactuar con el administrador de transmisiones, debe instalar Python 3.7 o una versión posterior. También debe instalar dependencias para incluirlas en sus paquetes de implementación de funciones de Lambda de Python:  <a name="python-sdk-dependencies-stream-manager"></a>

1. Vaya al directorio de SDK que contiene el archivo de `requirements.txt`. Este archivo registra las dependencias.

1. Instale las dependencias del SDK. Por ejemplo, ejecute el siguiente comando de `pip` para instalarlas en el directorio actual:

   ```
   pip install --target . -r requirements.txt
   ```
   
**Instalar el AWS IoT Greengrass Core SDK para Python en el dispositivo principal**  
Si ejecuta funciones Lambda de Python, también puede utilizarlas [https://pypi.org/project/pip/](https://pypi.org/project/pip/)para instalar el AWS IoT Greengrass Core SDK para Python en el dispositivo principal. A continuación, puede implementar las funciones sin incluir el SDK en el paquete de implementación de la función de Lambda. Para obtener más información, consulte [greengrasssdk](https://pypi.org/project/greengrasssdk/).  
Este soporte está dirigido a núcleos con restricciones de tamaño. Le recomendamos que incluya el SDK en sus paquetes de implementación de funciones de Lambda cuando sea posible.  
 

**AWS IoT Greengrass SDK de Machine Learning**  <a name="lambda-sdks-ml"></a>
Permite a las funciones de Lambda consumir modelos de machine learning (ML) que se implementan en el núcleo de Greengrass como recursos de ML. Las funciones de Lambda pueden usar el SDK para invocar e interactuar con un servicio de inferencia local que se implementa en el núcleo como un conector. Las funciones de Lambda y los conectores de ML también pueden usar el SDK para enviar datos al conector de ML Feedback para cargarlos y publicarlos. Para obtener más información, incluidos los ejemplos de código que utiliza el SDK, consulte [Conector de la clasificación de ML Image](image-classification-connector.md), [Conector de detección de objetos de ML](obj-detection-connector.md) y [Conector de ML Feedback](ml-feedback-connector.md).  
En la siguiente tabla se enumeran los idiomas o plataformas compatibles con las versiones del SDK y las versiones del software AWS IoT Greengrass principal en las que se pueden ejecutar.    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/greengrass/v1/developerguide/lambda-functions.html)
Para obtener información sobre la descarga, consulte [AWS IoT Greengrass Software ML SDK](what-is-gg.md#gg-ml-sdk-download).

**AWS SDKs**  <a name="lambda-sdks-aws"></a>
Permite a las funciones Lambda locales realizar llamadas directas a AWS servicios, como Amazon S3, DynamoDB y. AWS IoT AWS IoT Greengrass Para utilizar un SDK de AWS en una función de Lambda de Greengrass, debe incluirlo en el paquete de implementación. Cuando utilice el AWS SDK en el mismo paquete que el SDK AWS IoT Greengrass principal, asegúrese de que las funciones de Lambda utilicen los espacios de nombres correctos. Las funciones de Lambda de Greengrass no pueden comunicarse con los servicios en la nube cuando el núcleo está desconectado.  
Descárguelo AWS SDKs del Centro de recursos de [introducción](https://aws.amazon.com/getting-started/tools-sdks/).

Para obtener más información acerca de la creación de un paquete de implementación, consulte [Crear y empaquetar una función de Lambda](create-lambda.md) en el tutorial de introducción o [Creación de un paquete de implementación](https://docs.aws.amazon.com/lambda/latest/dg/deployment-package-v2.html) en la *Guía del desarrollador de AWS Lambda *.

### Migración de funciones de Lambda basadas en la nube
<a name="lambda-migrate-sdks"></a>

El SDK AWS IoT Greengrass principal sigue el modelo de programación del AWS SDK, lo que facilita la migración de funciones de Lambda desarrolladas para la nube a funciones de Lambda que se ejecutan en un núcleo. AWS IoT Greengrass 

Por ejemplo, la siguiente función de Python Lambda utiliza la AWS SDK para Python (Boto3) para publicar un mensaje en el tema `some/topic` en la nube:

```
import boto3

iot_client = boto3.client("iot-data")
response = iot_client.publish(
    topic="some/topic", qos=0, payload="Some payload".encode()
)
```

Para portar la función a un AWS IoT Greengrass núcleo, en la `import` declaración y en la `client` inicialización, cambie el nombre del `boto3` módulo a`greengrasssdk`, como se muestra en el siguiente ejemplo:

```
import greengrasssdk

iot_client = greengrasssdk.client("iot-data")
iot_client.publish(topic="some/topic", qos=0, payload="Some payload".encode())
```

**nota**  
El SDK AWS IoT Greengrass principal solo admite el envío de mensajes MQTT con QoS = 0. Para obtener más información, consulte [Mensaje de calidad del servicio](gg-core.md#message-quality-of-service).

La similitud entre los modelos de programación también le permite desarrollar sus funciones Lambda en la nube y luego migrarlas a ella AWS IoT Greengrass con un esfuerzo mínimo. Los [ejecutables de Lambda](#lambda-executables) no se ejecutan en la nube, por lo que no puede usar el AWS SDK para desarrollarlos en la nube antes de la implementación.

## Referencia a funciones de Lambda por alias o versión
<a name="lambda-versions-aliases"></a>

Los grupos de Greengrass pueden hacer referencia a una función de Lambda por versión o alias (recomendado). El uso de un alias facilita la gestión de las actualizaciones del código porque no tiene que cambiar la tabla de suscripción o la definición del grupo cuando se actualiza el código de la función. En su lugar, basta con apuntar el alias a la nueva versión de la función. Los alias se resuelven en números de versión durante la implementación del grupo. Cuando utiliza alias, la versión resuelta se actualiza a la versión a la que apunta el alias en el momento de la implementación.

AWS IoT Greengrass **no admite los alias de Lambda para las versiones \$1LATEST.** Las versiones **\$1LATEST** no están vinculadas a versiones de función publicadas, inmutables y se pueden cambiar en cualquier momento, lo cual va en contra del principio de inmutabilidad de AWS IoT Greengrass .

Una práctica habitual para mantener las funciones de Lambda de Greengrass actualizadas con cambios en el código es utilizar un alias denominado **PRODUCTION** en su grupo y suscripciones de Greengrass. A medida que promueve nuevas versiones de su función de Lambda a producción, apunte el alias a la versión estable más reciente y, a continuación, vuelva a implementar el grupo. También puede usar este método para revertir a una versión anterior.

# Control de la ejecución de funciones de Lambda de Greengrass utilizando la configuración específica del grupo
<a name="lambda-group-config"></a>

AWS IoT Greengrass proporciona una gestión basada en la nube de las funciones de Greengrass Lambda. Aunque el código y las dependencias de una función Lambda se administran mediante AWS Lambda, puede configurar el comportamiento de la función Lambda cuando se ejecuta en un grupo de Greengrass.

## Configuración específica del grupo
<a name="lambda-group-config-properties"></a>

AWS IoT Greengrass proporciona los siguientes ajustes de configuración específicos de grupo para las funciones Lambda de Greengrass.

**Usuario del sistema y grupo**  <a name="lambda-access-identity"></a>
La identidad de acceso que se utiliza para ejecutar una función de Lambda. De forma predeterminada, las funciones de Lambda se ejecutan como la [identidad de acceso predeterminada del grupo](#lambda-access-identity-groupsettings). Por lo general, son las cuentas del sistema AWS IoT Greengrass estándar (ggc\$1user y ggc\$1group). Puede cambiar la configuración y elegir el ID de usuario y el ID de grupo con los permisos necesarios para ejecutar la función de Lambda. Puede anular tanto UID como GID o uno solo si deja el otro campo en blanco. Esta configuración le ofrece un control más detallado sobre el acceso a recursos de dispositivos. Le recomendamos que configure su hardware de Greengrass con los límites de recursos adecuados, permisos de archivos y cuotas de disco para los usuarios y grupos cuyos permisos se utilizan para la ejecución de funciones de Lambda.  
Esta función está disponible para AWS IoT Greengrass Core v1.7 y versiones posteriores.  
Se recomienda evitar la ejecución de funciones de Lambda como raíz a menos que sea absolutamente necesario. Si se ejecuta como raíz, se incrementan los siguientes riesgos:  
+ El riesgo de cambios no intencionados, como la eliminación accidental de un archivo crítico.
+ El riesgo que representan personas malintencionadas para sus datos y dispositivos.
+ El riesgo de que un contenedor se escape cuando los contenedores de Docker funcionan con `--net=host` y `UID=EUID=0`.
Si necesita ejecutarla como root, debe actualizar la AWS IoT Greengrass configuración para habilitarla. Para obtener más información, consulte [Ejecución de una función de Lambda como raíz](#lambda-running-as-root).  
**ID de usuario del sistema (número)**  
El ID de usuario para el usuario que tiene los permisos necesarios para ejecutar la función de Lambda. Esta opción solo está disponible si elige **Ejecutar como otro ID de usuario/ID de grupo**. Puede usar el **getent passwd** comando en su dispositivo AWS IoT Greengrass principal para buscar el ID de usuario que desea usar para ejecutar la función Lambda.  
Si usa el mismo ID para ejecutar los procesos y la función de Lambda en un dispositivo de Greengrass core, su rol de grupo de Greengrass puede otorgar credenciales temporales para los procesos. Los procesos pueden usar las credenciales temporales en todas las implementaciones de Greengrass core.  
**ID de grupo del sistema (número)**  
El ID de grupo para el grupo que tiene los permisos necesarios para ejecutar la función de Lambda. Esta configuración solo está disponible si eliges ejecutarla como **otro ID/group seudónimo**. Puede usar el **getent group** comando en su dispositivo AWS IoT Greengrass principal para buscar el ID de grupo que desea usar para ejecutar la función Lambda.

**Creación de contenedores de funciones de Lambda**  <a name="lambda-function-containerization"></a>
Elija si la función de Lambda se ejecuta con la creación de contenedores predeterminada para el grupo o especifique la creación de contenedores que se debe utilizar siempre para esta función de Lambda.  
El modo de creación de contenedores de una función de Lambda determina su nivel de aislamiento.  
+ Las funciones de Lambda en contenedor se ejecutan en el modo **Contenedor de Greengrass**. La función Lambda se ejecuta en un entorno de ejecución aislado (o espacio de nombres) dentro del contenedor. AWS IoT Greengrass 
+ Las funciones de Lambda que no están en un contenedor se ejecutan en el modo **Sin contenedor**. Las funciones de Lambda se ejecutan como un proceso normal de Linux sin ningún tipo de aislamiento.
Esta función está disponible para AWS IoT Greengrass Core v1.7 y versiones posteriores.  
Le recomendamos que ejecute las funciones de Lambda en un contenedor de Greengrass a menos que su caso de uso requiera la ejecución sin creación de contenedores. Cuando las funciones de Lambda se ejecutan en un contenedor de Greengrass, puede utilizar recursos de dispositivos locales asociados, así como disfrutar de los beneficios del aislamiento y de una mayor seguridad. Antes de cambiar la creación de contenedores, consulte [Consideraciones a la hora de elegir la creación de contenedores de la función de Lambda.](#lambda-containerization-considerations).  
Para la ejecución sin habilitar su espacio de nombres de kernel de dispositivo ni el grupo de control, todas las funciones de Lambda se deben ejecutar sin creación de contenedores. Puede conseguirlo fácilmente configurando la creación de contenedores predeterminada para el grupo. Para obtener información, consulte [Configuración de la creación de contenedores predeterminada para funciones de Lambda de un grupo](#lambda-containerization-groupsettings).

**Memory limit (Límite de memoria)**  
Asignación de memoria para la función. El valor predeterminado es 16 MB.  
La configuración del límite de memoria se descarta al cambiar la función de Lambda para ejecución sin creación de contenedores. Las funciones de Lambda que se ejecutan sin creación de contenedores no tienen límite de memoria. La configuración del límite de memoria se descarta al cambiar la función de Lambda o la configuración de la creación de contenedores predeterminada del grupo para ejecutarse sin creación de contenedores.

**Timeout (Tiempo de espera)**  
La cantidad de tiempo antes de que se termine la función o solicitud. El valor predeterminado es de 3 segundos.

**Anclado**  
El ciclo de vida de una función de Lambda puede ser *bajo demanda* o de *larga duración*. El valor predeterminado es bajo demanda.  
Una función de Lambda bajo demanda se inicia en un contenedor nuevo o reutilizado cuando se invoca. Las solicitudes a la función puede ser procesados por cualquier contenedor disponible. Una función Lambda de larga duración (o *anclada) se* inicia automáticamente después del inicio y sigue ejecutándose en su AWS IoT Greengrass propio contenedor (o entorno de pruebas). Todas las solicitudes a la función se procesan en el mismo contenedor. Para obtener más información, consulte [Configuración del ciclo de vida de las funciones de Lambda de Greengrass](lambda-functions.md#lambda-lifecycle).

**Read access to /sys directory (Acceso de lectura al directorio /sys)**  
Si la función puede obtener acceso o no a la carpeta /sys del host. Utilícelo cuando la función deba leer información del dispositivo desde /sys. El valor predeterminado es false.  
Esta configuración no está disponible cuando se ejecuta de una función de Lambda sin creación de contenedores. El valor de esta configuración se descarta al cambiar la función de Lambda para que se ejecute sin contenedores.

**Tipo de codificación**  
El tipo de codificación esperado de la carga de entrada de la función, JSON o binaria. El valor predeterminado es JSON.  
Support para el tipo de codificación binaria está disponible a partir de AWS IoT Greengrass Core Software v1.5.0 y AWS IoT Greengrass Core SDK v1.1.0. Aceptar datos de entrada binarios puede ser útil para funciones que interactúan con datos de los dispositivos, ya que las limitadas capacidades de hardware de estos a menudo hacen que sea difícil o imposible construir un tipo de datos JSON.  
Los [Ejecutables de Lambda](lambda-functions.md#lambda-executables) solo admiten el tipo de codificación binaria (no JSON).

**Argumentos del proceso**  
Los argumentos de línea de comandos para pasar a la función de Lambda cuando se ejecuta.

**Variables de entorno**  
Pares clave-valor que pueden pasar ajustes de forma dinámica al código y bibliotecas de la función. Las variables de entorno local funcionan de la misma forma que las [variables de entorno de las funciones de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html), pero están disponibles en el entorno de núcleo.

**Políticas de acceso a recursos**  
Una lista de hasta 10 [recursos locales](access-local-resources.md), [recursos secretos](secrets.md) y [recursos de machine learning](ml-inference.md) a los que puede acceder la función de Lambda y los correspondientes permisos `read-only` o `read-write`. En la consola, estos recursos *afiliados* aparecen en la página de configuración del grupo, en la pestaña **Recursos**.  
El [modo de creación de contenedores](#lambda-function-containerization) afecta a la forma en que las funciones de Lambda pueden acceder a los recursos de volumen y dispositivos locales y a los recursos de machine learning.  
+ Las funciones de Lambda que no están en un contenedor deben acceder directamente a los recursos de volumen y dispositivos locales a través del sistema de archivos del dispositivo central.
+ Para permitir que las funciones de Lambda que no están en un contenedor tengan acceso a los recursos de machine learning del grupo de Greengrass, debe establecer las propiedades de permisos de acceso y de propietario del recurso en el recurso de machine learning. Para obtener más información, consulte [Acceso a recursos de machine learning desde funciones de Lamba](access-ml-resources.md).

*Para obtener información sobre el uso de la AWS IoT Greengrass API para establecer valores de configuración específicos de grupo para las funciones Lambda definidas por el usuario, [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html)consulte la Referencia de *AWS IoT Greengrass Version 1 la API [create-function-definition](https://docs.aws.amazon.com/cli/latest/reference/greengrass/create-function-definition.html)o la* Referencia de comandos.AWS CLI * Para implementar funciones de Lambda en un núcleo de Greengrass, cree una versión de definición de función que contenga sus funciones, cree una versión de grupo que haga referencia a la versión de definición de función y a otros componentes del grupo y, a continuación, [implemente el grupo](deployments.md).

## Ejecución de una función de Lambda como raíz
<a name="lambda-running-as-root"></a>

Esta función está disponible para AWS IoT Greengrass Core v1.7 y versiones posteriores.

Antes de poder ejecutar una o más funciones de Lambda como root, primero debe actualizar la AWS IoT Greengrass configuración para habilitar el soporte. El soporte para ejecutar funciones de Lambda como raíz está desactivado de forma predeterminada. La implementación falla si intenta implementar una función Lambda y ejecutarla como root (UID y GID de 0) y no ha actualizado la configuración. AWS IoT Greengrass En el registro de tiempo de ejecución (*greengrass\$1root*/ggc/var/log/system/runtime.log) aparece un error como el siguiente:

```
lambda(s)
[list of function arns] are configured to run as root while Greengrass is not configured to run lambdas with root permissions
```

**importante**  
Se recomienda evitar la ejecución de funciones de Lambda como raíz a menos que sea absolutamente necesario. Si se ejecuta como raíz, se incrementan los siguientes riesgos:  
El riesgo de cambios no intencionados, como la eliminación accidental de un archivo crítico.
El riesgo que representan personas malintencionadas para sus datos y dispositivos.
El riesgo de que un contenedor se escape cuando los contenedores de Docker funcionan con `--net=host` y `UID=EUID=0`.

**Para permitir que las funciones de Lambda se ejecuten como raíz**

1. En tu AWS IoT Greengrass dispositivo, navega hasta la carpeta *greengrass-root* /config.
**nota**  
De forma predeterminada, *greengrass-root* es el directorio /greengrass.

1. Modifique el archivo config.json para añadir `"allowFunctionsToRunAsRoot" : "yes"` al campo `runtime`. Por ejemplo:

   ```
   {
     "coreThing" : {
       ...
     },
     "runtime" : {
       ...
       "allowFunctionsToRunAsRoot" : "yes"
     },
     ...
   }
   ```

1. Utilice los siguientes comandos para reiniciar: AWS IoT Greengrass

   ```
   cd /greengrass/ggc/core
   sudo ./greengrassd restart
   ```

   Ahora puede establecer el ID de usuario y el ID de grupo (UID/GID) de las funciones de Lambda en 0 para ejecutar la función de Lambda como raíz.

Puede cambiar el valor de `"allowFunctionsToRunAsRoot"` a `"no"` y reiniciar AWS IoT Greengrass si quiere impedir que las funciones de Lambda se ejecuten como root.

## Consideraciones a la hora de elegir la creación de contenedores de la función de Lambda.
<a name="lambda-containerization-considerations"></a>

Esta función está disponible para AWS IoT Greengrass Core v1.7 y versiones posteriores.

De forma predeterminada, las funciones de Lambda se ejecutan dentro de un AWS IoT Greengrass contenedor. Dicho contenedor proporciona aislamiento entre las funciones y el host, lo que brinda mayor seguridad tanto al host como a las funciones del contenedor.

Le recomendamos que ejecute las funciones de Lambda en un contenedor de Greengrass a menos que su caso de uso requiera la ejecución sin creación de contenedores. Al ejecutar las funciones de Lambda en un contenedor Greengrass, tiene más control sobre la restricción de acceso a los recursos.

A continuación, se muestran algunos casos de uso de ejemplo para la ejecución sin creación de contenedores:
+ Desea ejecutarlas AWS IoT Greengrass en un dispositivo que no admita el modo contenedor (por ejemplo, porque utiliza una distribución especial de Linux o tiene una versión del núcleo demasiado antigua).
+ Desea ejecutar su función de Lambda en otro entorno de contenedor con su propio OverlayFS, pero detecta conflictos de OverlayFS cuando la ejecuta en un contenedor de Greengrass.
+ Necesita acceso a recursos locales con rutas que no se pueden determinar en el momento de la implementación o cuyas rutas pueden cambiar tras la implementación, como en el caso de algunos dispositivos conectables.
+ Tiene una aplicación heredada que se ha escrito como un proceso y ha detectado problemas cuando se ejecuta como una función de Lambda en un contenedor.


**Diferencias en la creación de contenedores**  

| Creación de contenedores | Notas | 
| --- | --- | 
| Contenedor de Greengrass | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/greengrass/v1/developerguide/lambda-group-config.html) | 
| Sin contenedor | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/greengrass/v1/developerguide/lambda-group-config.html) | 

**nota**  
La configuración de creación de contenedores predeterminada para el grupo Greengrass no se aplica a los [conectores](connectors.md).

El cambio de la creación de contenedores para una función de Lambda puede provocar problemas durante la implementación. Si había asignado recursos locales a la función de Lambda que ya no están disponibles con la nueva configuración de creación de contenedores, la implementación genera un error.
+ Cuando se cambia una función de Lambda de ejecución en un contenedor de Greengrass a ejecución sin creación de contenedores, se descartan los límites de memoria de la función. Debe acceder al sistema de archivos directamente en lugar de utilizar los recursos locales asociados. Debe eliminar los recursos asociados antes de la implementación.
+ Al cambiar una función de Lambda de la ejecución sin creación de contenedores a la ejecución en un contenedor, la función de Lambda pierde el acceso directo al sistema de archivos. Debe definir un límite de memoria para cada función de o aceptar la opción predeterminada de 16 MB. Puede establecer esta configuración para cada función de Lambda antes de la implementación.<a name="change-containerization-lambda"></a>

**Para cambiar la configuración de creación de contenedores para una función de Lambda**

1. <a name="console-gg-groups"></a>En el panel de navegación de la AWS IoT consola, en **Administrar**, expanda **los dispositivos Greengrass** y, a continuación, elija **Grupos (V1)**.

1. <a name="lambda-choose-group"></a>Elija el grupo que contiene la función de Lambda cuya configuración desea cambiar.

1. <a name="lambda-choose-lambdas"></a>Elija la pestaña de **Funciones de Lambda**.

1. <a name="lambda-edit-lambda"></a>En la función de Lambda que desee cambiar, elija los puntos suspensivos (**…**) y, a continuación, elija **Editar configuración**.

1. Cambiar la configuración de creación de contenedores. Si configura la función de Lambda para que se ejecute en un contenedor de Greengrass, también deberá configurar las propiedades **Límite de memoria** y **Acceso de lectura al directorio /sys**.

1. <a name="lambda-save-changes"></a>Seleccione **Guardar** y, a continuación, **Confirmar** para guardar los cambios en la función de Lambda.

Los cambios surten efecto cuando el grupo se implementa.

También puede usar [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html)y [CreateFunctionDefinitionVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinitionversion-post.html)en la *referencia de la AWS IoT Greengrass API*. Si va a cambiar la configuración de creación de contenedores, asegúrese de actualizar los demás parámetros también. Por ejemplo, si va a cambiar entre la ejecución de una función de Lambda en un contenedor de Greengrass a la ejecución sin creación de contenedores, asegúrese de borrar el parámetro `MemorySize`.

### Determinación de los modos de aislamiento admitidos en el dispositivo de Greengrass
<a name="dependency-checker-tests-isolation"></a>

Puede usar el comprobador de AWS IoT Greengrass dependencias para determinar qué modos de aislamiento (contenedor container/no Greengrass) admite su dispositivo Greengrass.

**Para ejecutar el comprobador de dependencias AWS IoT Greengrass**

1. [Descargue y ejecute el comprobador AWS IoT Greengrass de dependencias desde el GitHub repositorio.](https://github.com/aws-samples/aws-greengrass-samples)

   ```
   wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.11.x.zip
   unzip greengrass-dependency-checker-GGCv1.11.x.zip
   cd greengrass-dependency-checker-GGCv1.11.x
   sudo modprobe configs
   sudo ./check_ggc_dependencies | more
   ```

1. Si aparece `more`, pulse la tecla Spacebar para mostrar otra página de texto.

Para obtener más información acerca del comando **modprobe**, ejecute **man modprobe** en el terminal. 

## Configuración de la identidad de acceso predeterminada para las funciones de Lambda de un grupo
<a name="lambda-access-identity-groupsettings"></a>

Esta función está disponible para AWS IoT Greengrass Core v1.8 y versiones posteriores.

Para tener un mayor control sobre el acceso a los recursos del dispositivo, puede configurar la identidad de acceso predeterminada que se utiliza para ejecutar funciones de Lambda en el grupo. Esta configuración determina los permisos predeterminados que se han asignado a sus funciones de Lambda cuando se ejecutan en el dispositivo central. Para invalidar la configuración de las distintas funciones del grupo, puede utilizar la propiedad **Run as (Ejecutar como)** de la función. Para obtener más información, consulte [Ejecutar como](#lambda-access-identity).

Esta configuración a nivel de grupo también se usa para ejecutar el software Core subyacente AWS IoT Greengrass . Se compone de funciones de Lambda del sistema que administran operaciones, como el redireccionamiento de mensajes, la sincronización de instantáneas locales y la detección automática de direcciones IP.

La identidad de acceso predeterminada se puede configurar para que se ejecute como las cuentas del AWS IoT Greengrass sistema estándar (ggc\$1user y ggc\$1group) o utilice los permisos de otro usuario o grupo. Le recomendamos que configure su hardware de Greengrass con los límites de recursos, permisos de archivos y cuotas de disco adecuados para los usuarios y grupos cuyos permisos se utilizan para la ejecución de funciones de Lambda del sistema o definidas por el usuario.

**Para modificar la identidad de acceso predeterminada del grupo AWS IoT Greengrass**

1. <a name="console-gg-groups"></a>En el panel de navegación de la AWS IoT consola, en **Administrar**, expanda **los dispositivos Greengrass** y, a continuación, elija **Grupos (V1)**.

1. <a name="group-choose-group"></a>Elija el grupo cuya configuración desea cambiar.

1. **Seleccione la pestaña **Funciones de Lambda** y, en la sección **Entorno de tiempo de ejecución de las funciones de Lambda predeterminado**, seleccione Editar**.

1. En la página de **Editar el entorno del tiempo de ejecución predeterminado de la función de Lambda** para **Usuario y grupo del sistema predeterminados**, elija **Otro ID de usuario o grupo**.

   Al elegir esta opción, se muestran los campos **System user D (number)** y **System group ID (number)**.

1. Escriba un ID de usuario, un ID de grupo o ambos. Si deja un campo en blanco, se utiliza la cuenta del sistema de Greengrass correspondiente (ggc\$1user o ggc\$1group).
   + En **ID del usuario del sistema (número)**, especifique el ID del usuario que tiene los permisos que desea utilizar de forma predeterminada para ejecutar funciones de Lambda en el grupo. Puede utilizar el comando **getent passwd** en el dispositivo de AWS IoT Greengrass para buscar el ID de usuario.
   + En **ID del grupo del sistema (número**), especifique el ID del grupo que tiene los permisos que desea utilizar de forma predeterminada para ejecutar funciones de Lambda en el grupo. Puede utilizar el comando **getent group** en el dispositivo de AWS IoT Greengrass para buscar el ID de grupo.
**importante**  
La ejecución como usuario raíz aumenta los riesgos en los datos y el dispositivo. No realice ejecuciones como usuario raíz (UID/GID=0) a menos que su caso de negocio lo requiera. Para obtener más información, consulte [Ejecución de una función de Lambda como raíz](#lambda-running-as-root).

Los cambios surten efecto cuando el grupo se implementa.

## Configuración de la creación de contenedores predeterminada para funciones de Lambda de un grupo
<a name="lambda-containerization-groupsettings"></a>

Esta función está disponible para AWS IoT Greengrass Core v1.7 y versiones posteriores.

La configuración de creación de contenedores de un grupo de Greengrass determina la creación de contenedores predeterminada para las funciones de Lambda del grupo.
+ En el modo **contenedor de Greengrass**, las funciones Lambda se ejecutan de forma predeterminada en un entorno de ejecución aislado dentro del AWS IoT Greengrass contenedor.
+ En el modo **Sin contenedor**, las funciones de Lambda se ejecutan como procesos normales de Linux de forma predeterminada.

Puede modificar la configuración del grupo para especificar la creación de contenedores predeterminada para las funciones de Lambda del grupo. Puede pasar por alto esta configuración para una o varias funciones de Lambda en el grupo si desea que las funciones de Lambda se ejecuten con una creación de contenedores distinta a la del grupo predeterminado. Antes de cambiar la configuración de la creación de contenedores, consulte [Consideraciones a la hora de elegir la creación de contenedores de la función de Lambda.](#lambda-containerization-considerations).

**importante**  
Si desea cambiar la creación de contenedores predeterminada del grupo, pero tiene una o varias funciones que utilizan una creación de contenedores distinta, cambie la configuración de las funciones de Lambda antes de cambiar la configuración del grupo. Si cambia primero la configuración de creación de contenedores del grupo, se descartan los valores de la configuración **Memory limit (Límite de memoria)** y **Read access to /sys directory (Acceso de lectura al directorio /sys)**.

**Para modificar la configuración de contenedorización de su grupo AWS IoT Greengrass**

1. <a name="console-gg-groups"></a>En el panel de navegación de la AWS IoT consola, en **Administrar**, expanda **los dispositivos Greengrass** y, a continuación, elija **Grupos (V1)**.

1. <a name="group-choose-group"></a>Elija el grupo cuya configuración desea cambiar.

1. Elija la pestaña de **Funciones de Lambda**.

1. En **Entorno de tiempo de ejecución de funciones de Lambda predeterminado**, elija **Editar**.

1. En la página **Tiempo de ejecución predeterminado de funciones de Lambda**, en **Creación de contenedores de la función de Lambda predeterminada**, cambie la configuración de la organización de contenedores.

1. Seleccione **Save**.

Los cambios surten efecto cuando el grupo se implementa.

## Flujos de comunicación para las funciones de Lambda de Greengrass
<a name="lambda-communication"></a>

Las funciones Lambda de Greengrass admiten varios métodos de comunicación con otros miembros del AWS IoT Greengrass grupo, servicios locales y servicios en la nube (incluidos los servicios). AWS 

### Comunicación con mensajes MQTT
<a name="lambda-messages"></a>

Las funciones de Lambda pueden enviar y recibir mensajes MQTT utilizando un patrón publish-subscribe (publicar-suscribir) que se controla a través de las suscripciones.

Este flujo de comunicación permite que las funciones de Lambda intercambien mensajes con las siguientes entidades:
+ Dispositivos cliente en el grupo.
+ Conectores en el grupo.
+ Otras funciones de Lambda del grupo.
+ AWS IoT.
+ Servicio de sombra del dispositivo local.

Las suscripciones especifican un origen del mensaje, un destino del mensaje y un tema (o asunto), que se utilizan para direccionar los mensajes desde el origen hasta el destino. Los mensajes que se publican en una función de Lambda se transfieren al controlador registrado de la función. Las suscripciones permiten más seguridad y proporcionan interacciones predecibles. Para obtener más información, consulte [Suscripciones administradas en el flujo de trabajo de mensajería de MQTT](gg-sec.md#gg-msg-workflow).

**nota**  
Cuando el dispositivo central está sin conexión, las funciones de Lambda de Greengrass pueden intercambiar mensajes con otros dispositivos cliente, conectores, otras funciones y sombras locales, pero los mensajes dirigidos a AWS IoT se ponen en cola. Para obtener más información, consulte [Cola de mensajes MQTT para objetivos en la nube](gg-core.md#mqtt-message-queue).

### Otros flujos de comunicación
<a name="lambda-other-communication"></a>
+ Para interactuar con los modelos de machine learning, los recursos de volumen y dispositivos locales en un dispositivo central, las funciones de Lambda de Greengrass utilizan las interfaces del sistema operativo específico de la plataforma. Por ejemplo, puede utilizar el método de `open` en el módulo [os](https://docs.python.org/2/library/os.html) en las funciones de Python 2.7. Para permitir que una función acceda a un recurso, la función debe estar *asociada* con el recurso y tener el permiso `read-only` o `read-write`. Para obtener más información, incluida la disponibilidad de la versión AWS IoT Greengrass principal, consulte [Acceder a recursos locales con conectores y funciones de Lambda](access-local-resources.md) y. [Acceso a recursos de machine learning desde el código de la función de Lambda](access-ml-resources.md#access-resource-function-code)
**nota**  
Si ejecuta la función de Lambda sin creación de contenedores, no puede utilizar los recursos de volumen y dispositivos locales asociados, y debe acceder a dichos recursos directamente.
+ Las funciones de Lambda pueden usar el `Lambda` cliente del SDK de AWS IoT Greengrass Core para invocar otras funciones de Lambda del grupo Greengrass.
+ Las funciones Lambda pueden usar el AWS SDK para comunicarse con AWS los servicios. Para obtener más información, consulte [SDK de AWS](#aws-sdk).
+ Las funciones de Lambda pueden usar interfaces de terceros para comunicarse con servicios en la nube externos, de modo similar a las funciones de Lambda basadas en la nube.

**nota**  
Las funciones Lambda de Greengrass no se pueden comunicar con AWS ni con otros servicios en la nube cuando el núcleo está fuera de línea.

## Recuperación del tema (o asunto) de MQTT de entrada
<a name="lambda-get-mqtt-topic"></a>

AWS IoT Greengrass usa suscripciones para controlar el intercambio de mensajes MQTT entre dispositivos cliente, funciones Lambda y conectores de un grupo y AWS IoT con el servicio oculto local. Las suscripciones definen el origen del mensaje, el destino del mensaje y el tema de MQTT utilizados para dirigir los mensajes. Cuando el destino es una función de Lambda, el controlador de la función se invoca cuando el origen publica un mensaje. Para obtener más información, consulte [Comunicación con mensajes MQTT](#lambda-messages).

En el siguiente ejemplo, se muestra cómo una función de Lambda puede obtener el tema de entrada desde el `context` pasado al controlador. Para ello, obtiene acceso a la clave `subject` desde la jerarquía del contexto (`context.client_context.custom['subject']`). El ejemplo analiza también el mensaje JSON de entrada y, a continuación, publica el tema analizado y el mensaje.

**nota**  
En la AWS IoT Greengrass API, el tema de una [suscripción](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-subscription.html) se representa mediante la `subject` propiedad.

```
import greengrasssdk
import logging

client = greengrasssdk.client('iot-data')

OUTPUT_TOPIC = 'test/topic_results'

def get_input_topic(context):
    try:
        topic = context.client_context.custom['subject']
    except Exception as e:
        logging.error('Topic could not be parsed. ' + repr(e))
    return topic
    
def get_input_message(event):
    try:
        message = event['test-key']
    except Exception as e:
        logging.error('Message could not be parsed. ' + repr(e))
    return message

def function_handler(event, context):
    try:
        input_topic = get_input_topic(context)
        input_message = get_input_message(event)
        response = 'Invoked on topic "%s" with message "%s"' % (input_topic, input_message)
        logging.info(response)
    except Exception as e:
        logging.error(e)

    client.publish(topic=OUTPUT_TOPIC, payload=response)

    return
```

Para probar la función, añádala a su grupo utilizando las opciones de configuración predeterminadas. A continuación, añada las siguientes suscripciones e implemente el grupo. Para obtener instrucciones, consulte [Módulo 3 (parte 1): Funciones Lambda en AWS IoT Greengrass](module3-I.md).


****  

| origen | Destino | Filtro de temas | 
| --- | --- | --- | 
| IoT Cloud (Nube de IoT) | Esta función | test/input\$1message | 
| Esta función | IoT Cloud (Nube de IoT) | test/topic\$1results | 

Una vez completada la implementación, invoque la función.

1. En la AWS IoT consola, abra la página del **cliente de pruebas de MQTT**.

1. Para suscribirse al tema `test/topic_results`, seleccione la pestaña **Suscribirse a un tema**.

1. Publique un mensaje en el tema `test/input_message` seleccionando la pestaña **Publicar en un tema**. En este ejemplo, debe incluir la propiedad `test-key` en el mensaje JSON.

   ```
   {
     "test-key": "Some string value"
   }
   ```

   Si todo es correcto, la función publica el tema de entrada y la cadena del mensaje en el tema `test/topic_results`.

## Configuración del ciclo de vida de las funciones de Lambda de Greengrass
<a name="lambda-lifecycle"></a>

El ciclo de vida de la función de Lambda de Greengrass determina cuándo se inicia una función y cómo crea y utiliza contenedores. El ciclo de vida también determina cómo se conservan las variables y la lógica de procesamiento previo que está fuera del controlador de la función.

AWS IoT Greengrass admite los ciclos de vida bajo demanda (predeterminado) o de larga duración:
+ Las funciones **bajo demanda** se inician cuando se invocan y se detienen cuando no quedan tareas que ejecutar. Una invocación de la función crea un contenedor independiente (o entorno de pruebas) para procesar invocaciones, a menos que haya un contenedor disponible que se pueda reutilizar. Los datos que se envíe a la función pueden extraerse de cualquiera de los contenedores.

  Es posible ejecutar en paralelo varias invocaciones de una función bajo demanda.

  No se conserva ninguna variable ni lógica de procesamiento previo que se defina fuera del controlador de la función cuando se crean nuevos contenedores.
+ Las funciones de **larga duración** (o *fijas) se* inician automáticamente cuando se inicia el AWS IoT Greengrass núcleo y se ejecutan en un único contenedor. Todos los datos que se envían a la función los extrae el mismo contenedor.

  Hay varias invocaciones en la cola hasta que se ejecuten las invocaciones anteriores.

  Las variables y lógica de procesamiento previo que se definen fuera del controlador de la función se conservan para cada invocación del controlador.

  Las funciones de Lambda de larga duración resultan útiles cuando necesita empezar a trabajar sin ninguna entrada inicial. Por ejemplo, una función de larga duración puede cargar e iniciar el procesamiento de un modelo de ML para que esté listo para cuando la función empiece a recibir los datos del dispositivo.
**nota**  
Recuerde que las funciones de larga duración tienen tiempos de espera que están asociados con invocaciones de su controlador. Si desea ejecutar de forma indefinida el código en ejecución, debe iniciarlo fuera del controlador. Asegúrese de que no haya código de bloqueo fuera del controlador que pudiera impedir la inicialización de la función.  
 Estas funciones se ejecutan a menos que el núcleo se detenga (por ejemplo, al reiniciarse una implementación de grupo o un dispositivo) o que la función adopte un estado de error (por ejemplo, un error de tiempo de espera del controlador, una excepción no detectada o si se superan los límites de memoria).

Para obtener más información sobre la reutilización de contenedores, consulta Cómo [entender la reutilización de contenedores AWS Lambda en](https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/) el blog de AWS informática.

## Ejecutables de Lambda
<a name="lambda-executables"></a>

Esta función está disponible para AWS IoT Greengrass Core v1.6 y versiones posteriores.

Un ejecutable de Lambda es un tipo de función de Lambda de Greengrass que puede utilizar para ejecutar código binario en el entorno del núcleo. Le permite ejecutar la funcionalidad específica del dispositivo de manera nativa y se beneficia de una menor huella de código compilado. Los ejecutables de Lambda pueden ser invocados por eventos, pueden invocar otras funciones y pueden acceder a recursos locales.

Los ejecutables de Lambda solo admiten el tipo de cifrado binario (no JSON) pero, por lo demás, puede administrarlos en su grupo de Greengrass e implementarlos como otras funciones de Lambda de Greengrass. Sin embargo, el proceso de creación de ejecutables de Lambda es diferente de la creación de funciones de Lambda de Python, Java y Node.js:
+ No puede usar la AWS Lambda consola para crear (o administrar) un ejecutable de Lambda. Solo puede crear un ejecutable de Lambda mediante la AWS Lambda API.
+ El código de la función se carga AWS Lambda como un ejecutable compilado que incluye el [AWS IoT Greengrass Core SDK para C.](https://github.com/aws/aws-greengrass-core-sdk-c)
+ Especificará el nombre del ejecutable como el controlador de la función.

Los ejecutables de Lambda deben implementar determinadas llamadas y patrones de programación en su código de la función. Por ejemplo, el método `main` debe:
+ Llamar a `gg_global_init` para inicializar variables globales internas de Greengrass. Se debe llamar a esta función antes de crear cualquier subproceso y antes de llamar a cualquier otra función del SDK AWS IoT Greengrass principal.
+ Llame a `gg_runtime_start` para registrar el controlador de la función con el tiempo de ejecución de Lambda de Greengrass. Esta función debe llamarse durante la inicialización. Al llamar a esta función el tiempo de ejecución utiliza el subproceso actual. El parámetro `GG_RT_OPT_ASYNC` opcional indica a esta función que no bloquee, sino que cree un nuevo subproceso para el tiempo de ejecución. Esta función utiliza un controlador `SIGTERM`.

El siguiente fragmento es el `main` método del ejemplo de código [simple\$1handler.c](https://github.com/aws/aws-greengrass-core-sdk-c/blob/master/aws-greengrass-core-sdk-c-example/simple_handler.c) en adelante. GitHub

```
int main() {
    gg_error err = GGE_SUCCESS;

    err = gg_global_init(0);
    if(err) {
        gg_log(GG_LOG_ERROR, "gg_global_init failed %d", err);
        goto cleanup;
    }

    gg_runtime_start(handler, 0);

cleanup:
    return -1;
}
```

Para obtener más información acerca de los requisitos exigidos, las restricciones y otros detalles de implementación, consulte [SDK de AWS IoT Greengrass Core para C](https://github.com/aws/aws-greengrass-core-sdk-c).

### Crear un ejecutable de Lambda
<a name="create-lambda-executable"></a>

Tras compilar el código junto con el SDK, utilice la AWS Lambda API para crear una función Lambda y cargar el ejecutable compilado.

**nota**  
La función deberá elaborarse con un compilador C89 compatible.

En el siguiente ejemplo se utiliza el comando de CLI [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) para crear un ejecutable de Lambda. El comando especifica:
+ El nombre del ejecutable para el controlador. Debe ser el nombre exacto del ejecutable compilado.
+ La ruta del archivo `.zip` que contiene el ejecutable compilado.
+ `arn:aws:greengrass:::runtime/function/executable` para el tiempo de ejecución. Este es el tiempo de ejecución para todos los ejecutables de Lambda.

**nota**  
Para `role` puede especificar el ARN de cualquier rol de ejecución de Lambda. AWS IoT Greengrass no utiliza este rol, pero el parámetro es necesario para crear la función. Para obtener más información sobre los roles de ejecución de Lambda, consulte [modelo de permisos de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html) en la *Guía para desarrolladores de AWS Lambda *.

```
aws lambda create-function \
--region aws-region \
--function-name function-name \
--handler executable-name \
--role role-arn \
--zip-file fileb://file-name.zip \
--runtime arn:aws:greengrass:::runtime/function/executable
```

A continuación, utilice la AWS Lambda API para publicar una versión y crear un alias.
+ Utilice [publish-version](https://docs.aws.amazon.com/cli/latest/reference/lambda/publish-version.html) para publicar una versión de la función.

  ```
  aws lambda publish-version \
  --function-name function-name \
  --region aws-region
  ```
+ Utilice [create-alias](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-alias.html) para crear un alias que apunte a la versión que acaba de publicar. Recomendamos que el alias haga referencia a funciones de Lambda cuando las añade a un grupo de Greengrass.

  ```
  aws lambda create-alias \
  --function-name function-name \
  --name alias-name \
  --function-version version-number \
  --region aws-region
  ```

**nota**  
La AWS Lambda consola no muestra los ejecutables de Lambda. Para actualizar el código de la función, debe usar la AWS Lambda API.

A continuación, añada el ejecutable de Lambda a un grupo de Greengrass, configúrelo para aceptar los datos de entrada binarios en su configuración específica del grupo e implemente el grupo. Puede hacerlo en la AWS IoT Greengrass consola o mediante la AWS IoT Greengrass API.

# Ejecución AWS IoT Greengrass en un contenedor Docker
<a name="run-gg-in-docker-container"></a>

AWS IoT Greengrass [se puede configurar para que se ejecute en un contenedor Docker.](https://www.docker.com/)

Puedes descargar un Dockerfile a través de [Amazon CloudFront](what-is-gg.md#gg-docker-download) que tenga el software AWS IoT Greengrass principal y las dependencias instaladas. Para modificar la imagen de Docker de manera que se ejecute en arquitecturas de plataforma distintas o para reducir el tamaño de la imagen de Docker, consulte el archivo `README` del paquete de descarga de Docker.

Para ayudarte a empezar a experimentar AWS IoT Greengrass, AWS también proporciona imágenes de Docker prediseñadas que tienen el software principal y las AWS IoT Greengrass dependencias instaladas. Puede descargar imágenes de [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) o [Amazon Elastic Container Registry](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) (Amazon ECR). Estas imágenes precompiladas utilizan imágenes base de Amazon Linux 2 (x86\$164) y Alpine Linux (x86\$164, ARMv7L o). AArch64

**importante**  
<a name="docker-images-end-of-maintenance"></a>El 30 de junio de 2022, AWS IoT Greengrass finalizó el mantenimiento de las imágenes de Docker de AWS IoT Greengrass Core software v1.x publicadas en Amazon Elastic Container Registry (Amazon ECR) y Docker Hub. Puede seguir descargando estas imágenes de Docker desde Amazon ECR y Docker Hub hasta el 30 de junio de 2023, es decir, un año después de que finalice el mantenimiento. Sin embargo, las imágenes de Docker de la versión 1.x del software AWS IoT Greengrass principal ya no reciben parches de seguridad ni correcciones de errores una vez finalizado el mantenimiento el 30 de junio de 2022. Si ejecuta una carga de trabajo de producción que depende de estas imágenes de Docker, le recomendamos que cree sus propias imágenes de Docker con los archivos Docker que se proporcionan. AWS IoT Greengrass  Para obtener más información, consulte [AWS IoT Greengrass Software Docker](what-is-gg.md#gg-docker-download).

En este tema se describe cómo descargar la imagen de AWS IoT Greengrass Docker de Amazon ECR y ejecutarla en una plataforma Windows, macOS o Linux (x86\$164). El tema contiene los siguientes pasos:

1. [Obtenga la imagen del AWS IoT Greengrass contenedor de Amazon ECR](#docker-pull-image)

1. [Crear y configurar el grupo y el núcleo de Greengrass](#docker-config-gg)

1. [Ejecute AWS IoT Greengrass localmente](#docker-run-gg)

1. [Configurar la creación de contenedores "Sin contenedor" para el grupo](#docker-no-container)

1. [Implementación de funciones de Lambda en el contenedor de Docker](#docker-add-lambdas)

1. [(Opcional) Implementar los dispositivos de cliente que interactúan con Greengrass en el contenedor de Docker](#docker-add-devices)

Las siguientes funciones no se admiten cuando se ejecuta AWS IoT Greengrass en un contenedor de Docker:<a name="docker-image-unsupported-features"></a>
+ [Conectores](connectors.md) que se ejecutan en el modo **Contenedor de Greengrass**. Para ejecutar un conector en un contenedor de Docker, el conector debe ejecutarse en modo **Sin contenedor**. Para buscar conectores compatibles con el modo **Sin contenedor**, consulte [conectores de Greengrass proporcionados por AWS](connectors-list.md). Algunos de estos conectores tienen un parámetro de modo de aislamiento que debe establecer en **Sin contenedor**.
+ [Dispositivos locales y recursos de volumen](access-local-resources.md). Las funciones de Lambda definidas por el usuario que se ejecutan en el contenedor de Docker deben obtener acceso directamente a los dispositivos y volúmenes del dispositivo principal.

Estas funciones no se admiten cuando el entorno de ejecución de Lambda para el grupo Greengrass está establecido en [Sin contenedor, que es obligatorio para ejecutarse AWS IoT Greengrass en un contenedor](lambda-group-config.md#no-container-mode) de Docker.

## Requisitos previos
<a name="docker-image-prerequisites"></a>

Antes de empezar este tutorial, debe hacer lo siguiente.<a name="docker-image-prereq-list"></a>
+ Debe instalar el software y las versiones siguientes en el equipo host en función de la versión AWS Command Line Interface (AWS CLI) que elija.

------
#### [ AWS CLI version 2 ]
  + [Docker](https://docs.docker.com/install/), versión 18.09 o superior. Es posible que las versiones anteriores también funcionen, pero recomendamos la 18.09 o una versión posterior.
  + AWS CLI versión 2.0.0 o posterior.
    + Para instalar la AWS CLI versión 2, consulte [Instalación de la AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).
    + Para configurar el AWS CLI, consulte [Configuración del AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html).
**nota**  
Para actualizar a una AWS CLI versión 2 posterior en un equipo con Windows, debe repetir el proceso de [instalación de MSI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-windows.html).

------
#### [ AWS CLI version 1 ]
  + [Docker](https://docs.docker.com/install/), versión 18.09 o superior. Es posible que las versiones anteriores también funcionen, pero recomendamos la 18.09 o una versión posterior.
  + [Python](https://www.python.org/downloads/), versión 3.6 o superior.
  + [pip](https://pip.pypa.io/en/stable/installing), versión 18.1 o posterior.
  + AWS CLI versión 1.17.10 o posterior
    + Para instalar la AWS CLI versión 1, consulte [Instalación de la AWS CLI versión](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html) 1.
    + Para configurar el AWS CLI, consulte [Configuración del AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html).
    + Para actualizar a la última versión de la AWS CLI versión 1, ejecute el siguiente comando.

      ```
      pip install awscli --upgrade --user
      ```
**nota**  
Si utiliza la [instalación MSI](https://docs.aws.amazon.com/cli/latest/userguide/install-windows.html#msi-on-windows) de la AWS CLI versión 1 en Windows, tenga en cuenta lo siguiente:  
Si la instalación de la AWS CLI versión 1 no puede instalar botocore, intente usar la instalación de [Python y pip](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html#awscli-install-windows-pip).
Para actualizar a una AWS CLI versión 1 posterior, debe repetir el proceso de instalación de MSI.

------
+ Para acceder a los recursos de Amazon Elastic Container Registry (Amazon ECR), debe conceder el siguiente permiso. 
  + Amazon ECR exige que los usuarios concedan el `ecr:GetAuthorizationToken` permiso mediante una política AWS Identity and Access Management (IAM) antes de poder autenticarse en un registro y enviar o extraer imágenes de un repositorio de Amazon ECR. Para obtener más información, consulte los [ejemplos de políticas de repositorios de Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) y el [Acceso a un repositorio de Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-access-one-bucket) en la *Guía del usuario de Amazon Elastic Container Registry*.

## Paso 1: Obtenga la imagen del AWS IoT Greengrass contenedor de Amazon ECR
<a name="docker-pull-image"></a>

AWS proporciona imágenes de Docker que tienen instalado el software AWS IoT Greengrass principal.

**aviso**  <a name="docker-images-python-2.7-removal"></a>
A partir de la versión 1.11.6 del software AWS IoT Greengrass Core, las imágenes de Docker de Greengrass ya no incluyen Python 2.7, porque Python 2.7 llegó end-of-life en 2020 y ya no recibe actualizaciones de seguridad. Si decide actualizar a estas imágenes de Docker, le recomendamos que compruebe que sus aplicaciones funcionan con las nuevas imágenes de Docker antes de implementar las actualizaciones en los dispositivos de producción. Si necesita Python 2.7 para su aplicación que usa una imagen de Docker de Greengrass, puede modificar el Dockerfile de Greengrass para incluir Python 2.7 en su aplicación.

Para ver los pasos que muestran cómo extraer la imagen de `latest` de Amazon ECR, elija su sistema operativo:

### Extraer la imagen del contenedor (Linux)
<a name="docker-pull-image-linux"></a>

Ejecute los siguientes comandos en el terminal del equipo.

1. <a name="docker-get-login"></a>Inicie sesión en el AWS IoT Greengrass registro de Amazon ECR.

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   Si la acción se realiza correctamente, se muestra el texto `Login Succeeded` (Inicio de sesión correcto).

1. <a name="docker-docker-pull"></a>Recupere la imagen del AWS IoT Greengrass contenedor.

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**nota**  
La `latest` imagen contiene la última versión estable del software AWS IoT Greengrass Core instalado en una imagen base de Amazon Linux 2. También puede extraer otras imágenes del repositorio. Para encontrar todas las imágenes disponibles, consulte la página **Tags (Etiquetas)** en [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) o utilice el comando **aws ecr list-images**. Por ejemplo:  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

1. Habilite la protección de enlaces permanentes y simbólicos. Si está experimentando con la ejecución AWS IoT Greengrass en un contenedor, puede habilitar la configuración únicamente para el arranque actual.
**nota**  
Es posible que tenga que utilizar **sudo** para ejecutar estos comandos.
   + Para habilitar la configuración solo para el inicio actual:

     ```
     echo 1 > /proc/sys/fs/protected_hardlinks
     echo 1 > /proc/sys/fs/protected_symlinks
     ```
   + Para habilitar la configuración para conservarla tras los reinicios:

     ```
     echo '# AWS IoT Greengrass' >> /etc/sysctl.conf 
     echo 'fs.protected_hardlinks = 1' >> /etc/sysctl.conf 
     echo 'fs.protected_symlinks = 1' >> /etc/sysctl.conf
     
     sysctl -p
     ```

1. <a name="docker-linux-enable-ipv4"></a>Habilite el reenvío de IPv4 red, que es necesario para que el despliegue AWS IoT Greengrass en la nube y las comunicaciones MQTT funcionen en Linux. En el archivo `/etc/sysctl.conf`, defina `net.ipv4.ip_forward` en 1 y, a continuación, vuelva a cargar `sysctls`.

   ```
   sudo nano /etc/sysctl.conf
   # set this net.ipv4.ip_forward = 1
   sudo sysctl -p
   ```
**nota**  
Puede utilizar el editor de su elección en lugar de nano.

### Extraer la imagen del contenedor (macOS)
<a name="docker-pull-image-mac"></a>

Ejecute los siguientes comandos en el terminal del equipo.

1. <a name="docker-get-login"></a>Inicie sesión en el AWS IoT Greengrass registro de Amazon ECR.

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   Si la acción se realiza correctamente, se muestra el texto `Login Succeeded` (Inicio de sesión correcto).

1. <a name="docker-docker-pull"></a>Recupere la imagen del AWS IoT Greengrass contenedor.

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**nota**  
La `latest` imagen contiene la última versión estable del software AWS IoT Greengrass Core instalado en una imagen base de Amazon Linux 2. También puede extraer otras imágenes del repositorio. Para encontrar todas las imágenes disponibles, consulte la página **Tags (Etiquetas)** en [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) o utilice el comando **aws ecr list-images**. Por ejemplo:  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

### Extraer la imagen del contenedor (Windows)
<a name="docker-pull-image-windows"></a>

En el símbolo del sistema, ejecute los siguientes comandos. Para poder utilizar comandos de Docker en Windows, se debe estar ejecutando Docker Desktop.

1. <a name="docker-get-login"></a>Inicie sesión en el AWS IoT Greengrass registro de Amazon ECR.

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   Si la acción se realiza correctamente, se muestra el texto `Login Succeeded` (Inicio de sesión correcto).

1. <a name="docker-docker-pull"></a>Recupere la imagen del AWS IoT Greengrass contenedor.

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**nota**  
La `latest` imagen contiene la última versión estable del software AWS IoT Greengrass Core instalado en una imagen base de Amazon Linux 2. También puede extraer otras imágenes del repositorio. Para encontrar todas las imágenes disponibles, consulte la página **Tags (Etiquetas)** en [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) o utilice el comando **aws ecr list-images**. Por ejemplo:  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

## Paso 2: Crear y configurar el grupo y el núcleo de Greengrass
<a name="docker-config-gg"></a>

La imagen de Docker tiene instalado el software AWS IoT Greengrass Core, pero debe crear un grupo y un núcleo de Greengrass. Esto incluye la descarga de certificados y el archivo de configuración del núcleo.
+ Siga los pasos de [Módulo 2: Instalación del software AWS IoT Greengrass principal](module2.md). Omita los pasos en los que descarga y ejecuta el software AWS IoT Greengrass principal. El software y sus dependencias de tiempo de ejecución ya están configuradas en la imagen de Docker.

## Paso 3: Ejecute AWS IoT Greengrass localmente
<a name="docker-run-gg"></a>

Una vez configurado su grupo, ya está listo para configurar e iniciar el núcleo. Para ver los pasos que muestran cómo hacerlo, elija su sistema operativo:

### Ejecutar Greengrass localmente (Linux)
<a name="docker-run-gg-linux"></a>

Ejecute los siguientes comandos en el terminal del equipo.

1. <a name="docker-create-certs-folder"></a>Cree una carpeta para los recursos de seguridad del dispositivo y mueva el certificado y las claves a esa carpeta. Use los siguientes comandos. *path-to-security-files*Sustitúyalo por la ruta a los recursos de seguridad y *certificateId* sustitúyalo por el identificador del certificado en los nombres de los archivos.

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>Cree una carpeta para la configuración del dispositivo y mueva el archivo de configuración AWS IoT Greengrass principal a esa carpeta. Use los siguientes comandos. *path-to-config-file*Sustitúyalo por la ruta al archivo de configuración.

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>Inicie AWS IoT Greengrass y monte los certificados y el archivo de configuración en el contenedor de Docker.

   Reemplace `/tmp` por la ruta donde descomprimió los certificados y el archivo de configuración.

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   El resultado debe tener el aspecto del siguiente ejemplo:

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### Ejecutar Greengrass localmente (macOS)
<a name="docker-run-gg-mac"></a>

Ejecute los siguientes comandos en el terminal del equipo.

1. <a name="docker-create-certs-folder"></a>Cree una carpeta para los recursos de seguridad del dispositivo y mueva el certificado y las claves a esa carpeta. Use los siguientes comandos. *path-to-security-files*Sustitúyalos por la ruta a los recursos de seguridad y sustitúyalos por *certificateId* el identificador del certificado en los nombres de los archivos.

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>Cree una carpeta para la configuración del dispositivo y mueva el archivo de configuración AWS IoT Greengrass principal a esa carpeta. Use los siguientes comandos. *path-to-config-file*Sustitúyalo por la ruta al archivo de configuración.

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>Inicie AWS IoT Greengrass y monte los certificados y el archivo de configuración en el contenedor de Docker.

   Reemplace `/tmp` por la ruta donde descomprimió los certificados y el archivo de configuración.

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   El resultado debe tener el aspecto del siguiente ejemplo:

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### Ejecutar Greengrass localmente (Windows)
<a name="docker-run-gg-windows"></a>

1. Cree una carpeta para los recursos de seguridad del dispositivo y mueva el certificado y las claves a esa carpeta. En el símbolo del sistema, ejecute los siguientes comandos. *path-to-security-files*Sustitúyalos por la ruta a los recursos de seguridad y sustitúyalos por *certificateId* el identificador del certificado en los nombres de los archivos.

   ```
   mkdir C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-certificate.pem.crt C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-public.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-private.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\AmazonRootCA1.pem C:\Users\%USERNAME%\Downloads\certs
   ```

1. Cree una carpeta para la configuración del dispositivo y mueva el archivo de configuración AWS IoT Greengrass principal a esa carpeta. En el símbolo del sistema, ejecute los siguientes comandos. *path-to-config-file*Sustitúyalo por la ruta al archivo de configuración.

   ```
   mkdir C:\Users\%USERNAME%\Downloads\config
   move path-to-config-file\config.json C:\Users\%USERNAME%\Downloads\config
   ```

1. Inicie AWS IoT Greengrass y monte los certificados y el archivo de configuración en el contenedor de Docker. En el símbolo del sistema, ejecute los siguientes comandos.

   ```
   docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   Cuando Docker le pida que comparta su unidad `C:\` con el daemon de Docker, permita que realice un montaje vinculado del directorio `C:\` dentro del contenedor de Docker. Para obtener más información, consulte [Unidades compartidas](https://docs.docker.com/docker-for-windows/#shared-drives) en la documentación de Docker. 

   El resultado debe tener el aspecto del siguiente ejemplo:

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

**nota**  
Si el contenedor no abre el intérprete de comandos y sale de inmediato, este problema se puede depurar realizando un montaje vinculado en los registros del tiempo de ejecución de Greengrass al iniciar la imagen. Para obtener más información, consulte [Para conservar los registros del tiempo de ejecución de Greengrass fuera del contenedor Docker](#debugging-docker-persist-logs).

## Paso 4: Configurar la creación de contenedores "Sin contenedor" para el grupo de Greengrass
<a name="docker-no-container"></a>

Cuando se ejecuta AWS IoT Greengrass en un contenedor de Docker, todas las funciones de Lambda deben ejecutarse sin contenedorización. En este paso, se establece la creación de contenedores predeterminada para el grupo en **No container** (Sin contenedor). Debe hacerlo antes de implementar el grupo por primera vez.

1. <a name="console-gg-groups"></a>En el panel de navegación de la AWS IoT consola, en **Administrar**, expanda **los dispositivos Greengrass** y, a continuación, elija **Grupos (V1)**.

1. <a name="group-choose-group"></a>Elija el grupo cuya configuración desea cambiar.

1. Elija la pestaña de **Funciones de Lambda**.

1. En **Entorno de tiempo de ejecución de funciones de Lambda predeterminado**, elija **Editar**.

1. En el **entorno de tiempo de ejecución Editar función de Lambda por defecto**, en **Creación de contenedores de la función de Lambda por defecto**, cambie la configuración de la organización de contenedores.

1. Seleccione **Save**.

Los cambios surten efecto cuando el grupo se implementa.

Para obtener más información, consulte [Configuración de la creación de contenedores predeterminada para funciones de Lambda de un grupo](lambda-group-config.md#lambda-containerization-groupsettings).

**nota**  
De forma predeterminada, las funciones de Lambda utilizan la configuración de grupo para creación de contenedores. Si anula la configuración **Sin contenedor** de cualquier función de Lambda cuando se está ejecutando AWS IoT Greengrass en un contenedor de Docker, la implementación devuelve un error.

## Paso 5: Implementar funciones Lambda en el contenedor de Docker AWS IoT Greengrass
<a name="docker-add-lambdas"></a>

Puede implementar funciones de Lambda de larga duración en el contenedor de Docker de Greengrass.
+ Siga los pasos que se indican en [Módulo 3 (parte 1): Funciones Lambda en AWS IoT Greengrass](module3-I.md) para implementar una función de Lambda Hello World de larga duración en el contenedor.

## Paso 6: (Opcional) Implementar los dispositivos de cliente que interactúan con Greengrass en el contenedor de Docker
<a name="docker-add-devices"></a>

También puede implementar dispositivos cliente con los que interactúan AWS IoT Greengrass cuando se ejecuta en un contenedor de Docker.
+ Siga los pasos que se indican en [Módulo 4: Interacción con los dispositivos cliente de un AWS IoT Greengrass grupo](module4.md) para implementar dispositivos cliente que se conectan al núcleo y envían mensajes MQTT.

## Detener el contenedor de AWS IoT Greengrass Docker
<a name="docker-stop"></a>

Para detener el contenedor de AWS IoT Greengrass Docker, presiona Ctrl\$1C en la terminal o en la línea de comandos. Esa acción envía `SIGTERM` al proceso de daemon de Greengrass para eliminar el proceso de daemon de Greengrass y todos los procesos de Lambda que inició el proceso del daemon. El contenedor de Docker se inicializa con proceso `/dev/init` como PID 1, lo que ayuda a eliminar los procesos zombis restantes. Para obtener más información, consulte [Docker run reference](https://docs.docker.com/engine/reference/commandline/run/#options).

## Solución de problemas AWS IoT Greengrass en un contenedor de Docker
<a name="troubleshooting-docker-gg"></a>

Utilice la siguiente información para solucionar problemas relacionados con la ejecución AWS IoT Greengrass en un contenedor de Docker.

### Error: Cannot perform an interactive login from a non TTY device.
<a name="docker-troubleshootin-ecr-get-login-password"></a>

**Solución:** Este error puede producirse al ejecutar el comando `aws ecr get-login-password`. Asegúrese de haber instalado la última versión 2 o la versión 1 de AWS CLI . Le recomendamos que utilice la AWS CLI versión 2. Para obtener más información, consulte [Installing the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) en la *Guía del usuario de AWS Command Line Interface *.

### Error: Opciones desconocidas: -no-include-email.
<a name="docker-troubleshooting-cli-version"></a>

**Solución:** Este error puede producirse al ejecutar el comando `aws ecr get-login`. Asegúrese de tener instalada la última AWS CLI versión (por ejemplo, run:`pip install awscli --upgrade --user`). Si utiliza Windows e instaló la interfaz de línea de comandos (CLI) mediante el instalador MSI, debe repetir el proceso de instalación. Para obtener más información, consulte [Instalación de la AWS Command Line Interface en Microsoft Windows](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html) en la *Guía del usuario de AWS Command Line Interface *.

### Advertencia: IPv4 está deshabilitada. Networking will not work.
<a name="docker-troubleshooting-ipv4-disabled"></a>

**Solución:** es posible que reciba esta advertencia o un mensaje similar cuando lo ejecute AWS IoT Greengrass en un ordenador Linux. Habilite el reenvío de IPv4 red tal y como se describe en este [paso](#docker-linux-enable-ipv4). AWS IoT Greengrass el despliegue en la nube y las comunicaciones MQTT no funcionan cuando el IPv4 reenvío no está activado. Para obtener más información, consulte [Configure namespaced kernel parameters (sysctls) at runtime](https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime) en la documentación de Docker.

### Error: A firewall is blocking file Sharing between windows and the containers.
<a name="docker-troubleshooting-firewall"></a>

**Solución:** Puede que reciba este error o un mensaje `Firewall Detected` al ejecutar Docker en un equipo Windows. Esto también puede ocurrir si ha iniciado sesión en una red privada virtual (VPN) y su configuración de red impide el montaje de la unidad compartida. En esta situación, desactive la VPN y vuelva a ejecutar el contenedor Docker.

### Error: se produjo un error (AccessDeniedException) al llamar a la GetAuthorizationToken operación: el usuario: arn:aws:iam: ::user/ <account-id><user-name>no está autorizado a realizar la operación: ecr: on resource: \$1 GetAuthorizationToken
<a name="docker-troubleshooting-ecr-perms"></a>

Puede recibir este error al ejecutar el comando `aws ecr get-login-password` si no tiene los permisos suficientes para acceder a un repositorio de Amazon ECR. Para obtener más información, consulte los [Ejemplos de políticas de repositorios de Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) y el [Acceso a un repositorio de Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html) en la *Guía del usuario de Amazon ECR*.

Para obtener [Solución de problemas AWS IoT Greengrass](gg-troubleshooting.md) ayuda general sobre la solución de problemas, consulte. AWS IoT Greengrass 

### Depuración AWS IoT Greengrass en un contenedor de Docker
<a name="debugging-docker-gg"></a>

Para depurar problemas con un contenedor de Docker, puede conservar los registros del tiempo de ejecución de Greengrass o asociar un intérprete de comandos interactivo al contenedor de Docker.

#### Para conservar los registros del tiempo de ejecución de Greengrass fuera del contenedor Docker
<a name="debugging-docker-persist-logs"></a>

Puede ejecutar el contenedor de AWS IoT Greengrass Docker después de montar el directorio en un enlace. `/greengrass/ggc/var/log` Los registros se mantendrán incluso después de que el contenedor se cierre o se elimine.

**En Linux o macOS**  
[Detenga todos los contenedores Docker de Greengrass](#docker-stop) que se ejecuten en el host y, a continuación, ejecute el siguiente comando en un terminal. Esto realizará un montaje vinculado en el directorio `log` de Greengrass e iniciará la imagen de Docker.   
Reemplace `/tmp` por la ruta donde descomprimió los certificados y el archivo de configuración.  

```
docker run --rm --init -it --name aws-iot-greengrass \
      --entrypoint /greengrass-entrypoint.sh \
      -v /tmp/certs:/greengrass/certs \
      -v /tmp/config:/greengrass/config \
      -v /tmp/log:/greengrass/ggc/var/log \
      -p 8883:8883 \
      216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
A continuación, puede consultar los registros en el directorio `/tmp/log` del host para ver qué sucedió mientras Greengrass estaba en ejecución en el contenedor de Docker.

**En Windows**  
[Detenga todos los contenedores Docker de Greengrass](#docker-stop) que se ejecuten en el host y, a continuación, ejecute el siguiente comando en un símbolo del sistema. Esto realizará un montaje vinculado en el directorio `log` de Greengrass e iniciará la imagen de Docker.  

```
cd C:\Users\%USERNAME%\Downloads
mkdir log
docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -v c:/Users/%USERNAME%/Downloads/log:/greengrass/ggc/var/log -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
A continuación, puede consultar los registros en el directorio `C:/Users/%USERNAME%/Downloads/log` del host para ver qué sucedió mientras Greengrass estaba en ejecución en el contenedor de Docker.

#### Para asociar un intérprete de comandos interactivo a un contenedor de Docker
<a name="debugging-docker-attach-shell"></a>

Puede adjuntar un shell interactivo a un contenedor de Docker en ejecución AWS IoT Greengrass . Esto le ayudará a investigar el estado del contenedor de Docker de Greengrass.

**En Linux o macOS**  
Mientras se ejecuta el contenedor Docker de Greengrass, ejecute el siguiente comando en un terminal distinto.  

```
docker exec -it $(docker ps -a -q -f "name=aws-iot-greengrass") /bin/bash
```

**En Windows**  
Mientras se ejecuta el contenedor Docker de Greengrass, ejecute los siguientes comandos en un símbolo del sistema distinto.  

```
docker ps -a -q -f "name=aws-iot-greengrass"
```
*gg-container-id*Sustitúyalo por el `container_id` resultado del comando anterior.  

```
docker exec -it gg-container-id /bin/bash
```