Pritesh Kanthaliya
Pritesh Kanthaliya

Reputation: 317

Google App Engine using a VPC connector does not connect with MongoDB

I am getting the following error when I deploy a Python application on Google App Engine with VPC connector and MongoDB with replica set.

MongoDB is on Google Compute Engine.

pymongo.errors.ServerSelectionTimeoutError: \
Could not reach any servers in [('mongodb-v44', 27017)]. \
Replica set is configured with internal hostnames or IPs?, \
Timeout: 30s, Topology Description: <TopologyDescription id: \ 
5ff5a4121251453cdcc1ff41, topology_type: ReplicaSetNoPrimary, \ 
servers: [<ServerDescription ('mongodb-v44', 27017) \ 
server_type: Unknown, \ 
rtt: None, error=AutoReconnect('mongodb-v44:27017: \
a [Errno -2] Name or service not known')>]>"

Python code:

mongo_connection = mongoengine.connect(
    db=os.getenv('DB_NAME'),
    host=os.getenv('DB_HOST_URL'),
    port=int(os.getenv('DB_PORT')),
    username=os.getenv('DB_USERNAME'),
    password=os.getenv('DB_PASSWORD'),
    authentication_source='admin',
    replicaset=os.getenv('REPLICA_SET'),
    read_preference=ReadPreference.PRIMARY_PREFERRED
)

try:
    info = mongo_connection.server_info()  # Forces a call.
except Exception:
    raise Exception("mongo server is down.")

Upvotes: 0

Views: 207

Answers (2)

Andrew
Andrew

Reputation: 855

To debug issues quickly and resolve them, be as explicit as possible when handling error messages. At the moment, you are capturing "all" Exception, and these anti-patterns can be very hard to debug.

Rather than using a general Exception:

except Exception:
    raise Exception("mongo server is down.")

You can either capture the error message in some way:

except Exception as err:
    print("MongoDB error:", err)

Or better yet, you could write your own Exception to improve your debugging:

class MongodbError(Exception):
    """Exception Base class"""
    pass

class ServerTimeoutError(MongodbError):
    pass

class MongoServerLostConnection(MongodbError):
    pass

try:
    do_something()
except MongodbError as err:
    manage_mongo_error(err)

Upvotes: 1

priyank kochhar
priyank kochhar

Reputation: 26

Make sure that the member's hostname in the replica set are accessible from the application.

Steps:

  1. check the rs.config()

  2. check the members hostname cfg.members[0].host = FQDN

  3. make sure FQDN is accessible from the application.

Upvotes: 1

Related Questions