前面我們把圖片放到 S3,也知道怎麼讓別人讀到圖片了
那如果今天要做一個課程報名網站,課程封面有地方放了,但會員買了哪些課、訂單付錢了沒,這些又要記在哪裡?
這就接到今天的資料庫哩。我們會用 AWS 的 RDS,讓 AWS 幫忙建立和維護資料庫
先看網站完成後的全貌圖,今天看橘色的 「EC2 後端程式 → RDS」 這一段
例如會員點開「我的訂單」,後端會先確認他是誰,再去資料庫查他的訂單,查完才把結果回傳給前端
假設 alex 買了一門課,我們會需要記下「這張訂單是 alex 的」,之後才能查出他買過什麼
這裡會用 PostgreSQL,一套關聯式資料庫。它能夠把資料整理成資料表,一列是一筆資料,欄位則用來記姓名、編號、付款狀態等內容
例如會員跟訂單,可以分成這兩張表:
| 資料表 | 記錄哪些內容 | 一筆範例 |
|---|---|---|
會員 users |
會員編號、姓名 | id = 7、name = alex |
訂單 orders |
訂單編號、會員編號、付款狀態 | id = 101、user_id = 7、status = paid |
訂單裡的 user_id = 7,就對應到會員編號 7,也就是 alex。paid 則表示這張訂單已付款
接著用 SQL,也就是操作資料庫的語法,就能指定「我要查會員 7 已付款的訂單」,或是把某張訂單改成已付款
那把訂單存成 JSON,放到 S3 可以嗎?
檔案存得進去,但怎麼查出 alex 的訂單、兩個人同時改資料時怎麼處理,還得另外設計。對這種一直新增、查詢、修改的資料,交給資料庫處理比較正規
確實已經有 EC2 主機,你也可以自己在上面安裝 PostgreSQL
但接著就得想,誰來更新系統?每天的資料誰來備份?真的出問題時,備份拿得回來嗎?
網站還在開發,光寫功能就有得忙了,這些維護工作也得有人顧
所以 AWS 提供了 RDS。建立時選好 PostgreSQL,再設定規格、儲存空間和網路,AWS 就會幫你準備好執行資料庫的環境,在介面上叫 DB instance
你會看到一個選項叫 Database engine(資料庫引擎),就是問這次要用哪套資料庫軟體
PostgreSQL 是我們要用的資料庫軟體,RDS 幫忙處理它的安裝和維護
主流來說還是會將兩個服務拆開會比較適合~
我們可以用這張表來看:
| 要做的事 | EC2 自架 PostgreSQL | 使用 RDS PostgreSQL |
|---|---|---|
| 安裝資料庫、更新作業系統 | 自己處理 | AWS 處理 |
| 升級資料庫版本 | 自己安排、執行 | 用 RDS 的升級功能,程式要自己先測過 |
| 自動備份 | 自己安排怎麼備份、存在哪 | 啟用 RDS 自動備份,設定要保留幾天 |
| 設計資料表、寫查詢、設定誰能讀寫 | 自己處理 | 一樣要自己處理 |
例如 PostgreSQL 升級後,你原本的程式還能不能正常跑,這就得自己先測過,再安排升級時間。不能看到有新版本就直接升上去,也附上(RDS 版本升級說明)
備份也一樣,RDS 可以幫忙備份,但要留幾天、真的能不能還原出需要的資料,還是要自己設定和確認
RDS 資料庫開著就會計算運作時間,還要算配置的儲存空間。備份用量、資料傳輸等也可能另外收費,費用項目可以看 RDS PostgreSQL 定價
而且 把 EC2 關機,RDS 不會跟著停。它們是兩個分開的資源,別只關了網站主機,就以為全部都關好了 XD
那把 RDS 也 Stop 呢?
停止期間還是有儲存等費用,而且 DB instance 停止滿 7 天會自動啟動。所以如果練習做完、資料也不需要了,就要處理資源清除,不能只按 Stop 然後放著不管。也附上(RDS 停止與費用說明)
這部分下篇實作結束時,也會一起帶讀者共同做一遍~
回頭看第一張圖,會員是透過網站操作,真正連到資料庫的是後端程式
所以我們可以把 RDS 放在 Private Subnet,讓 EC2 從 VPC 內部連過去,資料庫不用直接接受網際網路上的連線,附上(AWS 的 EC2 與私有 RDS 範例)
但如果網站還沒寫好,我只是想先打開資料表看看呢?
這時就可以用 DBeaver,裝在自己電腦上的資料庫工具。連線後可以看資料表,也能執行 SQL 來新增、查詢資料
不過,RDS 放在內網,自己家裡的電腦沒有直接通往它的連線,這時怎麼辦勒?
我們可以讓 EC2 當 SSH 跳板:DBeaver 先透過 SSH 連到 EC2,再由 EC2 把連線轉送到 RDS,路線就像下面這張圖
這時 EC2 的工作就是轉送連線,所以 不用先放後端程式,也不用在 EC2 安裝 PostgreSQL。DBeaver 在自己的電腦,資料庫則在 RDS
前面學的 SG 也派上用場了!EC2 的 SSH 只允許自己目前的公有 IP /32;RDS 的 TCP 5432 則只允許使用指定 EC2 SG 的主機連進來
EC2 自己的出站規則,也要允許它連到 RDS。網路能通之後,SSH 和資料庫各自需要的登入驗證,也都要通過才行
所以這兩張圖的用途就不一樣了:第一張是會員用網站,後端幫他查資料
第二張是我們用 DBeaver,自己進去管理資料~
下一篇先來跑第二張圖:會搭配前面幾天用到的網路架構設施,再建立私有的 RDS PostgreSQL,用 DBeaver 經過 EC2 連進去,來新增一筆資料,我們下篇見勒 :D