How to properly close the database connection in a lambda function?

aws

#1

In my lambda function, I tried to close the mongo connection as soon as I send a callback. But it has a problem.

  • When I send a request, the function performs its duties, send the callback and close the database connection.
  • When the second request is sent, the function times out.
  • When I remove the db.close() things work perfectly.

I think lambda re-use the connection for all the functions because I open the connection in the top of the handler:

// Connect to database
mongoose.connect(process.env.DATABASE_URL);


const handleCreateUser = async (event, context, callback) => {
  // eslint-disable-next-line no-param-reassign
  context.callbackWaitsForEmptyEventLoop = false;

  const data = JSON.parse(event.body);
  const { user, userProfile } = data;

  await createUser({ callback, user, userProfile });
};

Any idea what how to fix this? Do we really have to close the connection at this point?


#2

Code outside the handler is only executed when the Lambda is initialized during a cold start. When the Lambda runs a second time it’s trying to use a connection that’s been closed. Either move the mongoose.connect() inside the handleCreateUser or look at connection pooling.


#3

Is there a way to close the connection just before the lambda function exit?


#4

Yes. Just close it at the bottom of the handler function but remember to move the open to the top of the handler function or it won’t run a second time


#5

Just to add to @buggy’s answer, I attempted to visualise what he’s described in a blog post.


#6

Thanks @buggy I think that’s the best way to do it. Thank you @rowanu your article explained a lot more! Now things are getting more clear :slight_smile: :smiley:


#7

offtopic. @THPubs nice to see you here too. Saw you in meteor forums !