經由 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 驅動開發
提示詞庫
技能庫
檢視所有功能