我是 AWS 新手,正在尝试设置和初始化 RDS 实例。由于我有一个新创建的帐户,它不支持 EC2-Classic,这(据我所知)意味着我的 RDS 实例必须部署到 VPC 中的私有子网。但是,一旦创建了 RDS 实例,我如何从外部世界连接到它?我知道我可以从 VPC 中的公共子网连接到它,所以我的应用程序服务器将能够毫无问题地使用数据库。但是,我希望能够启动 Squirrel 或其他 GUI 客户端来初始化架构,或者随着应用程序的增长添加列和表。如果要求它位于私有子网中,我该怎么做?
答案1
一种解决方案(但不是唯一的解决方案!)是使用所谓的堡垒主机。堡垒主机是位于您的公共子网中的超低功耗服务器,并且是唯一允许入站 SSH 连接的服务器。
该服务器应该彻底加固,并且根据你的偏执程度,你可以使用一些技术来隐藏该服务器正在监听 SSH 连接的事实。例如,http://www.portknocking.org/view/details当然,你不需要为了连接到你的RDS实例而强化它。
无论如何,您可以按如下方式设置 EC2 安全组规则:
- 堡垒主机安全组仅允许从本地 IP 使用端口 22(因此您可以通过 SSH 进入,但其他人则不能)
- RDS 安全组仅允许来自堡垒主机的端口 X(取决于你的数据库)上的传入数据库连接
顺便说一句,您可以通过指定 Bastion Host 的私有 IP 地址或列出 Bastion Host 使用的安全组名称来实现“仅从 Bastion Host”。
现在你有两个选择:
选项 1:设置本地端口转发作为 SSH 连接的一部分
例如,如果你使用的是 OS X 或 Linux,请通过 SSH 进入堡垒主机并使用以下命令设置本地端口转发:
ssh -l <bastion-host-username> -L <local-port-you-connect-to>:<rds-private-ip>:<rds:listening-port> <bastion-host-public-ip>
假设你从基于 Ubuntu 的 Bastion Host 连接到 Postgres。它可能看起来像这样:
ssh -l ubuntu -L 5432:<rds-private-ip>:5432 <bastion-host-public-ip>
您的本地计算机现在正在侦听端口5432
,并将转发任何这些连接,<bastion-host-public-ip>
进而将其转发5432
到<rds-private-ip>
选项 2:在数据库客户端中查找此功能
我知道 DBVisualizer 支持此功能。但我不确定 Squirrel 是否支持。基本上,您的 SQL 客户端会为您处理此问题,而不是使用 SSH 手动设置本地端口转发。
答案2
这对我来说很有效。确保你有psql 客户端本地安装。
psql --host=myAwsDbEndpointUrl.ciqykqusf0nv.us-west-1.rds.amazonaws.com --port=5432 --username=myUserName --password --dbname=myDbName
在 aws 上创建数据库实例时,请确保定义以下内容:
- 用户名
- 密码
- 数据库名称
- 端口号
我还必须为数据库所在的 VPC 创建一个安全组。创建后,请确保您的数据库实例将其用作其安全组。安全组具有以下规则:
inbound--> type:PostgreSQL, protocol:TCP port range:5432, source:0.0.0.0/0
outbound--> type:All Traffic, protocol:All, port range:all, destination:0.0.0.0/0