上一篇我們聊到,會員、訂單這些資料,可以交給 RDS 來存
而且資料庫不用開放給外面的人連,放在 Private Subnet 就好,讓網站的後端程式去查資料
但這時候問題來了:「洧杰,那我自己要怎麼進去看資料?我的電腦也在外面啊?」
總不能為了自己方便,就把資料庫又開回公網吧 XD
所以今天就借用前面開好的 EC2,讓它幫我們轉送連線。自己電腦上的 DBeaver → EC2 → 私有 RDS
DBeaver 是裝在自己電腦上的資料庫工具,等等我們會用它連進 RDS,執行一行 SQL,確認資料庫有回應
那 EC2 要先裝什麼程式嗎?
這次先不用。EC2 只幫忙轉送連線,不用裝 Node.js,也不用裝 PostgreSQL。PostgreSQL 已經由 RDS 執行,
這篇沿用前面已經能 SSH 登入的 Ubuntu EC2、同一個 VPC,以及那台主機的 .pem 私鑰。自己的電腦先安裝 DBeaver Community,我們接著從 AWS 這邊開始做~
先看圖右邊,RDS 要放進 Private Subnet,而且 EC2 要有辦法連到它。所以我們先把 AWS 裡的網路準備好,等等 DBeaver 才有地方可以連
到 VPC → Subnets,確認同一個 VPC 裡有兩個不同 AZ 的 Private Subnet,例如 ap-northeast-1a 與 ap-northeast-1c
如果前面只建了一個,就補另一個:Create subnet → 選同一個 VPC → 選另一個 AZ → 填未使用、且不與現有子網路重疊的 CIDR。例如 VPC 是 10.0.0.0/16,而 10.0.253.0/24 還沒用過,才可以拿來用
建好後,到子網路的 Route table → Edit route table association,選原本的私有路由表。這次兩個子網路都只需要 VPC 的 local 路由,不需要新增 NAT Gateway,也不用開啟自動分配公有 IPv4
再到 Your VPCs → 選 VPC → Actions → Edit VPC settings,確認 DNS resolution、DNS hostnames 都已開啟,等等才好用 RDS 的主機名稱連線
接著進 RDS → Subnet groups → Create DB subnet group:
| 欄位 | 這次填什麼 |
|---|---|
| Name | demo-db-subnets |
| Description | Private subnets for demo database |
| VPC | EC2 所在的 VPC |
| Availability Zones/Subnets | 剛才兩個不同 AZ 的 Private Subnet |
把兩個子網路加入清單後建立。這個 group 就是一份子網路清單,它告訴 RDS:「你可以從這幾個地方挑一個放資料庫」
你可能會想,我只想開一台資料庫,為啥要選兩個地方?
因為 RDS 要求這份清單跨至少兩個 AZ,讓它有可用的部署位置。不過要提醒可選的位置有兩個,不代表我們要開兩台;等等選 Single-AZ,仍然只會部署一台資料庫
回到 VPC → Security groups。這裡用 web-sg 代表 EC2 正在使用的 SG,db-sg 代表資料庫的 SG,實際請選自己的
如果還沒有資料庫的 SG,就按 Create security group 建立 db-sg,VPC 選和 EC2 相同的那個,再設定下面的 Inbound rules
| 改哪個 SG | 類型/Port | Source 填誰 |
|---|---|---|
EC2 的 web-sg |
SSH/TCP 22 | 自己目前的公有 IP /32,可用 My IP 帶入 |
RDS 的 db-sg |
PostgreSQL/TCP 5432 | EC2 使用的 web-sg,選它的 SG ID |
這裡把兩段拆開看,就比較不會填錯
自己的電腦先連 EC2,所以 SSH 22 的來源填自己目前上網的 IP;/32 就是只指定這一個 IPv4 位址,換網路後 IP 變了,這裡也要更新
接著是 EC2 去連 RDS,所以 RDS 的 5432 來源填 EC2 的 SG,不是家裡的 IP。我們人在家,但送到 RDS 的這段連線,已經是從 EC2 過去的了
如果同一個 web-sg 還掛在別台 EC2,那些主機也會符合這條來源規則,不是只認某一台 EC2
EC2 的 Outbound rules 也要能連到 RDS 的 TCP 5432。如果之前保留預設的全部出站,已經包含這段;若有縮限,就補目的地為 db-sg 的 TCP 5432。資料庫允許 EC2 進來,不會順便幫 EC2 修改出站規則
進 RDS → Databases → Create database。選 PostgreSQL、Full configuration、Dev/Test,畫面可以對照下面這張
Full configuration 是讓我們自己選規格和網路,舊版畫面叫 Standard create。今天要把資料庫放在指定的私有子網路,所以用這個模式逐項確認
往下找到 Availability and durability,選最右邊的 Single-AZ DB instance deployment(1 instance)

左邊另外兩種選項,會多部署資料庫來處理備援等需求。假設報名網站已經上線,資料庫壞掉時,希望服務能盡快恢復,就得評估這些設計
但今天先練連線,用一台就好,費用也比較好控制
接著填名稱與帳密:
| 欄位 | 這次的範例 |
|---|---|
| Engine version | PostgreSQL 17,選畫面提供且仍在標準支援期的次版本 |
| DB instance identifier | demo-private-db |
| Master username | postgres |
| Credentials management | Self managed |
| Master password | 自己設定,保存到密碼管理工具 |
demo-private-db 是讓你在 AWS 清單上辨認這台 DB 的名稱;postgres 和密碼,則是等等 DBeaver 登入資料庫要用的
這次選 Self managed,先自己保存資料庫密碼~
在 DB instance class 選 Burstable classes → db.t4g.micro
往下 Storage type 選 gp3,Allocated storage 填 20 GiB。這是配置給資料庫的空間,不是只有存進去的資料才算費用
再展開 Additional storage configuration,取消 Enable storage autoscaling
這個功能會在空間不足時自動加大容量。正式網站可以搭配上限與監控來用;我們這次只測連線,先固定 20 GiB,不需要自動往上加
上面三張是同一台練習 DB 的規格修改畫面,建立時找相同欄位就好~
到了 Connectivity,先選 Don't connect to an EC2 compute resource
看到 Don't connect,你可能會想:「欸,不是才說要用 EC2 連過去?」
這個選項是在問,要不要讓建立精靈自動幫你配 EC2 連線。我們剛剛已經自己準備好網路和 SG,所以這裡自己選,不代表 EC2 不能連
| 欄位 | 選什麼 |
|---|---|
| VPC | EC2 所在的 VPC |
| DB subnet group | 剛才建立的 demo-db-subnets |
| Public access/Publicly accessible | No |
| VPC security group | Choose existing,選自己的 db-sg,移除不需要的預設 SG |
| Database port | 5432 |
No 的意思是不替這台 DB 配公有 IP。我們透過同一個 VPC 裡的 EC2 連進去,不需要把資料庫開到公網
在 Database authentication 選 Password authentication,再展開 Additional configuration,找到 Initial database name,填入 demo
剩下幾個設定也一起確認:
aws/rds 金鑰這是當次東京區域、micro、20 GiB 的畫面估算,持續開一個月約 US$21.01
EC2、EBS、公有 IPv4,以及額外備份、流量、CPU 超額點數,都可能另外計費。等一下測完會清掉 DB(RDS 價格、公有 IPv4 價格)
核對 Single-AZ、micro、20 GiB、Public access No、自己的 db-sg、Initial database name = demo,再按 Create database
等狀態從 Creating 變成 Available,點進 demo-private-db 的 Connectivity & security。假使先看到程式碼,切到 Endpoints,展開 Additional configurations,確認 Publicly accessible = No,再複製 Endpoint
它會長得像 demo-private-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com。實際請複製自己的
這是主機名稱,所以不用加 https://,也不要把 :5432 一起貼進 Host
Available 代表資料庫準備好了,至於我們的電腦能不能連,就來用本地的 DBeaver 來連線試試看嘍
開啟 DBeaver,按 Database → New Database Connection,搜尋 PostgreSQL,選一般的 PostgreSQL,再按 Next
接下來會看到不少分頁,但先抓這三個就好:Main 填資料庫、SSH 填跳板 EC2、SSL 設定資料庫連線加密
我把它們整理成一張圖,等等填到一半忘記自己在連誰,就回來看這張
這頁填的是 RDS。雖然中間會經過 EC2,但我們最後要登入的是資料庫,所以 Host 放剛剛複製的 Endpoint
| 欄位 | 填什麼 |
|---|---|
| Connect by | Host |
| Host | 剛才複製的 RDS Endpoint |
| Port | 5432 |
| Database | demo |
| Authentication | Database Native |
| Username | postgres |
| Password | 建立 RDS 時設定的密碼 |
剛剛填好目的地,但自己的電腦在 VPC 外面,還沒辦法直接到 RDS。這頁就是補上中間那台跳板
切到 SSH,勾選 Use SSH Tunnel/使用 SSH 通道。如果沒看到頁籤,可從 Network configurations 的 + 加入 SSH
| 欄位 | 填什麼 |
|---|---|
| Host/IP | EC2 現在的公有 IP |
| Port | 22 |
| User Name | ubuntu,這次沿用 Ubuntu 主機 |
| Authentication Method | Public Key |
| Private Key | 建立這台 EC2 時下載的 .pem 私鑰 |
選 Public Key 後,下方會出現 Private Key 欄位,按旁邊的檔案按鈕,選這台 EC2 對應的 .pem
先按 Test tunnel configuration。成功代表電腦進得去 EC2,接著還要測 RDS。第一次跳出主機指紋確認時,核對是自己的 EC2,保留主機驗證~
切到 SSL,勾選 使用 SSL,SSL mode 選 require;CA Certificate、Client Certificate、Client Private Key 都留空,SSL Factory 維持預設
require 會要求資料庫連線加密,但不檢查伺服器憑證與主機名稱,所以這次 CA Certificate 留空。不用另外下載 AWS CA 檔案
那 SSH 的 .pem 也可以拿掉嗎?
不行,它們用途不同。 SSH 的 .pem 是你登入 EC2 的私鑰
AWS CA 檔案是拿來檢查資料庫憑證。這次只有 SSL 的 CA 欄位留空,SSH 私鑰仍然要選
按 Test Connection/測試連線。第一次若要求下載 PostgreSQL Driver,就依提示下載,這是 DBeaver 連 PostgreSQL 需要的驅動程式
看到下面這種 Connected,才是整條連線測試成功
按 OK 關掉測試結果,再按 Finish/OK 儲存連線,名稱可以取 demo-rds。接著在左邊對這條連線按右鍵,開啟 SQL Editor → New SQL Script,貼上:
SELECT 1;
按 Execute SQL statement,下方結果出現 1,就表示 DBeaver 已經透過 EC2 連上 RDS,資料庫也有回應這次查詢
有看到 1 就恭喜你,跑完整趟歷程嘍!
這行只是請資料庫回傳一個數字,沒有新增資料表,也沒有寫入會員或訂單
先用最簡單的查詢確認這條路通了,之後後端程式連不上,才有一個已經成功過的設定可以拿來對照
如果沒成功,先看卡在哪一段:
| 看到什麼 | 先檢查哪裡 |
|---|---|
| SSH timeout | EC2 有沒有開、目前公有 IP、SSH 22 的 My IP 是否已改變 |
| SSH authentication failed | 是否使用 ubuntu、是否選到這台 EC2 對應的私鑰 |
| SSH 成功,但資料庫連線 timeout | RDS 是否 Available、Endpoint、5432 的來源 SG、EC2 出站與 VPC 路由 |
| Password authentication failed | Main 裡的資料庫帳號密碼,不是 SSH 那頁 |
| database does not exist | 是否填了 demo,建立 RDS 時是否漏掉 Initial database name |
| 憑證或 SSL 錯誤 | SSL mode 是否為 require、CA 是否留空,Driver properties 是否殘留其他 SSL 設定 |
漏建 demo 的話,可以先把 Main 的 Database 改成 PostgreSQL 內建的 postgres
關掉 DBeaver,只是自己的電腦斷線,AWS 上的資料庫還在運作哩
如果這台 DB 就是今天新建的練習用資料庫,裡面沒有要保留的資料,記下設定後就清掉:
demo-private-db,按 Actions → Delete
有正式資料時,得先完成備份與還原確認,再決定是否刪除,不能直接照這次練習取消備份,這裡也附上(RDS 刪除說明)
最後要提醒,RDS 只按 Stop,儲存仍會收費,而且停止滿 7 天會自動啟動;EC2 Stop 後,EBS 和保留的 Elastic IP 也可能繼續計費。所以「全部關機」不等於帳單歸零哩
回到一開始的問題:資料庫放在內網,我們還是能管理它,不需要為了方便就開放公網連線
今天是自己電腦的 DBeaver,透過 EC2 連到 RDS。之後網站部署到 EC2,才換成後端程式去查會員和訂單
下一篇來看 SES。會員報名成功後,網站要怎麼寄通知信給他?我們下篇見勒 :D