La función de AWS Lambda finaliza prematuramente sin registros de error al conectarse a la base de datos de PostgreSQL.
Tengo una función de AWS Lambda configurada como un disparador para una cola de SQS. Como parte de la lógica de mi Lambda, estoy actualizando un registro en mi base de datos PostgreSQL utilizando node-postgres.
La función es la siguiente.
export const handler = async (event: SQSEvent): Promise<void> => {
try {
const user: User = JSON.parse(event.Records[0].body) as User;
console.log('Updating user', user.id);
const client = new pg.Client({
user: dbUsername,
host: dbHost,
database: dbName,
password: dbPassword,
port: dbPort,
ssl: true,
});
await client.connect();
await client.query('UPDATE users SET last_login = $1 WHERE id = $2', [
new Date().toISOString(),
user.id,
]);
await client.end();
console.log('User updated');
} catch (error) {
console.error(error);
throw error;
}
};
Cuando esta lambda es disparada por mi SQS, parece detener la ejecución durante la interacción del cliente PG con la base de datos. En mis registros de CloudWatch puedo ver el registro “Updating user
Mi base de datos PostgreSQL está alojada utilizando RDS en una VPC y la función Lambda también existe en la misma VPC. Los valores de configuración de PG se proporcionan mediante variables de entorno y he verificado dos veces que se estén estableciendo los valores correctos.
Mi primera idea fue que una promesa no estaba esperando a resolverse, aunque si ese fuera el caso, esperaría ver el último registro de consola “User updated” en mis registros de CloudWatch.
Ejecuté el mismo código localmente y actualizó el registro de la base de datos sin problemas. ¿Hay algo que pueda estar omitiendo en AWS que pueda hacer que la lambda se detenga temprano? Además, si ocurre un error genuino en algún lugar, ¿por qué la función Lambda sale silenciosamente y no registra nada en CloudWatch?
davy.ai
Solución de problemas de una función AWS Lambda con integración Postgres
Problema
La función AWS Lambda se detiene temprano sin ningún registro de tiempo de espera o error mientras realiza una actualización de base de datos PostgreSQL utilizando
node-postgres
. La Lambda se activa a través de un SQS, y tanto la Lambda como la base de datos PostgreSQL están en la misma VPC. Los valores de configuración de PG están establecidos correctamente a través de variables de entorno, y el último mensajeconsole.log()
“Usuario actualizado” está ausente en los registros de CloudWatch.Solución
Puede haber varias razones para este comportamiento. Aquí hay algunos problemas posibles que podría investigar:
Problema 1: Fallo en el establecimiento de la conexión
Es posible que la función Lambda no pueda conectarse a la base de datos PostgreSQL, lo cual puede estar causado por diversas razones, como credenciales de base de datos incorrectas o permisos faltantes en el grupo de seguridad. Asegúrese de tener lo siguiente:
dbUsername
,dbHost
,dbName
,dbPassword
,dbPort
.dbPort
.Problema 2: Configuración de
node-postgres
Otra posibilidad es que la configuración de
node-postgres
provoque que la Lambda se detenga temprano. Asegúrese de tener la configuración correcta, como:pg
.pg.Client()
y pasar un objeto de configuración como argumento.client.connect()
para establecer una conexión.await
en cualquier consulta o comando de PostgreSQL.client.end()
para cerrar la conexión.Asegúrese de que el comando de PostgreSQL sea correcto y que el nombre de la tabla y el nombre del campo sean correctos.
Problema 3: Tiempo de espera de la función Lambda
Otra posibilidad es que la función Lambda se esté agotando antes de completar la actualización de PostgreSQL. El tiempo de espera predeterminado es de 3 segundos, pero se puede modificar. Puede aumentar el tiempo de espera de la función.
Problema 4: Asignación insuficiente de memoria
Otra posibilidad es que la función Lambda no tenga suficiente memoria para ejecutarse. La configuración de memoria para la función AWS Lambda determina la cantidad de CPU y red que recibe la función. Aumentar la asignación de memoria puede proporcionar a la función más recursos de CPU y red.
Problema 5: Falta de permisos
Los posibles problemas de permisos podrían impedir que la función Lambda complete sus tareas. Verifique que la función Lambda tenga permiso para realizar las tareas necesarias.
Conclusión
La función Lambda puede detenerse temprano debido a varias razones. Investigue estos posibles problemas para encontrar el problema raíz.