【问题标题】:connecting to documentdb from a java program从 java 程序连接到 documentdb
【发布时间】:2021-05-10 17:54:16
【问题描述】:

在 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$1@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 作为用户名和一些虚构的密码。我必须事先创建一个用户并事先给它相关政策吗?

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

【问题讨论】:

  • 您是否从主机/lambda 检查了 db 的可达性?
  • @amitd,您的意思是来自 AWS 内部?即从 cloud9 说 - 我没有尝试过。这是否意味着只能从 AWS 内部访问 documentDB?不是从外面来的?
  • 如果客户端和服务器不在同一个 VPC 中,那么您仍然可以建立连接。确保客户端有到达服务器的路由通常会失败。我不知道确切的步骤,但 AWS 上的 VPC 文档有从外部打开对 vpc 中服务器的访问的步骤。

标签: java amazon-web-services aws-documentdb


【解决方案1】:

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

要创建 SSH 隧道,您需要一个在与您的 Amazon DocumentDB 集群相同的 Amazon VPC 中运行的 Amazon EC2 实例。您可以使用与集群相同的 VPC 中的现有 EC2 实例,也可以创建一个。

该指南显示您使用以下命令转发 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隧道命令中配置所需的端点,你可以研究一下。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2019-11-08
    • 2019-09-14
    • 2020-05-01
    • 2017-12-30
    相关资源
    最近更新 更多