Don Stefani
Don Stefani

Reputation: 31

Node Lambda: MySQL query never runs

Testing with Postman, I'll try to make this as clear as possible, please advise if this is not making sense.

I have a Lambda that uses MySQL RDS database on AWS and works fine locally when accessing the database on AWS. After successfully getting a JWT from an auth endpoint I try to hit the login endpoint and I get a 502 Bad Gateway. Using the CloudWatch logs I can trace the failure to right before the login query runs. I've confirmed that my MySQL config is correct and that I have a connection to the database. The lambda and the database are in the same region DB: us-east-1f, lambda: us-east-1.

I've confirmed the OPTIONS and POST request methods for this endpoint both are set up with CORS enabled in the API Gateway. I'm using my serverless.yml to set cors: true on all the endpoints even though I'm using app.use(cors()) in my index file.

The error message for the 502 is, {"message": "Internal server error"}

Here is the point of failure in my code:

'use strict';

const mysql = require('./index');

module.exports = {
  loginSql: async (email, password) => {
    // MAKES IT HERE AND THE PARAMS ARE CORRECT
    try {
      console.log('IN TRY %%%%%%%%%%%%%%');
      // SEEMS TO DIE HERE
      const results = await mysql.query({
        sql: `SELECT 
        id, first_name, last_name, email 
        FROM users 
        WHERE email = ? 
        AND password = ?`,
        timeout: 50000,
        values: [email, password],
      });
      // NEVER MAKES IT HERE /////////
      console.log('QUERY RAN %%%%%%%%%%%%');
      mysql.end();
      if (results.length < 1) return false;
      return results;
    } catch (error) {
      // DOESN'T THROW ERROR
      console.log('LOGIN DB ERROR', error);
      throw new Error('LOGIN DB ERROR THROWN', error);
    }
  },
};

Upvotes: 0

Views: 391

Answers (1)

smac2020
smac2020

Reputation: 10704

I just created the exact same use case in that I have a LAMBDA function written in Java querying data from a MySQL RDS instance. It works perfectly.

Here is your issue:

To connect to the RDS instance from a Lambda function, you must set the inbound rules using the same security group as the RDS Instance. For details, How do I configure a Lambda function to connect to an RDS instance?.

enter image description here

Upvotes: 1

Related Questions