首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pymongo与DocumentDB集群的连接

Pymongo与DocumentDB集群的连接
EN

Stack Overflow用户
提问于 2022-01-19 11:52:53
回答 3查看 2.2K关注 0票数 0

为了编程地将python连接到本地环境中的AWS DocumentDB (AWS版本的MongoDB)实例,我面临一些问题。我们尝试了以下步骤:

  1. 为了开始实验,我们使用了推荐的AWS教程来创建python:programmatically.html
  2. 由于我们最初希望在本地设置此命令,所以我们使用以下命令对集群进行SSH连接: ssh -i "example.pem“-L -N -v,该命令工作良好,我们能够创建隧道并将本地端口27019连接到集群。关于这一点,一个重要的注意事项是,为了到达集群,我们必须激活VPN网络。
  3. 我们调整了代码以连接到本地端口:
代码语言:javascript
运行
复制
    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())

以错误的形式运行上面的示例:

代码语言:javascript
运行
复制
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, rtt: None, error=CertificateError("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'",)>]>
2022-01-19 11:41:27,120| ERROR   | Could not establish connection from local ('127.0.0.1', 27019) to remote ('ai-docdb-dev.cluster-cq8mixmxuhvt.eu-west-1.docdb.amazonaws.com', 27017) side of the tunnel: open new channel error:

这说明了两点:首先,我们的代码正确地使用了.pem证书,并且能够获得我们的集群名称。其次,代码无法理解localhost是一个地址,并检查本地端口27019以到达集群。

为了克服这个问题,我们还尝试将代码变量主机替换为127.0.01,但是结果是一样的。我们还试图调整pymongo函数MongoClient client.MongoClient的几个参数,但结果保持不变。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2022-01-21 09:23:39

经过多次不成功的尝试,我们终于找到了解决方案!

使用pymongo3.X.x,我们能够通过将参数documentDb添加到原始URI (传递给我们的MongoClient函数)来连接到我们的MongoClient实例。

对于pymongo4.X.x,我们必须添加一个额外的参数directConnection=true才能工作。

host变量可以设置为localhost127.0.0.1usernamepassword可以用urlib填充,也可以不使用。

票数 1
EN

Stack Overflow用户

发布于 2022-01-20 09:01:05

看起来证书检查正在验证您使用的主机名,因此我们可以使用实际的主机名并将它们在主机文件中映射到127.0.0.1

将每个docdb.XXXXXXX.region.docdb.amazonaws.com添加到呼叫系统的主机文件中。

代码语言:javascript
运行
复制
127.0.0.1 docdb.XXXXXXX-1.region.docdb.amazonaws.com
127.0.0.1 docdb.XXXXXXX-2.region.docdb.amazonaws.com
127.0.0.1 docdb.XXXXXXX-3.region.docdb.amazonaws.com

然后更改主机变量:

代码语言:javascript
运行
复制
host=f"docdb.XXXXXXX-1.region.docdb.amazonaws.com:{port},docdb.XXXXXXX-2.region.docdb.amazonaws.com:{port},docdb.XXXXXXX-3.region.docdb.amazonaws.com:{port}"

然后更改URI以移除端口,因为它现在位于主机变量中:

代码语言:javascript
运行
复制
dbUri = f'mongodb://{username}:{password}@{host}/?tls=true&tlsCAFile=./rds-combined-ca-bundle.pem&retryWrites=false'
票数 0
EN

Stack Overflow用户

发布于 2022-02-17 20:43:42

将&tlsAllowInvalidHostnames=true添加到URI以跳过主机名检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70770130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档