你的 RDS 实例没有公网端点。
经由 AWS SSM 够到它,不用堡垒机。
AgentsRoom 打开一条通往你数据库的 AWS Session Manager 端口转发会话,并让自己的 SQL 客户端从中穿过。这条会话用 AWS-StartPortForwardingSessionToRemoteHost 文档执行 aws ssm start-session,由你机器上早已配置好的 AWS 配置文件授权。
数据库继续待在它的私有子网里,安全组继续保持关闭,也没有任何新东西被暴露到公网上。变了的只有一点:你终于能查询它了,AI 编程智能体也能,以只读方式。
AgentsRoom 如何经由 AWS Systems Manager 访问私有子网里的 RDS 实例,而不向公网开放任何东西。
这套配置常见到有点乏味,又麻烦到能耗掉你一个下午。一个 Amazon RDS 实例待在私有子网里。它没有公网端点。它的安全组只接受来自应用的流量,别的一律不收。那个 VPC 里到处都没有入站 SSH 端口,因为有人做了正确的事,把它关掉了。而现在,你为了搞懂一个 bug,需要看三行数据。
传输这一层,AWS Systems Manager Session Manager 早就解决了。VPC 内的一个受管 EC2 节点,可以把你机器上的一个本地端口转发到它够得着的第三方主机,而私有子网里的 RDS 实例恰恰就是这样一台主机。负责这件事的文档是 AWS-StartPortForwardingSessionToRemoteHost,命令是 aws ssm start-session。没什么稀奇的,数据库上也不用装任何东西。
AgentsRoom 替你执行这条命令,并在另一头接上一个 SQL 客户端。实例、区域和配置文件只挑一次,把一个数据库连接挂到它上面,从此打开那个数据库就是一次点击的事。会话由你自己的 AWS 配置文件或 SSO 登录授权,所以为了这一跳,既不用存密钥,也不用存密码。
绕开它的那些常规办法,每一种都要你付出代价
同一个问题的三种答案,以及它们各自向你收取的费用。
一台要维护的堡垒机
公有子网里的一台跳板机,是一台你要打补丁、要监控、要付钱,最后还会忘掉的服务器。它带着一个入站 SSH 端口,一份随着人来人走而逐渐失真的授权密钥清单,还有一个只差一次粗心编辑就会对全世界敞开的安全组。它存在的唯一理由,是让某个人偶尔能够到一个数据库。
为了三行数据的问题而搭一条 VPN
客户端 VPN 为了回答一个关于三行数据的问题,把你整台机器塞进了那张网络里。它要开通、要分发、要续期、要吊销,会和你其余的网络连接打架,而在一台不断切换网络的笔记本上,它是最先出问题的那一环。大多数已经有 VPN 的团队,旁边还是留着一台堡垒机。
被到处复制的凭据
大家最后退而求其次的那个做法更糟:端点和密码落进了一条聊天消息、一份共享笔记、一个不小心提交上去的脚本,或者一段发给 AI 智能体的提示词。访问权限扩散到没人追踪的地方,日后想收回,就意味着轮换一次凭据,然后祈祷每一份副本都已经消失。
从一个私有 RDS 实例到一份结果集
四个步骤,做一次就够,之后就是一次点击的事。
保存一个 AWS SSM 连接
在连接管理器里新增一个连接,把它的传输方式设为 AWS SSM。你给它一个能够到数据库的受管 EC2 节点的实例 ID(i-0123456789abcdef0)、你的 AWS 配置文件和区域。这里没有密码字段,也没有密钥字段,因为会话由你机器上已有的 AWS 凭据授权。
添加数据库,并让它经由那个连接接入
新增一个 MySQL 或 MariaDB 连接,把 RDS 端点填成主机,再填上端口、用户和数据库。在“经由”字段里,选中你刚保存的那个 AWS SSM 连接,而不是直接连接。配置到这里就结束了:端点依旧是私有的,安全组依旧关着。
AgentsRoom 打开会话
当你打开这个连接时,AgentsRoom 会向操作系统要一个空闲的回环端口,然后用 AWS-StartPortForwardingSessionToRemoteHost 文档启动 aws ssm start-session,把 RDS 端点作为 host 传入,把数据库端口作为 portNumber 传入,把预留下来的端口作为 localPortNumber 传入。它会一直等到那个端口真的接受 TCP 连接,才宣布隧道就绪,所以客户端绝不会连得太早。
自己查,或者让智能体去查
SQL 控制台连到 127.0.0.1 上那个转发端口,用起来和其他任何连接没有区别:schema 浏览器、每次一条语句、有上限的结果集。AI 编程智能体可以经由 MCP 查询同一个连接,只读,而且始终拿不到密码。关闭连接时,会话进程也会随之被结束。
AgentsRoom 启动的那条命令
这里没有什么专有协议,也没有任何东西被用 JavaScript 重新实现一遍。AgentsRoom 把 AWS CLI 作为子进程启动,参数直接传入而不经过 shell,然后读取它的输出。如果你曾经手动开过一条端口转发会话,这就是你早已认得的那一行。
aws ssm start-session \
--target i-0a1b2c3d4e5f \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters host=acme-prod.abc123.eu-west-1.rds.amazonaws.com,\
portNumber=3306,localPortNumber=54321 \
--profile acme-prod --region eu-west-1实例 ID、端点、区域和配置文件都来自你保存的那个连接。本地端口则在打开时由操作系统挑选。
转发到受管节点本身、而不是它后面的某个数据库时,用的是同一个文档,只是带上 host=localhost。这也是为什么同一种连接类型既能覆盖私有子网里的数据库,也能覆盖跑在你所连那台实例上的服务。
它跑起来之前,有哪些条件必须成立
AgentsRoom 驱动你既有的 AWS 配置,而不是取代它。有五件事必须就位,而这五件事和单独使用 Session Manager 时所需要的完全一样。
你机器上的 AWS CLI
AgentsRoom 直接调用 aws 可执行文件。只要 aws ssm start-session 在你的终端里能用,在这里就能用。
session-manager-plugin 插件
Session Manager 需要把它的插件装在 CLI 旁边。缺了它,会话会立刻退出,而 AgentsRoom 会把 CLI 打印出来的错误直接给你看,而不是一直卡着。
一个可用的 AWS 配置文件或 SSO 登录
授权来自你自己的凭据,通过 --profile 和 --region 传入。AgentsRoom 保存的是配置文件名和区域,从不保存密钥,也从不保存任何机密。
VPC 里的一个受管节点
一台已在 Systems Manager 中注册、正在运行 SSM Agent、并带有允许该会话的实例配置文件的 EC2 实例。流量正是从这个节点穿过,而它自己不需要开放任何入站端口。
从节点通往数据库的一条通路
数据库的安全组必须在数据库端口上接受来自该节点的流量,你的 IAM 策略也必须允许对那个文档执行 ssm:StartSession。VPC 的其他部分都不需要改动。
这条隧道做什么,又拒绝做什么
决定这套配置留在一台笔记本上是否安全的,正是这些特性。
仅限回环
转发出来的端口只绑定在 127.0.0.1 上,别的哪儿都不绑。用这种方式访问的数据库,绝不会被重新发布到局域网上,所以咖啡馆的 Wi-Fi 不会把你的笔记本变成一个通往生产环境的开放代理。
由操作系统挑选的端口
AgentsRoom 向操作系统要一个空闲端口,再把它交给会话。没有固定端口可供猜测,不用提前预留,也不会和你正在跑的其他东西撞车。
说就绪,就是真的就绪
只有当本地端口真的接受 TCP 连接时,隧道才算建好;如果它始终不接受,隧道就带着 CLI 打印出来的错误放弃。没有随手加的等待时间,也不会出现客户端连上一个还没在监听的端口。
这一跳既不用密钥,也不用密码
SSM 会话由你的 AWS 配置文件或 SSO 会话授权。AgentsRoom 保存的是实例 ID、配置文件名和区域,任何读到这份配置的人都拿不到可以拿去重放的东西。
数据库始终保持只读
数据库连接建出来就是只读的。一次写入既需要把那个具体的连接改成可写,也需要一次明确确认,而被标记为生产环境的连接会在这次确认里把这件事说在明处。
每次调用一条语句
每次调用只带一条语句,所以分号后面藏不下任何东西;结果集也设有上限,一条范围过宽的查询淹不了窗口,也淹不了智能体的上下文。
为什么这是更少的访问权限,而不是更多
隧道听起来像是开了一个口子,这种本能反应没错:访问私有数据库的大多数办法确实会扩大攻击面。而这一种把它收窄了。数据库那侧什么都没打开,VPC 里任何地方都没有新建入站端口,受管节点也不需要自己跑一个 SSH 监听。流量是从节点向外发往 Systems Manager 服务的,而你的机器在那里与它会合。
授权仍然留在你的组织早已管理它的地方。会话由你的 AWS 身份授予,走的是机器上已经配置好的配置文件或 SSO 登录,这意味着它会像其他任何 Session Manager 会话一样被记录在案,在那个身份被吊销的当天一并失效,并由 IAM 策略划定范围,而不是由谁碰巧拿着一把密钥来决定。AgentsRoom 保存的是实例 ID、配置文件名和区域:这些没有一样是凭据。
在数据库那侧,护栏和每个 AgentsRoom 连接拿到的完全一样。默认只读,每次调用一条语句,结果集有上限,还有一个会让写入确认变严的生产环境标记。经由 MCP 查询的 AI 智能体拿到的是一份结果集,永远不是密码;而无论那个连接允许人类做什么,它用来查询的那个工具都只接受读,别的一律拒绝。
只有 MySQL 和 MariaDB,PostgreSQL 不在其中
这个数据库客户端讲的是 MySQL 通信协议,所以能用的引擎是 MySQL 和 MariaDB。落到 RDS 上,就是 RDS for MySQL、RDS for MariaDB 以及兼容 MySQL 的 Aurora 版本。RDS for PostgreSQL 和 Aurora PostgreSQL 不受支持,SQL Server、Oracle、MongoDB 和 SQLite 同样不受支持。这件事你应该在下载之前就知道,而不是下载之后。
SSM 这层传输本身与引擎无关,因为它转发的只是一个 TCP 端口。PostgreSQL 缺的是它上面的那个客户端,而不是下面的这条隧道。下一个支持哪个引擎由大家提的需求决定,所以如果少了你要的那个,在公开待办清单上说一声,它就会被计进去。
申请你要的数据库引擎智能体也能查询它,只读
连接一旦存在,AI 编程智能体就能经由 AgentsRoom MCP 指名使用它。db_list 返回已保存的连接及其元数据,db_schema 不用写一行 SQL 就能逐层遍历 schema、表和列,db_query 执行一条语句并返回有上限的数据行,db_connection_new 则通过预先填好一份由你审核并保存的表单,来提议一个还没保存的数据库。
智能体提出请求时,SSM 会话由 AgentsRoom 自己打开,所以智能体从不经手 AWS 凭据、数据库密码或端口号。回传的是一份结果集。无论连接允许什么,db_query 都是只读的,而这条规则长在桌面应用里,不在 MCP 进程里,所以哪怕智能体被劝着去要别的东西,它依然成立。
把这件事做对,意义正在于此。一个对着私有子网里的生产环境副本排查问题的智能体,读到了能解释这个 bug 的那些数据行,却没有任何途径去改动它们,没有任何凭据会泄进它的上下文,应用一关,它也再够不着那个数据库。
常见问题
我怎么连接一个没有公网端点的 RDS 实例?
经由一条 AWS SSM 端口转发会话。先保存一个指向能够到数据库的受管 EC2 节点的 AWS SSM 连接,然后创建 MySQL 或 MariaDB 连接,把 RDS 端点填成主机,并在“经由”字段里选中那个 SSM 连接。AgentsRoom 会用 aws ssm start-session 打开会话,并把 SQL 客户端连到转发出来的那个回环端口上。数据库依旧没有公网端点,它的安全组也丝毫未动。
AgentsRoom 用的是哪个 SSM 文档?
AWS-StartPortForwardingSessionToRemoteHost,其中 host 设为数据库端点,portNumber 设为数据库端口,localPortNumber 设为在你机器上预留的那个回环端口。这个文档经由受管节点转发到第三方主机,而私有子网里的 RDS 实例正是这种情况。要转发到节点本身,用的是同一个文档,只是带上 host=localhost。
我还需要一台堡垒机吗?
不需要。在这个场景里,Session Manager 取代了跳板机:受管节点既不需要入站 SSH 端口,也不需要公网 IP,流量是从节点向外发往 Systems Manager 服务的,而你的机器从外部加入这条会话。没有密钥清单要维护,也没有公有子网要盯着。
我的机器上需要装些什么?
AWS CLI 和 session-manager-plugin,外加一个可用的 AWS 配置文件或 SSO 登录。AgentsRoom 直接调用 aws 可执行文件,所以只要 aws ssm start-session 在你的终端里能用,在这里就能用。如果缺了这个插件,会话会立刻退出,而 AgentsRoom 会把 CLI 打印出来的错误给你看,而不是卡在一个你看不见的提示上。
AgentsRoom 会为此保存一个 AWS 密钥吗?
不会。会话由你机器上早已配置好的 AWS 凭据授权,通过 --profile 和 --region 传给 CLI。AgentsRoom 保存的是实例 ID、配置文件名和区域,这些都不是凭据。数据库密码是另一回事:它存在保险库里,由你的操作系统钥匙串加密,而且绝不会返回给 AI 智能体。
这条隧道用的是哪个本地端口,谁又能访问到它?
操作系统会在打开时挑一个空闲端口,隧道只把它绑定到 127.0.0.1。局域网上的任何东西都够不着它,也没有固定端口可供猜测。只有当那个端口真的接受 TCP 连接时,隧道才算就绪,而它会随着连接一起关闭。
这套方案对 RDS for PostgreSQL 也管用吗?
不管用。这个数据库客户端只支持 MySQL 和 MariaDB,落到 RDS 上就是 RDS for MySQL、RDS for MariaDB 以及兼容 MySQL 的 Aurora 版本。RDS for PostgreSQL 和 Aurora PostgreSQL 目前不受支持,SQL Server、Oracle、MongoDB 和 SQLite 同样不受支持。SSM 隧道本身转发的只是一个 TCP 端口,并不关心引擎:缺的是它上面的那个客户端。到公开待办清单上说出你要的引擎,它就会被计进去。
我能转发到 EC2 实例本身,而不是某个数据库吗?
可以。用的是同一个文档,只是带上 host=localhost,所以在受管节点上监听的服务也能用同样的方式访问。同一个 AWS SSM 连接还能在那台实例上打开一个普通的终端会话,这正是你在一台完全没有入站 SSH 端口的机器上运行智能体 CLI 的办法。
AI 智能体能经由这条隧道查询数据库吗?
能,只读。智能体经由 AgentsRoom MCP 指名一个已保存的连接,由应用打开 SSM 会话并自己执行语句,回传的只有结果集。智能体从不会拿到 AWS 配置文件、端点凭据或数据库密码,而且无论那个连接允许人类做什么,db_query 都只接受读,别的一律拒绝。
你可能还喜欢
数据库连接
保存你的 MySQL 和 MariaDB 连接,通过 SSH 隧道或 AWS SSM 会话访问私有子网里的数据库,让你的 AI 智能体经由 MCP 查询它。默认只读,每次调用一条语句,结果集有上限,密码永远到不了智能体手里。
SSH 连接
保存你的 SSH 连接,通过 SSH 打开内置终端,直接在远程服务器或 VPS 上运行 Claude Code、Codex 或 Antigravity CLI。支持 SSH 密钥或密码认证,按项目管理连接配置,无需额外的 SSH 客户端。
密钥管理器
把 API 密钥、令牌和密码存进操作系统钥匙串,在开发命令和智能体环境里用 {{secret:NAME}} 引用,交给 AgentsRoom 在启动时解析。智能体只看得到名称,看不到值,任何内容都不会同步到服务器。
远程舰队
在您拥有的每台Mac上运行Claude、Codex和Antigravity编码代理,并邀请团队成员实时协作同一代理。办公室计算机、家庭计算机、构建服务器、共享团队项目:所有内容都在一个统一的、端到端加密的视图中。
查询那个谁都够不着的数据库
下载 AgentsRoom,保存一个 AWS SSM 连接,把一个 MySQL 或 MariaDB 数据库指向它,然后在不用堡垒机、不用 VPN、也不用共享密码的情况下查询你的私有 RDS 实例。
配套应用:随时随地监控你的 Agent
使用 Claude、Codex、Antigravity CLI 或其他 AI 提供商。
把 Bug 和需求直接发送到您的公开待办清单。
AgentsRoom 实际运行一瞥。