经由 AWS SSM 访问 RDS

你的 RDS 实例没有公网端点。
经由 AWS SSM 够到它,不用堡垒机。

AgentsRoom 打开一条通往你数据库的 AWS Session Manager 端口转发会话,并让自己的 SQL 客户端从中穿过。这条会话用 AWS-StartPortForwardingSessionToRemoteHost 文档执行 aws ssm start-session,由你机器上早已配置好的 AWS 配置文件授权。

数据库继续待在它的私有子网里,安全组继续保持关闭,也没有任何新东西被暴露到公网上。变了的只有一点:你终于能查询它了,AI 编程智能体也能,以只读方式。

SSM 端口转发
无公网端点
AgentsRoom
127.0.0.1:由操作系统挑选的端口
aws ssm start-session
AWS-StartPortForwardingSessionToRemoteHost
受管节点i-0a1b2c3d4e5f
RDS MySQL
私有子网:3306
预留一个空闲的回环端口
仅限回环,绝不落到局域网上没有入站 SSH,没有公网端点

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 实例到一份结果集

四个步骤,做一次就够,之后就是一次点击的事。

01

保存一个 AWS SSM 连接

在连接管理器里新增一个连接,把它的传输方式设为 AWS SSM。你给它一个能够到数据库的受管 EC2 节点的实例 ID(i-0123456789abcdef0)、你的 AWS 配置文件和区域。这里没有密码字段,也没有密钥字段,因为会话由你机器上已有的 AWS 凭据授权。

02

添加数据库,并让它经由那个连接接入

新增一个 MySQL 或 MariaDB 连接,把 RDS 端点填成主机,再填上端口、用户和数据库。在“经由”字段里,选中你刚保存的那个 AWS SSM 连接,而不是直接连接。配置到这里就结束了:端点依旧是私有的,安全组依旧关着。

03

AgentsRoom 打开会话

当你打开这个连接时,AgentsRoom 会向操作系统要一个空闲的回环端口,然后用 AWS-StartPortForwardingSessionToRemoteHost 文档启动 aws ssm start-session,把 RDS 端点作为 host 传入,把数据库端口作为 portNumber 传入,把预留下来的端口作为 localPortNumber 传入。它会一直等到那个端口真的接受 TCP 连接,才宣布隧道就绪,所以客户端绝不会连得太早。

04

自己查,或者让智能体去查

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 智能体 + 私有数据库

智能体也能查询它,只读

db_listdb_schemadb_querydb_connection_new

连接一旦存在,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 都只接受读,别的一律拒绝。

你可能还喜欢

查询那个谁都够不着的数据库

下载 AgentsRoom,保存一个 AWS SSM 连接,把一个 MySQL 或 MariaDB 数据库指向它,然后在不用堡垒机、不用 VPN、也不用共享密码的情况下查询你的私有 RDS 实例。

免费下载

配套应用:随时随地监控你的 Agent

使用 Claude、Codex、Antigravity CLI 或其他 AI 提供商。

获取扩展
Chrome Web Store

把 Bug 和需求直接发送到您的公开待办清单。

AgentsRoom 实际运行一瞥。

多项目管理
多供应商
多代理运行
实时状态
文件差异与提交
移动应用
实时预览
代理团队
浏览器自动化
Backlog 驱动开发
提示词库
技能库
查看所有功能