Day 26 - 雲端串接實戰:Node.js 成功連上 AWS RDS!
前情提要
Day 24,我們已經成功開啟 EC2,並在上面部署了第一版的 Node.js Express App。
Day 25,我們建立了 RDS 資料庫並成功測試連線。
今天,我們要來完成最關鍵的一步 ——
讓 EC2 上的應用程式正式連上 RDS,打造完整的雲端架構!
前置作業:關閉 RDS 公開存取權限,提高安全性
進入 RDS 儀表板 → 點擊右上角「修改」 →
下滑到「連線」區塊 → 將「可公開存取」改為 No → 儲存修改。

💡 昨天為了用 DBeaver 測試,我們暫時開啟了公開存取。
不過長期而言,這樣的設定會帶來極大的安全風險!
為什麼關閉「公開存取」能提升安全性?
1. 阻擋所有「外部網際網路」的流量
當你設定 Public access = No 時,RDS 僅會分配 私有 IP,
外部網路無法直接抵達它。
即使你的 Security Group 開得再寬(像 0.0.0.0/0),
外部世界也完全 ping 不到。
這能有效防止:
- 自動化掃描(masscan、nmap)
- 惡意登入爆破(如 PostgreSQL 密碼暴力破解)
- 被搜尋引擎(例如 Shodan)暴露
換句話說,它在「網路層」上就被隔離了!
2. 所有資料庫存取都需走「內部網路」
當 RDS 僅有私有 IP,能連線的主機僅限於:
- 同一個 VPC 內的 EC2
- 或透過 VPN 進來的內部節點
這樣,你能明確控制「誰」能夠存取資料庫,
將環境從「開放世界」轉變為「封閉社區」。
步驟 1:更新 EC2 上的專案版本
SSH 登入 EC2:

在 EC2 執行以下指令:
1 | # 1. 進入專案資料夾 |
步驟 2:設定環境變數
建立 .env:
1 | nano .env |
輸入內容如下:
1 | # RDS 資料庫設定 |
儲存離開:Ctrl + X → Y → Enter
步驟 3:測試 RDS 連線
1 | sudo apt update |
輸入密碼後若成功進入 psql 介面,代表連線順利 🎉

輸入 \q 可退出。
步驟 4:執行資料庫 Migration
1 | # 查看 migration 檔案 |

⚠️ 踩坑紀錄:Migration 成功,但 App 啟動失敗!
我原本滿心期待啟動應用程式,
結果一跑 node dist/app.js,瞬間炸裂:

心想:「為何?Migration 都成功了,怎麼跑不動?」
問題分析
這是 TypeORM 常見陷阱之一:
migration:run是由typeorm-ts-node-commonjs執行,可直接讀.ts- 但
node dist/app.js僅能執行.js
—— TypeORM 嘗試載入.tsmigration,自然報錯。
也就是說:
開發環境能吃 TS,但佈署環境只能吃 JS。
✅ 解決方案
在 db.ts 調整 migrations 路徑設定:
1 | migrations: process.env.NODE_ENV === "production" |
步驟 5:重新部署與驗證
1 | # 拉取修改後程式碼 |


接著重新啟動:
1 | node dist/app.js |

成功連線 🎉
步驟 6:用 PM2 正式啟動
1 | pm2 start ithome-app |
應看到:
1 | 📦 DB Connected! |
步驟 7:全面驗證
7.1 從瀏覽器測試

7.2 Postman 測試主要 API
註冊:

登入:

新增 Todo:

7.3 檢查資料庫內容
1 | # 在 EC2 上連接到 RDS |

測試成功 🎉
結語
這一天,我們正式打通了 Node.js 應用 + AWS RDS 資料庫 的雲端實戰串接!
這次的流程看似繁瑣,
但我們一步步實作並理解了:
- 為何要關閉 Public Access
- 如何讓 EC2 連上 RDS
- TypeORM 在生產環境常見的
.ts/.js落差問題
在雲端部署世界裡,每一次錯誤都是最珍貴的學習歷程。
下一篇,我們將進一步探索 AWS 的另一個明星服務 — S3(Simple Storage Service)。
它是許多應用的「檔案中樞」,可以安全地存放圖片、影片、PDF、甚至備份資料。
參考資源
commit :
fix: 🐛 update migrations config to support .js in production an
修正 TypeORM migration 設定,讓 production 使用 .js、開發使用 .ts