你的 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 實際執行一瞥。