¿Cómo puedo hacer que mi función Lambda funcione correctamente con mi instancia de Amazon EC2 o el Programador de instancias de AWS?

Última actualización: 08/09/2021

Utilizo una instancia de Amazon Elastic Compute Cloud (Amazon EC2) o el Programador de instancias de AWS con una función de AWS Lambda, pero la función Lambda agota el tiempo de espera, no invoca o arroja errores.

Descripción breve

El Programador de instancias de AWS puede hacer que la función Lambda no funcione correctamente por los siguientes motivos:

  • Obtendrá un tiempo de espera del SDK. Para resolver este problema, siga los pasos de la sección Corregir tiempos de espera del SDK.
  • Obtendrá un tiempo de espera de función. Para resolver este problema, siga los pasos de la sección Evitar tiempos de espera de las funciones.
  • No se ha desencadenado una regla de Amazon CloudWatch Events. Para resolver este problema, complete los pasos de la sección Comprobar que se invocó la regla programada.
  • La función presenta limitación controlada. Para resolver este problema, siga los pasos de la sección Evitar la limitación controlada en las funciones.
  • Obtendrá invocaciones de Lambda duplicadas. Para resolver este problema, siga los pasos de la sección Evitar errores mediante la idempotencia.

Nota: El programador de instancias de AWS ejecuta funciones Lambda a intervalos establecidos mediante una regla de CloudWatch Events para programar la función Lambda. Esto da como resultado una invocación asíncrona de la función Lambda, lo que afecta a la forma en que se manejan los errores de las funciones. Si la función falla debido a un error al ejecutarse, el mismo evento se reintenta hasta dos veces más de forma predeterminada. A continuación, se descarta el evento. En caso de limitación, el evento se puede poner en cola hasta seis horas antes de que se descarte.

Resolución

Corregir tiempos de espera del SDK

El tiempo de espera predeterminado del SDK no se anula en versiones anteriores del Programador de instancias de AWS. Si las llamadas a la API para comenzar o detener una instancia tardan más de 60 segundos en responder en las versiones anteriores, se agotará el tiempo de espera de la solicitud.

Para resolver este problema, obtenga la versión más reciente del Programador de instancias de AWS o modifique el valor read_timeout del objeto de Config de Boto3 (en el sitio web de Boto3). Por ejemplo:

import boto3
from botocore.config import Config

client_config = Config(read_timeout=890)

ec2 = boto3.client('ec2', config=client_config)

Evitar tiempos de espera de las funciones

Si se agotó el tiempo de espera de la función Lambda, verifique si la función está esperando para comprobar que se lanzó la instancia EC2. Para obtener más información, consulte Why can't I start or launch my EC2 instance?

Las instancias pueden tardar unos minutos en alcanzar el estado RUNNING (EN EJECUCIÓN). Puede que se agote el tiempo de espera de la función si el tiempo necesario para alcanzar el estado RUNNING (EN EJECUCIÓN) es mayor que el tiempo de espera configurado para la función. Para resolver este problema, aumente el tiempo de espera de su función. Para esto, modifique el valor de Timeout (Tiempo de espera) de 300 (5 minutos) en la plantilla de AWS CloudFormation. Debe disponer de tiempo suficiente para que la instancia se lance antes de que se acabe el tiempo de espera de la función. Por ejemplo:

"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
    "Mode": "Active"
}

Nota: Las funciones de Lambda tienen un valor máximo de tiempo de espera configurable de 15 minutos.

Si su función se encuentra en una nube virtual privada, debe permitir que la función acceda a Internet para hacer llamadas a la API de Amazon EC2.

Comprobar que se invocó la regla programada

Para solucionar problemas de una función Lambda que CloudWatch Events no está invocando, consulte Why wasn't my Lambda function triggered by my CloudWatch Events rule?

Evitar la limitación controlada en las funciones

Para evitar la limitación controlada en las funciones, consulte How do I troubleshoot Lambda function throttling with "Rate exceeded" and 429 "TooManyRequestsException" errors?

En el caso de las invocaciones asíncronas, los aceleradores de Lambda en su cuenta pueden afectar a la capacidad de invocación de su función. Todas las invocaciones asíncronas se envían a una cola de eventos antes de que se invoquen. Si otra función también recibió un número elevado de invocaciones asíncronas, la cola de eventos puede retrasarse. Este retraso no significa que la función no se haya podido invocar. Este retraso significa que el evento se ha retrasado. Puede ver varias invocaciones después de que desaparezca el retraso de la cola de eventos. De forma predeterminada, los eventos de la cola de eventos asíncronos permanecen en esta cola durante un máximo de seis horas.

Evitar errores mediante la idempotencia

Para evitar errores de invocaciones duplicadas, haga que la función Lambda sea idempotente cuando esté configurada con una invocación asíncrona.

Tenga en cuenta que las invocaciones de Lambda asíncronas pueden ocurrir más de una vez debido a la consistencia final con la cola de eventos.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?