跳至内容

如何使用 SSH 隧道从 Amazon VPC 外部连接到我的 Amazon DocumentDB 集群?

3 分钟阅读
0

我想访问 Amazon Virtual Private Cloud (Amazon VPC) 中部署的 Amazon DocumentDB(兼容 MongoDB)集群。我想使用 SSH 隧道从 Amazon VPC 外部访问集群。

简短描述

要使用 SSH 隧道将流量从本地计算机转发到 Amazon DocumentDB 集群,请使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例作为堡垒机或跳跃主机。堡垒主机充当代理,将流量从本地计算机转发到 Amazon DocumentDB 集群。

解决方法

以下解决方法使用 EC2 实例作为堡垒主机。堡垒主机使用 MongoDB 命令行界面 (CLI) 客户端,通过 SSH 隧道从本地计算机连接到 Amazon DocumentDB 集群。

先决条件:

确认可从 Amazon EC2 堡垒主机访问 Amazon DocumentDB 集群

使用私钥对通过 SSH 从本地计算机连接到堡垒主机:

ssh -i path_to_pem_file instance-user-name@instance-public-dns-name

**注意:**将 path_to_pem_file 替换为您的 .pem 密钥文件的路径。将 instance-user-name 替换为您的实例的用户名。将 instance-public-dns-name 替换为您的实例公有 DNS 名称或 IP 地址。

有关详细信息,请参阅使用 SSH 客户端连接到 Linux 实例

要对您的集群进行身份验证,请下载 Amazon DocumentDB 的证书颁发机构 (CA) 证书:

wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

使用 MongoDB CLI 客户端连接到 Amazon DocumentDB 集群:

mongo --tls --host cluster-endpoint --tlsCAFile global-bundle.pem --username primary-username --password master-password

**注意:**将 cluster-endpoint 替换为您的 DocumentDB 集群端点。将 primary-username 替换为您的数据库主用户名。将 primary-password 替换为您的数据库主密码。

有关更多信息,请参阅使用 Amazon EC2 进行连接

配置 SSH 隧道

验证从堡垒主机到集群的连接后,配置 SSH 隧道。

要设置从本地计算机到堡垒主机的 SSH 隧道,请运行类似于以下示例的命令:

ssh -i path_to_pem_file -L local-port:cluster-endpoint:remote-port instance-user-name@instance-public-dns-name -N -f

**注意:**将 path_to_pem_file 替换为您的 EC2 实例私钥文件的路径。将 local-port 替换为要在本地计算机上使用的端口号。将 cluster-endpoint 替换为您的数据库集群端点。将 remote-port 替换为远程数据库的端口号。

在以下示例中,SSH 隧道将本地计算机的端口 27017 绑定到远程 Amazon DocumentDB 集群:

ssh -i "ec2Access.pem" -L 27017:sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 ec2-user@ec2-zz-aaa-yyy-zzz.compute-1.amazonaws.com -N -f

上述示例命令中使用了以下命令行选项:

  • i identity_file:使用实例的私钥对(.pem 文件)进行身份验证。
  • L port:host:hostport:绑定本地(客户端)主机上的端口,在远程主机的主机端口上转发流量。
  • N:不运行远程命令。这仅在转发端口时有用。
  • f:运行 SSH 以在后台运行。

要验证 SSH 隧道是否在后台运行,请运行类似于以下示例的命令。

**注意:**将 local-port 替换为您的端口号。

Linux 和 macOS:

lsof -P | grep -i "listen" | grep local-port

Windows:

netstat -abn | findstr "LISTEN" | findstr local-port

**注意:**您必须是管理员用户才能在 Windows 上运行上述命令。

要确认本地主机是否侦听本地端口 27017,请运行以下命令:

nc -zv 127.0.0.1 27017

查看输出。如果 SSH 隧道成功建立,您会看到类似于以下示例的输出:

❯ lsof -P | grep -i "listen" | grep 27017ssh 52787 user 7u IPv4 0x1256bbb543454447 0t0 TCP localhost:27017 (LISTEN)
❯ netstat -abn | findstr "LISTEN" | findstr 27017TCP 127.0.0.1:27017 0.0.0.0:0 LISTENING
❯ nc -zv 127.0.0.1 27017Connection to 127.0.0.1 port 27017 [tcp/*] succeeded!

上述示例使用了端口 27017。

从本地计算机连接到 Amazon DocumentDB 集群

使用 MongoDB Shell 或 GUI 客户端从本地计算机连接到 Amazon DocumentDB 集群。

**注意:**在启动连接之前,请在本地计算机上下载 Amazon DocumentDB 的 CA 证书。

要使用 MongoDB Shell 连接到 Amazon DocumentDB 集群,请运行以下命令:

mongo --tls --tlsAllowInvalidHostnames --tlsCAFile global-bundle.pem --username primary-username --password primary-password

**注意:**将 primary-username 替换为您的数据库用户名。将 primary-password 替换为您的数据库密码。

上述示例命令未显式指定 --host--port 参数。当您未指定 --host--port 参数时,MongoDB Shell 会尝试通过本地端口 2701 连接到计算机的本地主机。然后,SSH 隧道会将连接转发到 Amazon DocumentDB 集群端点。

当您在本地计算机上使用 27017 以外的端口时,请使用 --port 参数显式指定自定义端口。有关更多信息,请参阅 MongoDB 网站上的 Connect to a deployment on a remote host(连接到远程主机上的部署)。

重要注意事项

查看以下注意事项:

  • 某些 GUI 客户端提供 SSH 隧道选项,例如 MongoDB Compass 或 Studio 3T。使用这些客户端时,无需使用 MongoDB CLI 手动创建和管理 SSH 隧道。而是将 SSH 隧道配置保存在 GUI 客户端的连接设置中。有关更多信息,请参阅有关特定 GUI 客户端的文档。
  • 当您需要绕过 SSL/TLS 主机名验证时,请使用 --tlsAllowInvalidHostnames 参数通过 SSH 隧道进行连接。连接字符串 mongodb://localhost:27017 中的主机名与 Amazon DocumentDB 集群服务器证书中的主机名不匹配。如果您使用 Amazon DocumentDB 集群端点直接连接到集群,则无需使用 --tlsAllowInvalidHostnames 参数。
  • 对于 MongoDB Compass 和 Studio 3T 等 GUI 客户端,请在连接字符串中指定 tlsAllowInvalidHostnames 选项 (tlsAllowInvalidHostnames=true)。或者,在 SSL/TLS 选项卡的连接设置中启用 **Allow Invalid Hostnames**(**允许无效主机名**)选项。
  • 当您使用 SSH 隧道进行连接时,最佳做法是连接到集群端点。如果您在连接字符串中指定 replicaSet=rs0,则可能会出现错误。当您将 MongoDB Compass 用于 SSH 隧道时,请启用直接连接以关闭副本集连接。有关更多信息,请参阅 MongoDB 网站上的 General connection tab(通用连接选项卡)。

相关信息

从 Amazon VPC 外部连接到 Amazon DocumentDB 集群

MongoDB 网站上的 What is MongoDB Compass?(什么是 MongoDB Compass?)

AWS 官方已更新 5 个月前