【问题标题】:Can't connect to MongoDB Atlas from Google Function无法从 Google Function 连接到 MongoDB Atlas
【发布时间】:2020-08-19 20:48:15
【问题描述】:

我已经在 App 引擎上有一个快速服务器,它正在使用我的 Mongo Atlas 数据库,一切都很好。

我想启动一个使用相同数据库并处理 pubsub 事件的云函数。但是,我在部署函数时无法连接到数据库。

我尝试了私有 URI 和公共 URI。对于公众,我有时会设法连接,但并非总是如此(而且我必须将集群上的所有 IP 都设为白名单)。

这里是功能代码(简体)

const path = require('path')
require('dotenv').config({ path: path.join(__dirname, '/.env') })
const config = require('./libs/config/config.js')
const mongoose = require('mongoose')
const sanitize = require('mongo-sanitize')
const Utils = require('./libs/services/utils')

// Mongo connection string
const mongo = config.get('db.protocol') + '://' + config.get('db.user') + ':' + config.get('db.password') + '@' + config.get('db.host') + '/' + config.get('db.name') + '?retryWrites=true&w=majority'

// Database connexion
mongoose.connect(mongo, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true }).then(() => {
  console.log('Connected to mongoDB')
}).catch(e => {
  console.log('Error while DB connecting')
  console.log(e)
})

/**
 * Background Cloud Function to be triggered by Pub/Sub.
 * This function is exported by index.js, and executed when
 * the trigger topic receives a message.
 *
 * @param {object} data The event payload.
 * @param {object} context The event metadata.
 */
exports.scenarioManagerPushPubSub = (gcpEvent, context) => {
  const event = Utils.parseEntryInfo(gcpEvent, context)
  console.log('scenarioManager : ', event, event.constructor.name)
 // my Function
}

我在 GAE 上的 Express 应用上使用相同的连接字符串。

我已激活 VPC 无服务器,并将 Mongo Atlas 上的 IP 范围列入白名单。 Mongo Atlas 和 GCP 之间的对等互连已启动并正在运行。

我得到的错误:

A 2020-08-18T09:16:03.547Z scenarioManager-staging Error while DB connecting scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging { MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/ scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at NativeConnection.Connection.openUri (/workspace/node_modules/mongoose/lib/connection.js:830:32) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Mongoose.connect (/workspace/node_modules/mongoose/lib/index.js:335:15) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Object.<anonymous> (/workspace/smsGateway.js:16:10) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Module._compile (internal/modules/cjs/loader.js:778:30) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Module.load (internal/modules/cjs/loader.js:653:32) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at tryModuleLoad (internal/modules/cjs/loader.js:593:12) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Function.Module._load (internal/modules/cjs/loader.js:585:3) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Module.require (internal/modules/cjs/loader.js:692:17) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at require (internal/modules/cjs/helpers.js:25:18) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Object.<anonymous> (/workspace/index.js:1:20) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Module._compile (internal/modules/cjs/loader.js:778:30) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Module.load (internal/modules/cjs/loader.js:653:32) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at tryModuleLoad (internal/modules/cjs/loader.js:593:12) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging     at Function.Module._load (internal/modules/cjs/loader.js:585:3) scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging   message: scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging    'Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you\'re trying to access the database from an IP that isn\'t whitelisted. Make sure your current IP address is on your Atlas cluster\'s IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/', scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging   reason: scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging    TopologyDescription { scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      type: 'ReplicaSetNoPrimary', scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      setName: null, scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      maxSetVersion: null, scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      maxElectionId: null, scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      servers: scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging       Map { scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging         '*-shard-00-00-pri.xgtnk.gcp.mongodb.net:27017' => [ServerDescription], scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging         '*-shard-00-01-pri.xgtnk.gcp.mongodb.net:27017' => [ServerDescription], scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging         '*-shard-00-02-pri.xgtnk.gcp.mongodb.net:27017' => [ServerDescription] }, scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      stale: false, scenarioManager-staging  
A 2020-08-18T09:16:03.547Z scenarioManager-staging      compatible: true, scenarioManager-staging  
A 2020-08-18T09:16:03.548Z scenarioManager-staging      compatibilityError: null, scenarioManager-staging  
A 2020-08-18T09:16:03.548Z scenarioManager-staging      logicalSessionTimeoutMinutes: null, scenarioManager-staging  
A 2020-08-18T09:16:03.548Z scenarioManager-staging      heartbeatFrequencyMS: 10000, scenarioManager-staging  
A 2020-08-18T09:16:03.548Z scenarioManager-staging      localThresholdMS: 15, scenarioManager-staging  
A 2020-08-18T09:16:03.548Z scenarioManager-staging      commonWireVersion: null } } scenarioManager-staging  

我如何部署我的功能:

gcloud functions deploy scenarioManager-staging --entry-point scenarioManagerPushPubSub --runtime nodejs10 --trigger-topic scenarioManager-staging --region europe-west1 --set-env-vars NODE_ENV=staging --vpc-connector=default-serverless-vpc 

你能帮帮我吗?

[编辑] 我在默认 VPC 上添加了防火墙条目以允许 27015-2017 出站。 我在服务帐户上添加了访问网络的权限。 .. 但在私有 URI 上仍然是 KO。在具有完整白名单的公共服务器上,我有时会连接但并非总是如此。

【问题讨论】:

    标签: google-cloud-platform google-cloud-functions mongodb-atlas


    【解决方案1】:

    尝试在本地运行该函数并确保它有效。

    如果它在本地运行而不是在部署后运行,请确保您的 firebase 项目升级到 Blaze 计划。

    【讨论】:

      【解决方案2】:

      在调查时,我发现这里报告了一个类似的问题 [1]。使用 Google DNS 为用户解决了这个问题。如果有帮助,我建议您查看此链接。

      [1]Not able to connect to MongoDB atlas database

      【讨论】:

      • 因为这一切都在 GCP 上,所以我无法管理 DNS 配置。我的集群不在固定 IP 上。
      【解决方案3】:

      我使用完整的本地配置(pubsub + 函数 + 数据库)进行了开发。我刚刚通过我的计算机连接到 Mongo Atlas 进行了测试,它运行良好。

      $ functions-framework --target=scenarioManagerPushPubSub --signature-type=event --source=./scenarioManager.js
      Serving function...
      Function: scenarioManagerPushPubSub
      URL: http://localhost:8080/
      Connected to mongoDB
      scenarioManager :  { call: '5f3a39ec79c84c000a063802' } Object
      Call  5f3a39ec79c84c000a063802  found
      Nothing to do for this scenario 5f353c0319947a000afe9bde
      

      【讨论】:

        猜你喜欢
        • 2019-01-27
        • 1970-01-01
        • 2020-09-13
        • 2019-10-31
        • 2019-06-08
        • 2019-10-13
        • 2021-06-25
        • 1970-01-01
        • 2020-06-16
        相关资源
        最近更新 更多