从 java 程序连接到 documentdb

connecting to documentdb from a java program

我在 AWS 中创建了一个 documentdb 集群。我使用与这里相同的 java 程序,只是对连接字符串进行了必要的更改。 here 我无法连接。这是错误消息:

Feb 06, 2021 9:56:36 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[price-manager-prod-new-docdb-clsuter.cluster- 
cduzobvhwuhh.us-east-1.docdb.amazonaws.com:27017], mode=MULTIPLE, requiredClusterType=REPLICA_SET, 
serverSelectionTimeout='30000 ms', maxWaitQueueSize=500, requiredReplicaSetName='rs0'}
Feb 06, 2021 9:56:36 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server price-manager-prod-new-docdb-clsuter.cluster-cduzobvhwuhh.us-east- 
1.docdb.amazonaws.com:27017 to client view of cluster
Feb 06, 2021 9:56:36 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: No server chosen by com.mongodb.client.internal.MongoClientDelegate@5890e879 from cluster 
description ClusterDescription{type=REPLICA_SET, connectionMode=MULTIPLE, serverDescriptions= 
[ServerDescription{address=price-manager-prod-new-docdb-clsuter.cluster-cduzobvhwuhh.us-east- 
1.docdb.amazonaws.com:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing 
out
Feb 06, 2021 9:56:56 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Exception in monitor thread while connecting to server price-manager-prod-new-docdb- 
clsuter.cluster-cduzobvhwuhh.us-east-1.docdb.amazonaws.com:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)

亚马逊要求使用以下连接字符串。 mongodb://docdbnewbie:@price-manager-prod-new-docdb-clsuter.cluster-cduzobvhwuhh.us-east-1.docdb.amazonaws.com:27017/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false

在程序中,在连接字符串中我没有使用ssl_ca_certs=rds-combined-ca-bundle.pem。 我导入到密钥库的 pem 文件。 创建集群时,它要求提供主用户名和密码。我只是使用 docdbnewbie 作为用户名和一些虚构的 password.Do 我必须事先创建一个用户并事先给它相关的政策吗?

更新: 我已经能够在 java 客户端和 AWS 托管的 documentdb 之间建立连接。但是我的 java 程序也在 EC2 中 - 使用了 cloud9。如果有人可以阐明当客户端在 VPC 之外时是否可以建立这种连接,那将有很大帮助。

如果您查看共享文档,在 Connecting to an Amazon DocumentDB Cluster from Outside an Amazon VPC 部分下,它清楚地表明您需要通过 DocumentDB 的 VPC 内的 EC2 实例 运行 设置 SSH 隧道。准确地说,

To create an SSH tunnel, you need an Amazon EC2 instance running in the same Amazon VPC as your Amazon DocumentDB cluster. You can either use an existing EC2 instance in the same VPC as your cluster or create one.

该指南显示您使用以下命令转发 27017(mongodb 的默认端口)。

ssh -i "ec2Access.pem" -L 27017:sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 ubuntu@ec2-34-229-221-164.compute-1.amazonaws.com -N

完成隧道设置后,您将使用 localhost:27017 作为 DocumentDB 的端点,而不是自定义 DNS 名称 price-manager-prod-new-docdb-clsuter.cluster-cduzobvhwuhh.us-east-1.docdb.amazonaws.com:27017。此 DNS 名称不公开可用,只能从您的 VPC 内解析。这就是为什么同一个程序在 VPC 内的 EC2 上 运行 时运行的原因。

如果你不想使用localhost,应该有一种方法可以在SSH隧道命令中配置所需的端点,你可以研究一下。