【发布时间】: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