iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
IT Operation

從前後端踏上 AWS 雲端架構勇者之路系列 第 18 篇

用 DBeaver 經過 EC2,連進私有 RDS

  • 分享至 

  • xImage
  •  

上一篇我們聊到,會員、訂單這些資料,可以交給 RDS 來存

而且資料庫不用開放給外面的人連,放在 Private Subnet 就好,讓網站的後端程式去查資料

但這時候問題來了:「洧杰,那我自己要怎麼進去看資料?我的電腦也在外面啊?」

總不能為了自己方便,就把資料庫又開回公網吧 XD

所以今天就借用前面開好的 EC2,讓它幫我們轉送連線。自己電腦上的 DBeaver → EC2 → 私有 RDS

今天的連線路線:自己的 DBeaver 經 SSH TCP 22 連到 EC2,再由 EC2 轉送到私有 RDS 的 TCP 5432

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 修改出站規則

接著開一台 PostgreSQL 資料庫

進 RDS → Databases → Create database。選 PostgreSQL、Full configuration、Dev/Test,畫面可以對照下面這張

建立 RDS:選 PostgreSQL、Full configuration 與 Dev/Test

Full configuration 是讓我們自己選規格和網路,舊版畫面叫 Standard create。今天要把資料庫放在指定的私有子網路,所以用這個模式逐項確認

來開始快快樂樂開 RDS 資料庫嘍 :D

往下找到 Availability and durability,選最右邊的 Single-AZ DB instance deployment(1 instance)

部署方式:這次選最右邊的 Single-AZ,一台 DB 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

規格欄位:選 Burstable classes,再選 db.t4g.micro

往下 Storage type 選 gp3,Allocated storage 填 20 GiB。這是配置給資料庫的空間,不是只有存進去的資料才算費用

儲存設定:gp3、20 GiB;IOPS 與 throughput 保持預設

再展開 Additional storage configuration,取消 Enable storage autoscaling

取消 Enable storage autoscaling,這次練習不自動增加儲存空間

這個功能會在空間不足時自動加大容量。正式網站可以搭配上限與監控來用;我們這次只測連線,先固定 20 GiB,不需要自動往上加

上面三張是同一台練習 DB 的規格修改畫面,建立時找相同欄位就好~

資料庫要放內網,這裡記得選 No

到了 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

Public access 選 No,VPC security group 選 Choose existing

No 的意思是不替這台 DB 配公有 IP。我們透過同一個 VPC 裡的 EC2 連進去,不需要把資料庫開到公網

設定資料庫名稱

在 Database authentication 選 Password authentication,再展開 Additional configuration,找到 Initial database name,填入 demo

剩下幾個設定也一起確認:

  • Encryption 保持開啟,使用 AWS 管理的 aws/rds 金鑰
  • Backup retention period 選 3 天,讓 RDS 保留這段期間的自動備份
  • 監控選 Database Insights Standard,這次不加 Enhanced Monitoring、RDS Proxy 或進階付費監控
  • 不啟用 RDS Extended Support;使用還在標準支援期的版本
  • Deletion protection 先不勾,這台練習 DB 做完要刪掉。正式資料庫則要另外規劃刪除保護與備份

來看看整體費用

這是當次東京區域、micro、20 GiB 的畫面估算,持續開一個月約 US$21.01

AWS 建立畫面的月費估算:DB instance 18.25 美元、Storage 2.76 美元,合計 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 來連線試試看嘍

AWS 準備好了,換自己的電腦連進去

開啟 DBeaver,按 Database → New Database Connection,搜尋 PostgreSQL,選一般的 PostgreSQL,再按 Next

DBeaver 新增連線:搜尋 PostgreSQL,選一般 PostgreSQL 驅動

接下來會看到不少分頁,但先抓這三個就好:Main 填資料庫、SSH 填跳板 EC2、SSL 設定資料庫連線加密

我把它們整理成一張圖,等等填到一半忘記自己在連誰,就回來看這張

DBeaver 設定對照:Main 填 RDS,SSH 填 EC2 與私鑰,SSL 勾選使用 SSL 並選 require,CA 留空

Main:我最後要連到哪個資料庫?

這頁填的是 RDS。雖然中間會經過 EC2,但我們最後要登入的是資料庫,所以 Host 放剛剛複製的 Endpoint

欄位 填什麼
Connect by Host
Host 剛才複製的 RDS Endpoint
Port 5432
Database demo
Authentication Database Native
Username postgres
Password 建立 RDS 時設定的密碼

Main 頁實際欄位示例:Host 換成自己的 RDS Endpoint,Port 5432、Database demo、Username postgres

SSH:那要請哪台 EC2 幫忙?

剛剛填好目的地,但自己的電腦在 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 私鑰

SSH 認證欄位:Ubuntu 主機填 ubuntu,Authentication Method 選 Public Key

選 Public Key 後,下方會出現 Private Key 欄位,按旁邊的檔案按鈕,選這台 EC2 對應的 .pem

先按 Test tunnel configuration。成功代表電腦進得去 EC2,接著還要測 RDS。第一次跳出主機指紋確認時,核對是自己的 EC2,保留主機驗證~

SSL:讓資料庫連線加密

切到 SSL,勾選 使用 SSL,SSL mode 選 require;CA Certificate、Client Certificate、Client Private Key 都留空,SSL Factory 維持預設

SSL 實際設定:勾選使用 SSL、SSL mode 選 require,CA 與 Client 憑證欄位留空

require 會要求資料庫連線加密,但不檢查伺服器憑證與主機名稱,所以這次 CA Certificate 留空。不用另外下載 AWS CA 檔案

那 SSH 的 .pem 也可以拿掉嗎?

不行,它們用途不同。 SSH 的 .pem 是你登入 EC2 的私鑰

AWS CA 檔案是拿來檢查資料庫憑證。這次只有 SSL 的 CA 欄位留空,SSH 私鑰仍然要選

重頭戲來啦!用一行 SQL,看看有沒有真的通

按 Test Connection/測試連線。第一次若要求下載 PostgreSQL Driver,就依提示下載,這是 DBeaver 連 PostgreSQL 需要的驅動程式

看到下面這種 Connected,才是整條連線測試成功

既有實測畫面:Test Connection 顯示 Connected 與 PostgreSQL 版本

按 OK 關掉測試結果,再按 Finish/OK 儲存連線,名稱可以取 demo-rds。接著在左邊對這條連線按右鍵,開啟 SQL Editor → New SQL Script,貼上:

SELECT 1;

按 Execute SQL statement,下方結果出現 1,就表示 DBeaver 已經透過 EC2 連上 RDS,資料庫也有回應這次查詢

既有實測畫面:SQL 編輯器執行 SELECT 1,下方結果顯示 1

有看到 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

關掉 DBeaver,只是自己的電腦斷線,AWS 上的資料庫還在運作哩

如果這台 DB 就是今天新建的練習用資料庫,裡面沒有要保留的資料,記下設定後就清掉:

  1. 回到 RDS → Databases,確認選的是 demo-private-db,按 Actions → Delete
  2. 若開了 Deletion protection,先 Modify 關閉並套用,再回來刪除
  3. 只有確認不需要任何資料時,才取消 Create final snapshot 與 Retain automated backups,依畫面確認刪除
  4. 等刪除完成,再檢查 Snapshots 與 Retained automated backups,移除這次練習留下且不需要的備份;其他 DB 的不要動
  5. 回 EC2,把跳板 Stop。原本的 VPC、子網路、SG 先留著,後面繼續用

有正式資料時,得先完成備份與還原確認,再決定是否刪除,不能直接照這次練習取消備份,這裡也附上(RDS 刪除說明)

最後要提醒,RDS 只按 Stop,儲存仍會收費,而且停止滿 7 天會自動啟動;EC2 Stop 後,EBS 和保留的 Elastic IP 也可能繼續計費。所以「全部關機」不等於帳單歸零哩

回到一開始的問題:資料庫放在內網,我們還是能管理它,不需要為了方便就開放公網連線

今天是自己電腦的 DBeaver,透過 EC2 連到 RDS。之後網站部署到 EC2,才換成後端程式去查會員和訂單

下一篇來看 SES。會員報名成功後,網站要怎麼寄通知信給他?我們下篇見勒 :D


上一篇
會員資料與訂單放哪裡?來認識 RDS~
系列文
從前後端踏上 AWS 雲端架構勇者之路 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言