我正在尝试从 Lambda 函数连接到 DocumentDB。
我已经按照本教程配置了 DocumentDB ,并且可以通过 cloud9 命令提示符访问它。
documentDB 集群是两个安全组的一部分。第一个安全组称为 vpc默认安全组demoDocDB,第二个称为defaultvpc 默认安全组。
demoDocDB用于将请求从 cloud9 实例转发到运行我的 documentDB 数据库的端口 27017 的入站规则。
安全组的入站规则defualt指定所有流量、所有端口范围及其自身的来源。VPC ID 是默认的 VPC 设置。
在 lambda 中编辑 VPC 详细信息时,我输入了:
defaultVPC 的安全组该函数在写入数据库时工作了两次,其余时间都超时了,Lambda 函数的超时时间为 2 分钟,但在达到该超时时间之前,它将抛出超时错误。
[ERROR] ServerSelectionTimeoutError: MY_DATABASE_URL:27017: [Errno -2] Name or service not known
Run Code Online (Sandbox Code Playgroud)
下面的代码片段是尝试执行的代码,该函数永远不会print("INSERTED DATA")在插入语句期间达到超时。
def getDBConnection():
client = pymongo.MongoClient(***MY_URL***)
##Specify the database to …Run Code Online (Sandbox Code Playgroud) 最近,我将我的一个项目 (PHP 7.4/Lumen/Ubuntu 20.04) 从 MongoDB 迁移到 MongoDB 兼容的 AWS DocumentDB。自迁移以来,所有 CLI 脚本都会触发此奇怪的通知/警告
bson_append_array(): invalid array detected. first element of array parameter is not "0".
Run Code Online (Sandbox Code Playgroud)
除了这条消息之外,一切似乎都能正常工作(即使我将所有 PHP 错误都隐藏在 ini 文件中,但它仍然显示出来)。不太确定发生了什么事。
消息实际上来自“find”方法。我也尝试过抑制该消息,但没有成功。
有谁知道这里发生了什么事吗?感谢您提前做出的所有回复。
我在 Apache 配置文件中有我的 mongo 详细信息。并收到此错误。
SetEnv MONGO_URL mongodb://:@XXXXXXXXX.docdb.amazonaws.com:27017/?ssl=true&ssl_ca_certs=/home/ec2-user/rds-combined-ca-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false
App 2291 output: MongoNetworkError: failed to connect to server [XXXXXX.docdb.amazonaws.com:27017] on first connect [Error: unable to get local issuer certificate
App 2291 output: at TLSSocket.onConnectSecure (_tls_wrap.js:1474:34)
App 2291 output: at TLSSocket.emit (events.js:310:20)
App 2291 output: at TLSSocket.EventEmitter.emit (domain.js:482:12)
App 2291 output: at TLSSocket._finishInit (_tls_wrap.js:917:8)
App 2291 output: at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:687:12) {
App 2291 output: name: 'MongoNetworkError',
App 2291 output: [Symbol(mongoErrorContextSymbol)]: {}
App 2291 output: }]
Run Code Online (Sandbox Code Playgroud)
MongoNetworkError: [错误: 无法获得本地颁发者证书
我按照此处的说明设置了 SSH 隧道以进行外部连接: https: //docs.aws.amazon.com/documentdb/latest/developerguide/connect-from-outside-a-vpc.html
一旦建立了隧道,我就可以使用 GUI 客户端 Robomongo 和“Studio 3T”进行连接。这样就验证了 ec2 机器确实具有访问权限并且我的 SSH 隧道正在工作。
但尽管如此,NodeJS 对这种连接并不满意。根据我的配置,我收到两个错误之一。
配置1:
const url = 'mongodb://root:some-password@localhost:27017?ssl=true&replicaSet=rs0&readPreference=secondaryPreferred';
const ca = [fs.readFileSync('./rds-combined-ca-bundle.pem')];
const options = {
sslValidate: false, // you will see why in the next config
sslCA: ca,
useNewUrlParser: true,
useUnifiedTopology: true,
};
const client = new MongoClient(url, options);
Run Code Online (Sandbox Code Playgroud)
几秒钟后我得到:
(node:7640) UnhandledPromiseRejectionWarning: MongoServerSelectionError: connect ENETUNREACH 172.31.26.210:27017
at Timeout._onTimeout (/Volumes/foo/source/node_modules/mongodb/lib/core/sdam/topology.js:430:30)
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7)
Run Code Online (Sandbox Code Playgroud)
配置2:
const url = 'mongodb://root:some-password@localhost:27017?ssl=true&replicaSet=rs0&readPreference=secondaryPreferred';
const ca = [fs.readFileSync('./rds-combined-ca-bundle.pem')];
const …Run Code Online (Sandbox Code Playgroud) 为了以编程方式将 python 连接到本地环境中的 AWS DocumentDB(AWS 版本的 MongoDB)实例,我遇到了一些问题。我们尝试了以下步骤:
为了开始我们的实验,我们使用推荐的 AWS 教程来创建 python 连接: https: //docs.aws.amazon.com/documentdb/latest/developerguide/connect_programmatically.html。
由于我们希望最初在本地进行设置,因此我们使用以下命令与集群建立 SSH 连接: ssh -i "example.pem" -L 27019:docdb.cluster-XXXXXXX.region.docdb.amazonaws.com:27017 ec2 -user@ec2-XXX-XXX-XXX-XXX.region.compute.amazonaws.com -N -v 此命令运行良好,我们能够创建隧道并将本地端口 27019 连接到我们的集群。与此相关的一个重要注意事项是,为了到达集群,我们必须激活 VPN 网络。
我们调整了代码以连接到本地端口:
from pymongo import MongoClient,ReadPreference
import urllib
import ssl
username=urllib.parse.quote_plus("username")
password=urllib.parse.quote_plus("password")
port=27019
host="localhost"
dbName="general"
dbUri = f'mongodb://{username}:{password}@{host}:{port}/?tls=true&tlsCAFile=./rds-combined-ca-bundle.pem&retryWrites=false'
print(dbUri)
client = MongoClient(dbUri)
print(client.list_database_names())
Run Code Online (Sandbox Code Playgroud)
运行上面的例子我们得到错误:
pymongo.errors.ServerSelectionTimeoutError: hostname '127.0.0.1' doesn't match either of 'docdb.XXXXXXX.region.docdb.amazonaws.com', 'docdb.cluster-XXXXXXX.region.docdb.amazonaws.com', 'docdb.cluster-ro-XXXXXXX.region.docdb.amazonaws.com', Timeout: 30s, Topology Description: <TopologyDescription id: 61e7f8c811a815088e97e5a7, topology_type: Unknown, servers: [<ServerDescription ('127.0.0.1', 27019) server_type: Unknown, …Run Code Online (Sandbox Code Playgroud) 如果我的node.js应用程序位于基于此页面的ec2实例中,我可以连接到documentDB:https://docs.aws.amazon.com/documentdb/latest/developerguide/connect_programmatically.html
但是,如果我从本地电脑运行 Node.js 应用程序,是否可以连接到 documentDb?
编辑: 这是我的一些带有示例连接字符串的代码。我使用猫鼬进行连接。
const connectionString = 'mongodb://user:password@sampledb.cluster-asdf.ap-northeast-1.docdb.amazonaws.com:27017/mydb?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false';
mongoose.Promise = bluebird;
mongoose.connect(connectionString, {
useMongoClient: true,
reconnectTries: 1000,
autoReconnect: true,
connectTimeoutMS: 99999,
}
);
Run Code Online (Sandbox Code Playgroud) mongodb ×5
node.js ×2
pymongo ×2
python ×2
amazon-ec2 ×1
apache2.2 ×1
aws-lambda ×1
laravel ×1
lumen ×1
php ×1