Cuando uso un AWS SDK para invocar mi función de AWS Lambda, la función devuelve el error “Signature expired”.
Descripción breve
Cuando la hora del cliente y la hora del servidor no coinciden, la firma de Lambda caduca y recibes un mensaje de error similar al siguiente:
“Error: native lambda error:InvalidSignatureException: Signature expired: 20230118T161739Z is now earlier than 20230118T161739Z (20190318T162239Z - 5 min.)”
La solicitud de API debe llegar a AWS en un plazo de cinco minutos a partir de la marca de tiempo que figura en ella; de lo contrario, AWS la deniega. En algunos casos, puedes cambiar la hora del cliente para que coincida con la hora del servidor.
Resolución
Cuando usas un AWS SDK para invocar de forma sincrónica una función de Lambda, la conexión dura hasta que se devuelva la respuesta. De forma predeterminada, el SDK de Node.js permite 50 conexiones. Si se alcanza la cuota de conexión, el SDK pone la solicitud en cola localmente hasta que haya una conexión disponible. Si recibes el error “Signature expired” y las siguientes acciones son ciertas, es posible que se haya alcanzado la cuota de conexión:
- La función Lambda no está limitada.
- La hora del cliente es correcta.
- (Solo para el SDK de Node.js) Establece la opción correctClockSkew:true al crear el cliente para que la hora se corrija al invocar la función.
- Has invocado la función de Lambda a una velocidad alta o has invocado la función de Lambda a una velocidad alta y la invocación se ejecuta durante un periodo de tiempo prolongado.
El SDK firma la solicitud y, a continuación, la pone en cola. Si la cola crece demasiado y la solicitud permanece pendiente durante más de cinco minutos, la firma caduca. Como la firma ha caducado, se producirá un error en todas las solicitudes adicionales.
Si no necesitas la respuesta de la invocación, utiliza una invocación asincrónica. La invocación asincrónica permite al SDK usar la conexión solo para invocar la solicitud y no espera una respuesta.
También puedes usar Top Level Await (TLA) en la aplicación. Usa TLA si realizas llamadas a la API fuera de un controlador y recibes excepciones SignatureDoesNotMatch cuando usas el la versión 3 del AWS SDK de Node.js.
O bien, aumenta la cantidad máxima de conexiones que permite el SDK.
Nota: Al añadir conexiones, la función de Lambda invoca a una velocidad mayor y puede provocar una limitación.
Información relacionada
Supervisión y solución de problemas de funciones de Lambda
¿Cómo soluciono los errores de tiempo de espera de invocación de la función de Lambda?
¿Cómo puedo determinar si mi función de Lambda está agotando el tiempo de espera?