Amazon RDS:是什麼、怎麼配置、怎麼使用
寫給耀達 Lite 雲端進銷存(2026-11-02)。接續 db-upgrade-path.html、postgres-design-sql.html。
內容以 RDS for PostgreSQL、東京區域、db.t4g.micro 起步為前提(Jesse 2026-11-02 已定)。除了這個起點,文件裡標 Claude 的看法 的都還沒拍板。
這份文件的內容來自 AWS 官方文件與價目表,沒有在真的 RDS 上跑過。指令旗標已對過 AWS CLI 參考文件,但指令本身沒有執行過,主控台畫面也沒有實際打開。價格是東京隨選價(價目表 2026-10-29 發布),美元、未稅,一個月算 730 小時。
1. 先講結論
- RDS 是 AWS 代管的關聯式資料庫。AWS 顧機器、作業系統、備份機制和故障切換;Jesse 顧資料表、SQL、規格和「多久該升級」。沒有主機可以登入,也拿不到真正的 superuser。
- 建立一台要準備六樣東西:VPC 與子網路群組、安全群組、參數群組、版本、密碼、備份與維護時段。大多建好後還能改,但加密、主帳號名稱不能直接改,要在第一次就做對。
- 第一階段的 RDS 相關費用約每月 23 美元(第 16 節,含假設)。這不包含 ALB、Fargate 和超過 CPU 基準的費用。
- 程式不要用主帳號連線,要用自己的受限角色。這也是 RLS 能生效的前提(第 7 節)。
查文件時才發現、最需要注意的六件事
| 陷阱 | 會發生什麼事 | 怎麼避開 |
|---|---|---|
| Extended Support 預設開啟 | 版本過了標準支援期還沒升級,會自動開始收費。t4g.micro 約每月 175 美元,將近主機費的 10 倍 |
現在選支援期長的版本,並設好提醒和帳單告警(第 10 節) |
| 主控台的 Production 範本 | 會預選雙可用區域和 io1 儲存,費用遠超過預期 | 不要選這個範本,每一欄逐項核對(第 5 節) |
| 用 API 或 CLI 建立時的預設值比較不安全 | 不加密、沒有刪除保護;沒指定子網路群組或指定 default 時,預設可以從外部存取 |
照第 17 節的範本,全部明確寫出來 |
| Npgsql 預設不驗證憑證 | 預設 SSL Mode=Prefer。連線可能有加密,卻不確認對方是不是真的 RDS |
連線字串用 SSL Mode=VerifyFull(第 8 節) |
| RDS 代管主帳號密碼有兩個限制 | 開著的時候不能建立讀取副本,也不支援 Blue/Green 部署 | 需要時先關掉再做,關閉不會停機(第 7 節) |
BYPASSRLS 在 RDS 上可能設不了 未查證 |
第 5 題原本規劃的後台帳號要用它。PostgreSQL 規定非 superuser 必須自己有這個屬性才能給別人,而 AWS 文件列出的主帳號屬性裡沒有它 | 第一台建好後先測(第 7 節),不行就用候選做法 |
2. RDS 是什麼、誰負責什麼
RDS 全名是 Amazon Relational Database Service。可以把它想成:AWS 替你租一台裝好資料庫的主機,並派人顧著,但鑰匙不給你。你拿到的是一個連線位址,用一般的 PostgreSQL 工具連上去就能用。
RDS 支援 PostgreSQL、MySQL、MariaDB、SQL Server、Oracle、Db2。我們用的 RDS for PostgreSQL 跑的是 PostgreSQL 引擎,所以 RLS、複合外鍵、set_config 這些 postgres-design-sql.html 談的行為照樣適用。C# 這邊一樣用 Npgsql 連線。
| 工作 | AWS 做 | Jesse 做 |
|---|---|---|
| 主機與磁碟 | 準備、壞了更換 | 選規格、選儲存量 |
| 作業系統與資料庫修補 | 提供更新,在維護時段套用 | 選維護時段;大版本要自己決定何時升 |
| 備份 | 每天做快照,每 5 分鐘上傳交易記錄 | 選保留天數、定期演練還原 |
| 故障切換 | 開了雙可用區域就自動切換 | 決定要不要開;程式要能重試 |
| 防火牆 | 提供安全群組 | 寫規則 |
| 帳號與權限 | 建立主帳號 | 建立角色、設計權限與 RLS |
| 效能 | 提供指標與分析工具 | 索引、SQL、設告警、判斷何時升級 |
| 資料正確性 | — | 全部由程式與資料庫設計負責 |
代價:有些事情做不到
- 不能登入主機:沒有 SSH,不能自己裝軟體或直接改
postgresql.conf、pg_hba.conf。設定改由參數群組管理。 - 沒有真正的 superuser:主帳號是
NOSUPERUSER,權限來自rds_superuser角色。真正有權限的rdsadmin是 AWS 內部用的。 - 擴充套件只能用 AWS 支援的:用
SHOW rds.extensions;查。pg_trgm、pgcrypto、uuid-ossp、citext都列在「有CREATE權限就能裝」的清單裡。 - 規格是一格一格的:沒有自動變大,換規格會有中斷(第 13 節)。
主帳號可以做什麼
建立角色與資料庫、安裝擴充套件、把物件改給別的擁有者、查看所有連線(pg_stat_activity),並用 pg_terminate_backend 中止連線、重設 pg_stat_statements 的統計。
3. 零件地圖
| 零件 | 白話 | 關鍵事實 |
|---|---|---|
| DB 執行個體 | 那一台資料庫主機 | 一個區域內的名稱不能重複;一台裡可以有多個資料庫 |
| 規格(instance class) | 主機大小 | db.t4g.micro 是 2 vCPU、1 GiB,Graviton2 可突發機型 |
| 端點(endpoint) | 連線用的網域名稱 | 底下的 IP 可能改變,所以程式一律用名稱,不用 IP |
| VPC 與子網路群組 | 把主機放在哪個網路 | 子網路群組應涵蓋至少兩個可用區域,就算現在是單機也一樣 |
| 安全群組 | 防火牆規則 | 預設完全不開放,要自己寫規則 |
| 參數群組 | 取代 postgresql.conf | 預設群組不能改,要建自己的(第 9 節) |
| 選項群組 | 附加功能設定 | 用預設即可 |
| 自動備份 | 每天的快照加交易記錄 | 可以還原到保留期內的任一時間點,刪除主機時預設一起刪 |
| 手動快照 | 自己拍的備份 | 刪除主機也不會消失,要自己刪 |
4. 第一次建立的順序
Claude 的看法:這個順序的重點是先把會被引用的東西建好。參數群組和安全群組如果建立後才補,就要多重開一次或多改一次。
- 確認帳號:確認公司帳號的方案(免費或付費,第 16 節),先設好帳單告警。
- 查東京有哪些版本:確認
db.t4g.micro能跑要用的版本(第 10 節)。 - 規劃網路:在 Express Mode 服務要用的 VPC 裡,準備兩個可用區域的私有子網路,建立 DB 子網路群組(第 6 節)。
- 建立資料庫的安全群組:先不放任何規則,等容器的安全群組出現後再加。
- 建立自訂參數群組:設定慢查詢記錄等參數(第 9 節)。
- 建立執行個體:照第 5 節逐欄填,或用第 17 節的指令。
- 連上去做初始設定:建立角色,測試
BYPASSRLS,安裝pg_stat_statements(第 7 節)。 - 跑資料庫遷移:用
migration_owner建立資料表和 RLS。 - 接上程式:把連線字串放進 Secrets Manager,安全群組加入容器來源(第 6、8 節)。
- 設告警和事件通知:門檻屬於第 8 題,但指標和通知管道要先通(第 14 節)。
- 演練一輪再開放使用:還原到某個時間點、換一次規格、確認程式能自動重新連上(第 12、18 節)。
5. 建立時每個欄位怎麼填
主控台要選 Standard create,不要選 Easy create。Easy create 只問引擎、大小和名稱,其他全用預設。範本也要注意:文件寫 Production 範本會預選雙可用區域、io1 儲存和刪除保護,這對第一階段太貴。選其他範本後逐欄核對下表。範本的實際選項這次沒有打開主控台確認,文件也寫選項會依版本不同。
「能改嗎」是指建立後還能不能改、會不會停機,來自 AWS 的修改設定表。建議值都是 Claude 的看法。
| 欄位(CLI 旗標) | 沒指定時 | 建議填 | 為什麼 | 能改嗎 |
|---|---|---|---|---|
| 引擎與名稱 | ||||
引擎--engine | 必填 | postgres | 第 3 題已定 | 不適用 |
版本--engine-version | 引擎預設版本 | 18 系列,明確指定小版本(待定,第 10 節) | 支援期最長,也是本機實測的版本 | 可以往上升,會停機;不能降 |
Extended Support--engine-lifecycle-support | 開啟 | 先用預設,加提醒和帳單告警 | 2031 年才會碰到,之後隨時可以改(第 10 節) | 可以,不停機,只能用 CLI/API 改 |
識別名稱--db-instance-identifier | 必填 | lite-prod | 會出現在端點裡。最多 63 字元,區域內不重複 | 可以改,但端點也會跟著變(未細查) |
| 帳號 | ||||
主帳號--master-username | 主控台是 postgres | lite_master | 1~16 個英數字或底線,字母開頭。只給人管理用,不給程式用 | 不能改 |
主帳號密碼--manage-master-user-password | 要選一種方式 | 交給 Secrets Manager 代管 | 每 7 天自動換,不用自己保管(第 7 節) | 可以,立即生效,不停機 |
驗證方式--enable-iam-database-authentication | 只用密碼 | 只用密碼 | IAM 驗證需要多 300~1,000 MiB 記憶體,1 GiB 的主機負擔太重 | 可以 |
| 規格與可用性 | ||||
規格--db-instance-class | 必填 | db.t4g.micro | 已定 | 可以,會停機 |
雙可用區域--multi-az、--no-multi-az | Production 範本會預選 | 單機(第一階段) | 費用約兩倍。開始收費時重新評估 | 可以,不停機,但可能影響效能 |
可用區域--availability-zone | 系統隨機選 | 不指定 | 文件建議用預設 | — |
| 儲存 | ||||
類型--storage-type | Production 範本是 io1 | gp3 | 基準 3,000 IOPS 內不另收費。AWS 的文件也標它為建議選項 | 可以 |
大小--allocated-storage | 必填 | 20(GiB) | gp3 的最小值。費用按配置量算 | 可以加、不能減;不停機,但效能可能下降 |
自動擴充上限--max-allocated-storage | 主控台預設 1,000 GiB | 100 | 上限就是帳單的上限。100 GiB 約每月 13.80 美元 | 可以,不停機 |
加密--storage-encrypted | API 預設不加密 | 開啟,用 AWS 代管金鑰 | 第一天就要開;之後要轉換得走快照還原 | 不能直接開或關;金鑰也不能換 |
| 網路 | ||||
VPC、子網路群組--db-subnet-group-name | 預設 VPC | 自己的 DB 子網路群組 | 只放私有子網路,等於多一道鎖(第 6 節) | 換 VPC 很麻煩,要一次做對 |
公開存取--no-publicly-accessible | 沒指定或用 default 群組時為開啟 | 關閉 | 資料庫不該有公開位址 | 可以,不停機 |
安全群組--vpc-security-group-ids | 主控台 Create new 會加入本機 IP | 自己建的資料庫安全群組 | 只放 5432 與明確來源 | 可以,不停機 |
連接埠--port | 5432 | 預設 | 沒有更換的理由 | 可以,會中斷連線(未細查) |
憑證機構--ca-certificate-identifier | rds-ca-rsa2048-g1 | 預設 | 支援自動輪替伺服器憑證 | 可以 |
| RDS Proxy | 不建立 | 不建立(待第 7 題) | 第一版的看法是不用,要跟 RLS 的做法一起測過 | 之後可以加 |
| 資料庫設定 | ||||
初始資料庫--db-name | postgres | lite | 別把資料放在系統預設的庫裡 | 可以自己再建立 |
參數群組--db-parameter-group-name | 預設群組(不能改內容) | 自訂群組 | 事先建好就不用多重開一次(第 9 節) | 換群組立即生效,但參數要重開才套用 |
| 選項群組 | 預設 | 預設 | — | 可以 |
| 備份 | ||||
保留天數--backup-retention-period | API 預設 1,主控台預設 7 | 暫用 7,第 9 題定案 | 絕對不要設 0:不能還原到時間點,大版本升級也不會自動拍快照 | 可以;從 0 改成非 0 或反過來會停機 |
備份時段--preferred-backup-window | 隨機 | 18:00-18:30(台灣 02:00) | 時間是 UTC。假設店家凌晨沒營業 | 可以,不停機 |
| 跨區域備份 | 關閉 | 關閉(第 9 題可再談) | 另外收費;只有整個東京區域出事才用得到 | 可以 |
複製標籤到快照--copy-tags-to-snapshot | 關閉 | 開啟 | 日後才查得出快照的費用屬於誰 | 可以 |
| 監控 | ||||
Database Insights--database-insights-mode | Standard | Standard | 保留 7 天不另收費(第 14 節) | 可以,不停機 |
Enhanced Monitoring--monitoring-interval | 0(關閉) | 先關閉 | 按 CloudWatch Logs 計費,需要查作業系統問題時再開 | 可以,不停機 |
記錄檔匯出--enable-cloudwatch-logs-exports | 不匯出 | postgresql、upgrade | RDS 上的記錄檔預設只留 3 天。匯出量大時要注意費用 | 可以,不停機 |
| 維護與保護 | ||||
自動小版本升級--auto-minor-version-upgrade | 開啟 | 開啟 | 一個人維運,安全修補交給 AWS。搬 Aurora 前要特別確認版本(第 10 節) | 可以,不停機 |
維護時段--preferred-maintenance-window | 隨機 | sun:19:00-sun:19:30(台灣週一 03:00) | 時間是 UTC,不能跟備份時段重疊。假設週一凌晨最冷清 | 可以,但有陷阱(第 13 節) |
刪除保護--deletion-protection | API 預設關閉 | 開啟 | 防止誤刪。要刪得先改設定 | 可以,不停機 |
6. 網路:誰連得到資料庫
6.1 兩道鎖
- 沒有公開位址:
Public access = No,主機只有 VPC 內的私有 IP。 - 子網路群組只放私有子網路:文件寫,要公開存取時,子網路群組裡所有子網路都必須是公開的。只放私有子網路,等於有人誤按也開不起來。
- 安全群組只收指定來源:入站規則用「連接埠 5432,來源是容器的安全群組」,不寫 IP 範圍。
資料庫安全群組的入站規則
類型 連接埠 來源
PostgreSQL 5432 容器的服務安全群組 sg-xxxx
PostgreSQL 5432 通道端點的安全群組 sg-yyyy(只有 Jesse 要連時才需要)
出站規則:文件說通常不影響資料庫,除非資料庫主動往外連
6.2 跟 Fargate 的連接
- 主控台的「連接 EC2」選項用不上:它只替 EC2 自動設定網路。Fargate 要手動設定。
- 要在同一個 VPC:跨 VPC 要再設對等連線。Express Mode 沒指定子網路時會用預設 VPC 的公開子網路,所以 RDS 要放在哪個 VPC,要跟第 7 題一起決定。
- 安全群組來源:Express Mode 預設會自己建立服務安全群組。把它設為資料庫安全群組的來源,或者建立服務時指定自己的安全群組。
- 每個子網路要留 IP:文件要求每個子網路至少保留一個位址給 RDS 復原使用。
6.3 Jesse 自己要怎麼連進去
資料庫沒有公開位址,所以從公司或家裡的電腦不能直接連。可選的方式:
| 方式 | 怎麼運作 | 費用 | 好處 | 代價 |
|---|---|---|---|---|
| A. EC2 Instance Connect 端點 Claude 的看法:先試這個 |
在 VPC 建一個端點,本機用 AWS CLI 開通道到資料庫的私有 IP | 端點本身不收費;跨可用區域有資料傳輸費 | 不用維護主機,也不用開公開位址 | 每個端點最多 20 條連線、單次最長 1 小時。AWS 文件講的是連 EC2,連 RDS 的做法來自第三方文章,要實測。據這些文章,通道指令只接受 IP,要先查出資料庫 IP |
| B. 小型 EC2 跳板機 | 開一台很小的 EC2,透過 Session Manager 轉接連接埠,不開 SSH | 多一台 EC2 的費用(未查價) | 傳統做法,參考資料多,也能放 psql |
多一台主機要更新、要顧,跟「不顧主機」的前提相反 |
| C. 暫時開公開存取 | 改成公開存取,安全群組只放自己的 IP,用完再關 | 公開 IPv4 每小時 0.005 美元 | 不用多建東西,修改不會停機 | 子網路要全部是公開的,跟 6.1 的第二道鎖衝突;忘記關就有風險。不建議用在正式環境 |
| D. 進到執行中的容器 | 用 ECS Exec 進容器,再從裡面連資料庫 | 不另收費(未查) | 路徑已經存在 | 映像檔要裝 psql,不適合放進正式映像;只能下指令,不好接圖形工具。Express Mode 上能不能開沒查 |
| E. AWS Client VPN | 電腦加入 VPC 的網路 | 按端點和連線時數收費(未查價) | 體驗最接近在內網 | 一個人用太重,人多了再考慮 |
# 方式 A 的樣子(通道開著時視窗不能關)。第三方文章的做法,還沒實測
aws ec2-instance-connect open-tunnel `
--instance-connect-endpoint-id eice-xxxxxxxx `
--private-ip-address 10.0.x.x `
--remote-port 5432 `
--local-port 15432
# 另開一個視窗
psql "host=localhost port=15432 dbname=lite user=lite_master sslmode=require"
走通道時憑證名稱會對不上:連的是 localhost,憑證上卻是 RDS 的端點名稱,所以 verify-full 會失敗,這裡用 require。這是 Claude 依 TLS 規則推出來的,沒有實測。正式程式仍然要用 VerifyFull。
7. 帳號與密碼
7.1 角色怎麼分
角色名稱沿用 postgres-design-sql.html 第 3 節。主帳號只給人做管理,平常不用。
| 角色 | 誰用 | 權限重點 |
|---|---|---|
lite_master(主帳號) | Jesse 做管理工作 | rds_superuser。不放進程式設定 |
migration_owner | 資料庫遷移工具 | 擁有資料表。擁有者預設略過 RLS,所以每張表都要 FORCE ROW LEVEL SECURITY |
app_user | 店家用的程式 | 不是擁有者、沒有 BYPASSRLS,RLS 才會生效 |
backoffice | 後台客服、統計 | 要看到所有店家,做法見 7.2 |
-- 第一段:用主帳號連上 lite 資料庫後執行。密碼不要寫進指令碼或版本控制
CREATE ROLE migration_owner LOGIN PASSWORD '<從 Secrets Manager 取得>';
CREATE ROLE app_user LOGIN PASSWORD '<從 Secrets Manager 取得>';
GRANT CONNECT ON DATABASE lite TO migration_owner, app_user;
GRANT ALL ON SCHEMA public TO migration_owner;
GRANT USAGE ON SCHEMA public TO app_user;
-- 逾時設定見 postgres-design-sql.html 第 9 節
ALTER ROLE app_user SET statement_timeout = '15s';
ALTER ROLE app_user SET idle_in_transaction_session_timeout = '30s';
-- 第二段:改用 migration_owner 連線後執行
-- 之後 migration_owner 建立的表,自動開放給 app_user
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO app_user;
PostgreSQL 15 起一般角色不能在 public schema 建立物件,所以這裡明確授權。第二段用 migration_owner 本人執行:PostgreSQL 文件寫只能改自己或自己所屬角色的預設權限,而新物件只吃建立者當下這個角色的預設值,本人執行最不會出錯。這段 SQL 還沒有在 RDS 上跑過。
7.2 BYPASSRLS 可能設不了
這可能影響第 5 題的一個前提。第 5 題接受的代價裡寫了「後台要有一個權限很大的 BYPASSRLS 帳號」,但查文件時發現:
- PostgreSQL 官方文件:非 superuser 只有在自己具備
BYPASSRLS時,才能變更這個屬性。 - RDS 官方文件:列出的主帳號屬性是
LOGIN NOSUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION,沒有提到BYPASSRLS;rds_superuser能做的清單也沒有列它。 - 沒查到的:AWS 文件沒有明寫可以或不可以,搜尋也找不到可靠說法。RDS 可能有特別處理,所以現在不能斷定一定不行。
第一台建好後,先花一分鐘確認:
SELECT rolname, rolsuper, rolbypassrls FROM pg_roles
WHERE rolname IN (current_user, 'rds_superuser');
CREATE ROLE backoffice LOGIN BYPASSRLS; -- 失敗就代表要走候選做法
| 如果不行,候選做法 | 怎麼做 | 代價 |
|---|---|---|
| A. 另外寫給後台的政策 Claude 的看法:優先考慮 |
CREATE POLICY backoffice_all ON sales_order TO backoffice USING (true) WITH CHECK (true); |
每張表多一條政策,遷移工具要一起產生;漏寫時後台只會查不到,比較安全。標準 PostgreSQL 語法,但這次沒實測。查詢仍要經過 RLS 判斷,效能要另外確認 |
| B. 讓後台用擁有者身分 | 後台連 migration_owner,不開 FORCE |
不建議:擁有者能改表結構,而且沒開 FORCE 時,用它跑遷移或程式都會略過 RLS |
同樣要確認的是 pg_dump:它預設會關閉 row_security,沒有略過權限的帳號會直接報錯(postgres-design-sql.html 第 3 節)。第 9 題的「只還原一家店」用 --enable-row-security,不受影響。全庫邏輯備份要用哪個帳號,要實測。RDS 自己的快照不受影響。
7.3 密碼放哪裡
| 做法 | 怎麼運作 | 費用 | 適合 | 代價 |
|---|---|---|---|---|
| RDS 代管主帳號密碼 Claude 的看法:主帳號用這個 |
建立時勾選,RDS 把密碼放在 Secrets Manager,每 7 天換一次 | 每個祕密每月 0.40 美元,每 1 萬次呼叫 0.05 美元 | 主帳號 | 開著時不能建立讀取副本,也不支援 Blue/Green。刪除主機時祕密也一起刪 |
| 自己建立祕密 Claude 的看法:程式用這個 |
自己把角色密碼存進 Secrets Manager | 同上 | 程式用的角色 | 輪替要自己做。RDS 文件講的 7 天輪替不適用於這些角色 |
| IAM 驗證 | 用 IAM 身分換 15 分鐘有效的權杖,不存密碼 | 不另收費(未細查) | 記憶體較大的主機 | 文件要求多留 300~1,000 MiB 記憶體,t4g.micro 總共才 1 GiB,不適合 |
| 寫死在設定檔 | 放進映像檔或版本控制 | 免費 | 都不適合 | 洩漏後很難收拾,不要這樣做 |
代管密碼的兩個限制,會撞到之後的升級路線。
- 需要建立副本或用 Blue/Green 時:先把代管關掉、改用自己設的密碼,做完再開。文件寫開關代管立即生效、不停機。
- 搬到 Aurora:
db-upgrade-path.html第 6 節的「Aurora 唯讀副本」是否也算在這個限制內,未查證。搬遷前先查,保險的做法是一樣先關掉。
7.4 容器怎麼拿到密碼
ECS 任務定義的 secrets 可以把祕密內容放進環境變數。ASP.NET Core 會把環境變數 ConnectionStrings__Main 讀成 ConnectionStrings:Main。
{
"containerDefinitions": [{
"secrets": [{
"name": "ConnectionStrings__Main",
"valueFrom": "arn:aws:secretsmanager:ap-northeast-1:<帳號>:secret:lite/prod/app-AbCdEf:connectionString::"
}]
}]
}
- 只在容器啟動時讀一次:祕密更新後,執行中的容器不會自動拿到新值,要重新部署。
- 所以程式不能用主帳號:主帳號密碼每 7 天換一次,容器裡的舊密碼過幾天就連不上新連線。
- 權限:任務執行角色要另外加讀取這個祕密的權限。
- Express Mode:這次看的 Express Mode 文件沒有提到祕密,但它接受用
taskDefinitionArn提供自己的任務定義,而任務定義可以寫secrets。實際要怎麼設,第 7 題建置時確認。 - 想不重新部署就換密碼:Npgsql 有
UsePeriodicPasswordProvider,可以定期取得新密碼,第一版應該用不到。
8. 連線加密與 Npgsql
8.1 兩邊要各設一半
| 設定 | 管什麼 | 預設 | 建議 |
|---|---|---|---|
伺服器 rds.force_ssl | 拒絕沒有加密的連線 | PostgreSQL 15 起是 1 | 維持 1 |
Npgsql SSL Mode | 要不要加密、要不要驗證對方 | Prefer:不驗證憑證 | VerifyFull |
Npgsql Root Certificate | 用哪個憑證機構來驗證 | 環境變數 PGSSLROOTCERT | 指到打包進映像檔的憑證檔 |
Npgsql 文件列出的六種模式裡,只有 VerifyFull 同時防竊聽和防假冒伺服器。rds.force_ssl=1 只保證有加密,不保證連到的是真的 RDS,兩者不能互相取代。
8.2 憑證檔
- 下載:
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem,AWS 文件列出的全區域憑證包。把它打包進映像檔。 - 伺服器憑證:預設的
rds-ca-rsa2048-g1由 RDS 在到期前自動輪替,不用自己換。 - 換憑證機構時:如果以後改用別的憑證機構,映像檔裡的憑證包要包含它。全區域憑證包已經收錄目前這幾個憑證機構。
8.3 連線字串
Host=lite-prod.xxxxxxxx.ap-northeast-1.rds.amazonaws.com;
Port=5432;
Database=lite;
Username=app_user;
Password=<從祕密取得>;
SSL Mode=VerifyFull;
Root Certificate=/app/certs/global-bundle.pem;
Maximum Pool Size=10;
Keepalive=30;
Application Name=lite-api
| 參數 | Npgsql 預設 | 這裡的值 | 為什麼 |
|---|---|---|---|
Maximum Pool Size | 100 | 10 | t4g.micro 連線上限約 112 條甚至更低,兩個容器用預設值就可能撞頂。Claude 的看法 |
Keepalive | 0(關閉) | 30 | 較快發現斷掉的連線。Claude 的看法,要配合 postgres-design-sql.html 第 13 節一起調 |
Timeout | 15 秒 | 預設 | 等待建立連線的時間 |
Command Timeout | 30 秒 | 預設 | 等待指令的時間。伺服器另有 statement_timeout |
Connection Idle Lifetime | 300 秒 | 預設 | 閒置多久後收回 |
Connection Lifetime | 3,600 秒 | 預設 | Npgsql 9.0 起才有這個預設。連線定期更新,有助於切換後回到新主機 |
8.4 程式要能面對斷線
- 一定會斷:換規格、維護、故障切換都會中斷連線,只差多久。
- 用端點名稱,不要用 IP:切換後 IP 會變。文件也提醒,如果用戶端會快取 DNS,TTL 要小於 30 秒。
- 寫入的重試要小心:連線錯誤可以重試,但沒有冪等保護的寫入重試可能重複開單。見
postgres-design-sql.html第 9 節。 - 要實際測過:文件也建議測試故障切換,確認程式能自動連回去。
9. 參數群組
參數群組就是 RDS 的 postgresql.conf。
| 規則 | 說明 |
|---|---|
| 預設群組不能改 | 要改任何參數,都要先建自己的群組 |
| 動態參數 | 改了立即生效,不用重開 |
| 靜態參數 | 要重開才生效。主控台會顯示 pending-reboot,RDS 不會替你重開 |
| 換群組 | 掛上新群組不會停機,但新群組的設定要手動重開才會套用 |
| 共用 | 改一個群組會影響所有使用它的主機 |
| 大版本要對應 | 群組屬於某個版本家族,例如 postgres18,升大版本時要準備新的 |
| 還原時不會帶過來 | 從備份還原出的新主機會掛預設群組,要重新指定 |
第一版要動的參數
Claude 的看法:能不改就不改。這張表的值都只是起始值。
| 參數 | 類型 | 起始值 | 為什麼 |
|---|---|---|---|
log_min_duration_statement | 動態 | 500(毫秒) | 記錄超過 0.5 秒的查詢,這是找慢查詢最便宜的方法。記錄內容可能含店家資料,所以門檻不要設成 0 |
log_lock_waits | 動態 | 1 | 記錄等鎖超過 deadlock_timeout 的情況,查庫存扣減卡住時用得到(類型請以主控台為準,未細查) |
shared_preload_libraries | 靜態 | 確認含 pg_stat_statements | 查 SQL 統計要用到。預設是否已包含,建好後用 SHOW shared_preload_libraries; 確認(未查證) |
rds.log_retention_period | — | 預設 4320(3 天) | 可以設 1~7 天。有匯出到 CloudWatch 就不用加大 |
不要動的參數
max_connections、shared_buffers:RDS 依記憶體自動計算。文件特別警告,設太高主機會開不起來。連線不夠時先調連線池。autovacuum:AWS 文件強烈建議保持開啟。關掉會導致資料表膨脹,甚至交易編號耗盡(postgres-design-sql.html第 11 節)。log_statement = all:記錄每一條 SQL,記錄檔費用會暴增,內容也可能含個資。只在短時間除錯時才開。timezone:Claude 的看法:維持 UTC,資料用timestamptz存,由程式轉成台灣時間。
逾時設定(statement_timeout 等)建議設在角色上,不要設在參數群組,這樣才不會影響遷移工具和備份,做法見第 7.1 節。
擴充套件
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SHOW rds.extensions; -- 這個版本可以裝哪些
SHOW rds.allowed_extensions; -- 預設 *,表示都能裝
10. 版本與升級
10.1 版本怎麼選
PostgreSQL 版本還沒拍板。查到的日期如下(RDS 發布行事曆):
| 大版本 | RDS 上架 | RDS 標準支援結束 | Extended Support 開始收費 | 最新小版本(RDS) |
|---|---|---|---|---|
| 18 | 2025-11-14 | 2031-02-28 | 2031-03-01 | 18.6 |
| 17 | 2024-11-14 | 2030-02-28 | 2030-03-01 | 17.11 |
| 16 | 2023-11-20 | 2029-02-28 | 2029-03-01 | 16.15 |
| 15 | 2023-02-27 | 2028-02-29 | 2028-03-01 | 15.19 |
| 14 | 2022-02-03 | 2027-02-28 | 2027-03-01 | 14.24 |
Claude 的看法:選 18。支援期最長,postgres-design-sql.html 的實測也是在 18.6 上跑的,Aurora 也已經有 18.6。除非下面的檢查不通過。
建立前要確認 db.t4g.micro 能跑 18。AWS 的規格支援表寫到 PostgreSQL 17,但這張表所有規格都沒有列 18,看起來是文件沒更新,不能當作不支援的證據。用下面這個指令才算數(只是查詢,不會收費):
aws rds describe-orderable-db-instance-options `
--engine postgres --engine-version 18.6 `
--db-instance-class db.t4g.micro --region ap-northeast-1 `
--query "OrderableDBInstanceOptions[].[EngineVersion,DBInstanceClass,StorageType]" --output table
如果沒有結果,就退到 17,並重新檢查 postgres-design-sql.html 裡依賴 PostgreSQL 18 的部分,因為那些實測都是在 18.6 上跑的。
10.2 小版本與大版本
| 小版本(18.4 → 18.6) | 大版本(17 → 18) | |
|---|---|---|
| 內容 | 向下相容的修正 | 可能不相容 |
| 誰啟動 | 開自動升級時由 AWS 在維護時段做 | 一定要手動 |
| 停機 | 文件寫可能幾分鐘,雙可用區域也一樣,兩台同時升級 | 同樣可能幾分鐘,依資料量而定 |
| 能退回嗎 | 不能原地退回 | 不能,只能從升級前的快照還原成新主機 |
| 備份 | — | 保留天數大於 0 時,RDS 自動在升級前後各拍一次快照 |
10.3 小版本和 Aurora 的時間差
RDS 的小版本文件寫社群發布後 7 天內上架,Aurora 是 3 個月內。舉例來說,18.6 在 RDS 是 2026-08-25,在 Aurora 是 2026-09-29,差 35 天。
搬到 Aurora 時,目標要是相同或更高的小版本(db-upgrade-path.html 第 6 節)。所以如果自動升級把 RDS 帶到 Aurora 還沒有的版本,就要等 Aurora 跟上才能搬。Claude 的看法:現階段安全修補比較重要,自動升級維持開啟,真的要搬的前一兩個月再暫時關掉。
10.4 Blue/Green 部署:把停機縮短的工具
RDS 複製一套「綠色」環境持續同步,先在綠色環境升級、測試,再切換過去。文件寫切換通常不到 1 分鐘。適合大版本升級。
- 費用:期間多一套環境,主機和儲存都要付(切換後舊環境也要記得刪)。
- 代管密碼不支援:要先關掉(第 7.3 節)。
- 限制:用邏輯複寫時,unlogged 資料表不會同步,期間不能建立新分割區,
pg_cron等擴充套件有限制。雙可用區域執行個體可以用,跨區域副本、雙可用區域叢集不行,CloudFormation 也不支援。 - Claude 的看法:店家還少的時候,直接在維護時段升級就好。有付費店家、不能接受幾分鐘中斷時再用。
10.5 Extended Support:最貴的隱藏費用
過了標準支援結束日還沒升大版本,RDS 不會馬上強制升級,而是自動轉進 Extended Support 並開始收費(前提是這個設定開著,而它預設就是開的)。
| 東京價格 | 單價 | t4g.micro 或 small 單機(2 vCPU) | 雙可用區域(估算) |
|---|---|---|---|
| 第 1、2 年 | 0.12 美元/vCPU/小時 | 每月約 175.20 | 每月約 350.40 |
| 第 3 年 | 0.24 美元/vCPU/小時 | 每月約 350.40 | 每月約 700.80 |
算法:2 vCPU × 730 小時 × 單價。文件寫備援主機也要收費,所以雙可用區域以兩倍估算。對照 t4g.micro 主機費每月 18.25 美元。
| 選擇 | 到期時會發生什麼 | 代價 |
|---|---|---|
| A. 保留預設,加提醒 Claude 的看法:推薦 |
沒升級就開始收費,服務不中斷 | 忘記就多付錢,要靠帳單告警和行事曆提醒。最壞情況是花錢,不是停機 |
B. 建立時就關掉open-source-rds-extended-support-disabled |
不收費,但 RDS 會自動升到下一個大版本 | 可能在不方便的時間點遇到不相容的升級,還會停機 |
選 A 的理由:18 版要到 2031 年才碰到,而且這個設定隨時可以改,文件寫立即生效、不停機,到時候再決定也不遲。真正要做的是在 2030 年排好大版本升級。
11. 儲存空間
| 事實 | 說明 |
|---|---|
| gp3 基準 | PostgreSQL 20~399 GiB:3,000 IOPS、125 MiB/s,不另外收費。400 GiB 起會拆成 4 個磁碟區,基準也會變高 |
| 費用 | 單機每 GB 每月 0.138 美元,按配置量算,不是按實際用量 |
| 只能加不能減 | 文件明寫不能縮小。想縮只能匯出到新主機 |
| 加大時 | 不會停機,但效能可能下降 |
| 磁碟滿了 | 主機離開 available 狀態,自動備份也會停止。這是要避免的情況 |
自動擴充
同時符合下面三點時才會擴充:
- 可用空間小於或等於配置量的 10%。
- 這個狀態持續至少 5 分鐘。
- 上一次儲存變更的最佳化已完成,而且過去 24 小時內少於 4 次變更。
每次至少加 10 GiB。也就是 20 GiB 的主機剩不到 2 GiB 時才會變 30 GiB,費用從每月 2.76 美元變 4.14 美元。
上限要自己壓低:主控台預設 1,000 GiB,等於每月最多 138 美元的儲存費。Claude 的看法:先設 100 GiB。文件要求上限至少比目前多 10%,並建議多 26% 以上,以免一直收到快到上限的通知。
資料不一定是磁碟變大的原因:WAL 累積、記錄檔、大量 UPDATE 留下的膨脹都會吃空間。DELETE 之後空間通常也不會還給磁碟。擴充前先查原因(postgres-design-sql.html 第 11 節)。
12. 備份與還原
這裡只講機制。保留天數、演練頻率和「只還原一家店」屬於第 9 題,這裡不定。
| 自動備份 | 手動快照 | |
|---|---|---|
| 何時產生 | 每天在備份時段,加每 5 分鐘的交易記錄 | 自己拍 |
| 能還原到 | 保留期內任一時間點 | 拍攝當下 |
| 保留 | 最多 35 天,到期自動刪 | 一直留到自己刪,每區域 100 份 |
| 刪除主機時 | 預設一起刪,可選擇保留 | 不受影響 |
| 範圍 | 都是整台主機,不能只備份單一資料庫,更不能只備份一家店 | |
- 資料最多掉多少:交易記錄每 5 分鐘上傳,所以最壞大約損失最後 5 分鐘的資料(只適用於主機和磁碟都救不回來的情況)。實際可還原時間看
LatestRestorableTime。 - 還原一定是建立新主機:這是最常被誤解的地方。沒有「蓋回原主機」這個按鈕,端點會變,所以程式要改連線字串。
- 備份費用:每個區域有等於「總配置儲存量」的免費額度。20 GiB 的主機有 20 GB 免費,超過的部分每 GB 每月 0.095 美元。
- 單機拍快照會影響效能:文件寫單機拍手動快照時,I/O 會暫停數秒到數分鐘,所以也要排在離峰。
- 主機不是
available時不會備份:例如磁碟滿了。監控要盯這個。 - 刪除主機時:要選是否拍最後快照、是否保留自動備份。留下來的都要繼續付費。
13. 維護與變更:什麼時候會停機
13.1 維護時段
- 每週 30 分鐘,時間用 UTC,不能跟備份時段重疊。沒指定就在該區域的 8 小時區間內隨機選一天。
- 時段只決定何時開始:文件明寫不保證在時段內結束,可能超時。
- 什麼時候要離線:必要的作業系統或資料庫修補,通常只有安全和可靠性相關,文件說大約每幾個月一次,很少用掉太多時段。
- 可延後嗎:
required的不能無限期延後;available的不會自動套用,要自己動手;next window的可以選 Defer upgrade 延後,但開始後就不能延了。 - 雙可用區域有差:作業系統修補通常會做一次不到 1 分鐘的切換;引擎升級時兩台同時不能用,沒有優勢。
13.2 改設定時的選擇
修改主機時有「立即套用」和「下個維護時段套用」兩種。有些設定不管怎麼選都立即生效。
| 變更 | 什麼時候生效 | 會停機嗎 |
|---|---|---|
| 換規格 | 立即或下個時段 | 會。時間文件沒有給 |
| 升級引擎版本 | 立即或下個時段 | 會 |
| 備份保留天數:0 ↔ 非 0 | 立即或下個時段 | 會 |
| 靜態參數 | 要手動重開 | 重開時會 |
| 開雙可用區域 | 立即或下個時段 | 不會,但可能影響效能 |
| 加大儲存 | 立即或下個時段 | 不會,但可能影響效能 |
| 備份保留天數:非 0 ↔ 非 0、備份時段 | 盡快 | 不會 |
| 安全群組 | 盡快 | 不會 |
| 公開存取、刪除保護、自動小版本升級、記錄檔匯出、Enhanced Monitoring、自動擴充上限 | 立即 | 不會 |
| 代管主帳號密碼開關 | 立即 | 不會 |
| 換參數群組(本身) | 立即 | 不會,但參數要重開才套用 |
| 憑證機構 | 立即或下個時段 | 引擎版本支援不重開輪替就不會 |
改維護時段的陷阱:如果有待處理、會停機的項目,而你把時段改成包含現在這個時間,那些項目會立即執行。改之前先看待處理清單(第 18 節)。
14. 監控與記錄檔
這裡只講有哪些工具和費用。告警門檻屬於第 8 題。
| 工具 | 看什麼 | 費用(東京) | 建議 |
|---|---|---|---|
| CloudWatch 指標 | CPU、記憶體、連線數、磁碟等主機層數字 | RDS 內建指標不另計(未逐項查);告警每個每月 0.10 美元 | 第一天就要 |
| Database Insights 標準版 | 資料庫負載,可以依等待類型、SQL、使用者切開看 | 保留 7 天不另收費 | 預設開著。東京有,PostgreSQL 沒有規格限制(MySQL、MariaDB 才排除 t4g.micro),建好後實際確認 |
| Database Insights 進階版 | 更長保留、更多分析 | 付費(這次沒查單價) | 第一階段不用 |
| Enhanced Monitoring | 作業系統層的行程、記憶體,最快每秒一次 | 走 CloudWatch Logs,間隔越短越貴 | 先關,查問題時再開 |
| 記錄檔匯出 | PostgreSQL 記錄檔、升級記錄 | 寫入每 GB 0.76 美元,保存每 GB 每月 0.033 美元 | 開,但不要開 log_statement = all |
| RDS 事件通知 | 故障切換、維護、儲存快到上限等事件 | 透過 SNS,費用這次沒查 | 第一天就要,寄到手機看得到的信箱 |
pg_stat_statements | 每種 SQL 的累計時間與次數 | 不另收費 | 第一天就要 |
第 8 題要談的指標
| 指標 | 回答什麼問題 |
|---|---|
CPUUtilization、CPUCreditBalance | CPU 夠不夠、點數快用完了嗎 |
CPUSurplusCreditsCharged | 有沒有因為超過基準而多付錢 |
FreeableMemory、SwapUsage | 記憶體夠不夠 |
ReadIOPS | 常用資料放得進記憶體嗎。文件說應該小而穩定 |
DatabaseConnections | 連線快到上限了嗎 |
FreeStorageSpace | 磁碟快滿了嗎 |
MaximumUsedTransactionIDs | 交易編號有沒有危險 |
ReplicaLag | 有讀取副本時,落後多少 |
舊文件寫的 Performance Insights,文件現在歸到 CloudWatch Database Insights 底下。主控台與 CLI 仍然看得到這個名稱。舊文件的字眼這次沒有改。
15. 高可用與讀取分流
「多一台主機」有三種,用途完全不同,很容易搞混:
| 雙可用區域執行個體 | 雙可用區域叢集 | 讀取副本 | |
|---|---|---|---|
| 解決什麼 | 主機或可用區域故障時自動接手 | 接手更快,還能讀 | 分擔查詢、報表 |
| 備援能讀嗎 | 不能 | 能 | 能,也只能讀 |
| 同步方式 | 同步 | 半同步 | 非同步,可能落後 |
t4g 能用嗎 | 能 | 不能。只支援 m6gd、r6gd 等機型 | 能 |
| 費用 | 主機和儲存約兩倍 | 三台,機型也貴 | 跟一般主機同價,同區域複寫不收傳輸費 |
| 接手時間 | 通常 60~120 秒(db-upgrade-path.html) | 更短,小版本升級約 35 秒 | 不會自動接手,要手動升格 |
| 在路線上的位置 | 第 3、4 階段 | 路線上沒有 | 報表拖慢開單時才加 |
- 不是備份:誤刪資料會立刻同步到備援和副本。救誤刪要靠第 12 節的還原。
- 讀取副本不會自動增減:要手動建立和刪除。
- 單機階段:主機或可用區域出事時沒有自動接手,這是第一階段接受的代價,開始收費時要重新評估(
db-upgrade-path.html第 9 節)。
16. 費用與費用陷阱
第一階段每月估算
| 項目 | 計算 | 美元/月 | 是不是假設 |
|---|---|---|---|
主機 db.t4g.micro 單機 | 0.025 × 730 | 18.25 | 隨選價 |
| 儲存 gp3 | 20 × 0.138 | 2.76 | 假設沒有觸發擴充 |
| 備份 | 20 GB 內免費 | 0.00 | 假設備份不超過 20 GB |
| Secrets Manager | 2 個祕密 × 0.40 | 0.80 | 假設主帳號和程式各一個;API 呼叫費很小 |
| 告警 | 5 個 × 0.10 | 0.50 | 假設 5 個,第 8 題會改 |
| 記錄檔 | 1 GB × (0.76 + 0.033) | 0.79 | 假設每月 1 GB,實際看慢查詢多寡 |
| 合計 | 約 23.10 | 不含資料傳輸、超過 CPU 基準的費用 |
這只是資料庫相關的部分。整套系統(ALB 粗估約 38 美元、Fargate、CloudFront)的月費還沒合起來算。
會讓帳單跳起來的事
| 情況 | 多多少 | 怎麼防 |
|---|---|---|
| 長期超過 CPU 基準 | 整月滿載約多 98.55 美元(db-upgrade-path.html 第 9.1 節) | 帳單告警、CPUSurplusCreditsCharged |
| 版本過期進入 Extended Support | 每月約 175.20 美元起 | 第 10.5 節 |
| 用了 Production 範本 | 雙可用區域加 io1,費用遠超預期(這次沒試算 io1) | 第 5 節 |
| 自動擴充上限太高 | 每 100 GB 多 13.80 美元 | 上限設 100 GiB |
| 刪了主機卻留著備份和快照 | 超過免費額度的部分持續計費。沒有主機時,免費額度也會變少 | 定期清查 |
| 測試主機忘記關 | 每台每月 18.25 美元起 | 測試主機用完就刪;停機最多 7 天就會自動開回來 |
| 開了公開 IP | 每個約每月 3.65 美元 | 維持私有 |
| Blue/Green 完成後留著舊環境 | 等於多一整套 | 驗收後刪除 |
log_statement = all | 每 GB 寫入 0.76 美元 | 只短暫開啟 |
停機能省多少
停止主機時不收主機費,但儲存和備份照收。文件寫連續停止 7 天後會自動開回來,所以長期不用的測試區不能只靠停機,要寫排程或直接刪除、需要時從快照還原。
免費額度
文件寫新帳號有 100 美元抵用金,完成活動最多再加 100 美元。免費方案最多 6 個月,而且部分服務不能用;付費方案超過抵用金後照常計費。公司帳號是不是新帳號、抵用金能不能折抵 RDS,未查證,所以上面的試算都沒有扣除。
17. 建立用的指令範本
AWS 帳號建好後才能跑。寫成 PowerShell,用反引號換行。這些指令沒有實際執行過,名稱、版本、子網路都是範例。第 4 段開始就會收費。
# 1. 參數群組
aws rds create-db-parameter-group `
--db-parameter-group-name lite-pg18 `
--db-parameter-group-family postgres18 `
--description "Lite PostgreSQL 18" `
--region ap-northeast-1
aws rds modify-db-parameter-group `
--db-parameter-group-name lite-pg18 `
--parameters "ParameterName=log_min_duration_statement,ParameterValue=500,ApplyMethod=immediate" `
--region ap-northeast-1
# 2. 子網路群組(兩個可用區域的私有子網路)
aws rds create-db-subnet-group `
--db-subnet-group-name lite-db-private `
--db-subnet-group-description "Lite DB private subnets" `
--subnet-ids subnet-aaaa subnet-bbbb `
--region ap-northeast-1
# 3. 資料庫的安全群組(先不放入站規則)
aws ec2 create-security-group `
--group-name lite-db `
--description "Lite database" `
--vpc-id vpc-xxxx `
--region ap-northeast-1
# 4. 建立執行個體
aws rds create-db-instance `
--db-instance-identifier lite-prod `
--engine postgres `
--engine-version 18.6 `
--db-instance-class db.t4g.micro `
--db-name lite `
--master-username lite_master `
--manage-master-user-password `
--storage-type gp3 `
--allocated-storage 20 `
--max-allocated-storage 100 `
--storage-encrypted `
--db-subnet-group-name lite-db-private `
--vpc-security-group-ids sg-dbxxxx `
--no-publicly-accessible `
--no-multi-az `
--db-parameter-group-name lite-pg18 `
--backup-retention-period 7 `
--preferred-backup-window 18:00-18:30 `
--preferred-maintenance-window sun:19:00-sun:19:30 `
--auto-minor-version-upgrade `
--deletion-protection `
--copy-tags-to-snapshot `
--database-insights-mode standard `
--enable-cloudwatch-logs-exports postgresql upgrade `
--region ap-northeast-1
# 5. 容器的安全群組出現後,再開放連線
aws ec2 authorize-security-group-ingress `
--group-id sg-dbxxxx `
--protocol tcp --port 5432 `
--source-group sg-containerxxxx `
--region ap-northeast-1
沒有寫 --engine-lifecycle-support,所以 Extended Support 用預設開啟(第 10.5 節)。備份 7 天只是暫定,第 9 題會改。
Claude 的看法:第一次可以用主控台熟悉,之後把這些設定寫進基礎架構程式碼(CloudFormation 或 Terraform)。這樣測試區和正式區才會一致,也能重建。要不要這樣做,留給第 7 題。
18. 日常操作速查
指令都省略了 --region ap-northeast-1。會停機的操作前面有標示。
| 我想要 | 做法 | 注意 |
|---|---|---|
| 查連線位址與狀態 | aws rds describe-db-instances --db-instance-identifier lite-prod | 看 Endpoint、DBInstanceStatus、PendingModifiedValues |
| 取得主帳號密碼 | 到 Secrets Manager 查 MasterUserSecret 指向的祕密 | 不要貼到聊天室或記事本 |
| 查待處理的維護 | aws rds describe-pending-maintenance-actions | 改維護時段前要先查 |
| 查最近的事件 | aws rds describe-events --source-identifier lite-prod --source-type db-instance | 出事時第一個看 |
| 停機:換規格 | aws rds modify-db-instance --db-instance-identifier lite-prod --db-instance-class db.t4g.small --apply-immediately | 拿掉 --apply-immediately 就等下個時段 |
| 加大儲存 | aws rds modify-db-instance --db-instance-identifier lite-prod --allocated-storage 30 --apply-immediately | 不能縮回去 |
| 開雙可用區域 | aws rds modify-db-instance --db-instance-identifier lite-prod --multi-az --apply-immediately | 排在離峰。費用約變兩倍 |
| 停機:重開 | aws rds reboot-db-instance --db-instance-identifier lite-prod | 套用靜態參數用 |
| 演練故障切換 | aws rds reboot-db-instance --db-instance-identifier lite-prod --force-failover | 要先開雙可用區域 |
| 拍手動快照 | aws rds create-db-snapshot --db-instance-identifier lite-prod --db-snapshot-identifier lite-prod-before-upgrade | 重大變更前都拍。單機時 I/O 會短暫暫停 |
| 還原到時間點 | aws rds restore-db-instance-to-point-in-time --source-db-instance-identifier lite-prod --target-db-instance-identifier lite-restore --restore-time 2026-11-02T07:42:00Z --db-subnet-group-name lite-db-private --vpc-security-group-ids sg-dbxxxx --db-parameter-group-name lite-pg18 --no-publicly-accessible | 建立新主機,要付費。時間用 UTC。查完記得刪 |
| 從快照還原 | aws rds restore-db-instance-from-db-snapshot --db-instance-identifier lite-restore --db-snapshot-identifier lite-prod-before-upgrade --db-subnet-group-name lite-db-private --vpc-security-group-ids sg-dbxxxx --db-parameter-group-name lite-pg18 --no-publicly-accessible | 同上 |
| 暫停測試主機 | aws rds stop-db-instance --db-instance-identifier lite-test | 7 天後自動開回。儲存照收。有讀取副本時不能停 |
| 開啟暫停的主機 | aws rds start-db-instance --db-instance-identifier lite-test | — |
| 查可用版本 | aws rds describe-db-engine-versions --engine postgres --query "DBEngineVersions[].EngineVersion" --output text | — |
| 查有沒有在收 Extended Support | aws rds describe-db-instances --query "DBInstances[].[DBInstanceIdentifier,EngineVersion,EngineLifecycleSupport]" --output table | — |
| 刪除測試主機 | 先 modify-db-instance --no-deletion-protection,再 aws rds delete-db-instance --db-instance-identifier lite-test --skip-final-snapshot --delete-automated-backups | 無法復原。正式主機不要用這個寫法,要留最後快照 |
連不上時的檢查順序
- 狀態:
DBInstanceStatus是available嗎? - 安全群組:來源對嗎?連不上且「逾時」時,多半是這裡或路由。
- 是否同一個 VPC:主機沒有公開位址,VPC 外連不到。
- DNS:程式用的是端點名稱嗎?還原後有沒有改過來?
- 帳號、資料庫名稱:這類錯誤通常會立刻回報,跟逾時不同。
- 憑證:映像檔裡有憑證包嗎?
Host跟憑證上的名稱一樣嗎? - 連線數:
DatabaseConnections有沒有到頂?
19. 跟其他文件、其他題目的關係
這份文件查到、會影響其他地方的事
| 查到什麼 | 影響 | 現況 |
|---|---|---|
BYPASSRLS 在 RDS 可能設不了 | deployment.md 第 5 題的「後台帳號」與 postgres-design-sql.html 第 3 節 | 要實測。第 5 題的選擇本身不受影響,只是後台帳號的做法可能要換 |
| 代管密碼不能建副本、不支援 Blue/Green | db-upgrade-path.html 第 5、6 節的路線 | 需要時先關掉。Aurora 副本是否受限未查證 |
| 加大儲存不會停機 | db-upgrade-path.html 第 5 節寫「這次沒查」 | 已查到,那份文件沒有改 |
| Extended Support 預設開啟 | db-upgrade-path.html 沒有提到 | 這裡補上,那份文件沒有改 |
| 規格支援表沒有列 PostgreSQL 18 | 版本選擇 | 建立前用指令確認 |
這裡不決定的事
| 題目 | RDS 這邊要接上的部分 |
|---|---|
| 第 7 題:環境與發布 | RDS 放在哪個 VPC、測試區要不要獨立一台、RDS Proxy 用不用、Jesse 怎麼連進去、要不要寫成基礎架構程式碼 |
| 第 8 題:監控與告警 | 第 14 節的指標要設多少門檻、通知誰、半夜怎麼叫醒人 |
| 第 9 題:備份與還原 | 保留天數、多久演練一次、只還原一家店的做法、跨區域備份要不要 |
| 資料模型 | 主鍵型別、store_id 的欄位設計(postgres-design-sql.html) |
| 版本 | 第 10 節推薦 18,還沒拍板 |
20. 還沒查證的事
- 整份文件都沒有在 RDS 上跑過:指令、SQL、連線字串和主控台流程都是依文件寫的。第一次建立時可能還會遇到要調整的地方。
BYPASSRLS:RDS 上能不能設,文件沒寫。候選做法(後台專用政策)也沒有實測。db.t4g.micro能不能跑 PostgreSQL 18:規格支援表沒列,要用指令確認。東京實際有哪些小版本也一樣。- 代管密碼與 Aurora 唯讀副本:文件限制的「建立讀取副本」包不包含 Aurora 副本,沒查到。
- EC2 Instance Connect 端點連 RDS:來自第三方文章,AWS 文件講的是連 EC2。走通道時憑證名稱不符的情況,也是 Claude 推論的。
pg_stat_statements是否預設載入:沒查到明確的預設值。- 換規格、單機故障會停多久:文件只寫會停機,沒有數字,要實際演練。
- Express Mode 怎麼帶入祕密:確定任務定義可以用
secrets,也能指定自己的任務定義,但 Express Mode 的完整流程沒有試過。 - 費用:KMS 金鑰、跨可用區域資料傳輸、SNS 通知、EC2 跳板機、Client VPN、Database Insights 進階版的單價都沒查。
- 範本名稱:文件只明確描述 Production 範本,其他範本的實際選項沒有看過。
- 中文排序:資料庫的定序(collation)要怎麼設才符合店家預期,這次沒查,屬於資料模型。
- 資料放在日本的法規問題:個資法對資料放境外有沒有限制,還沒查(
deployment.md)。
21. 名詞對照
| 名詞 | 白話 |
|---|---|
| DB 執行個體(DB instance) | 一台 RDS 資料庫主機 |
| 端點(endpoint) | 連線用的網域名稱 |
| VPC | 你在 AWS 裡專屬的私有網路 |
| 子網路(subnet)、私有子網路 | VPC 裡的一區網段;路由沒有通往網際網路閘道的就是私有的 |
| DB 子網路群組 | 告訴 RDS 可以把主機放在哪些子網路 |
| 安全群組(security group) | 掛在資源上的防火牆規則 |
| 參數群組(parameter group) | 資料庫設定值的集合,取代 postgresql.conf |
| 動態/靜態參數 | 改了立即生效/要重開才生效 |
| 主帳號(master user) | 建立主機時產生的管理帳號,屬於 rds_superuser |
rds_superuser | RDS 給客戶的最高權限角色,但不是真正的 superuser |
| Secrets Manager | AWS 存放密碼的服務,可以自動輪替 |
| KMS | AWS 管理加密金鑰的服務 |
| TLS、憑證機構(CA) | 連線加密;替伺服器憑證背書的單位 |
| gp3、io1 | 一般用途 SSD;可以指定效能但較貴的 SSD |
| IOPS | 每秒讀寫次數 |
| 快照(snapshot) | 整個磁碟某一刻的備份 |
| 時間點還原(PITR) | 用快照加交易記錄,還原到指定的時間 |
| 雙可用區域(Multi-AZ) | 另一個可用區域有一台同步備援,故障時自動接手 |
| 讀取副本(read replica) | 可以讀的非同步副本 |
| Blue/Green 部署 | 複製一套環境同步、升級後切換,縮短停機 |
| 標準支援、Extended Support | AWS 免費維護某大版本的期間;過期後付費延長 |
| 維護時段(maintenance window) | 每週一段允許 AWS 動手的時間 |
| 跳板機(bastion) | 放在 VPC 裡、讓人轉接進去的小主機 |
22. 來源
建立與修改
- Creating an Amazon RDS DB instance(範本、Easy create)
- Settings for DB instances(建立時的欄位)
- Settings for modifying DB instances(哪些變更會停機)
- CreateDBInstance API(預設值)
- create-db-instance CLI
- Supported DB engines for DB instance classes
網路與連線
- Working with a DB instance in a VPC
- Scenarios for accessing a DB instance in a VPC
- Controlling access with security groups
- Connecting to a PostgreSQL DB instance
- EC2 Instance Connect Endpoint(費用與限制)
- 第三方:DoiT,用端點連私有 RDS、第三方:OneUptime
帳號、密碼與加密
- Understanding the rds_superuser role
- Master user account privileges
- PostgreSQL:ALTER ROLE(
BYPASSRLS的規則) - PostgreSQL:Row Security Policies
- Password management with Secrets Manager(7 天輪替、限制)
- IAM database authentication(記憶體需求)
- Pass Secrets Manager secrets through ECS environment variables
- Resources created by ECS Express Mode
- Encrypting Amazon RDS resources
- Using SSL/TLS、SSL with PostgreSQL
- Npgsql:Security、Connection string parameters
參數、版本與維護
- Modifying parameters in a DB parameter group
- RDS for PostgreSQL parameters
- Supported PostgreSQL extension versions
- Release calendars for RDS for PostgreSQL
- Release calendars for Aurora PostgreSQL
- Upgrades of the RDS for PostgreSQL DB engine
- Maintaining a DB instance
- Blue/Green Deployments overview、限制
- RDS Extended Support、費用
儲存、備份與高可用
- Amazon RDS DB instance storage
- Storage autoscaling
- Introduction to backups
- Restoring to a specified time、Restoring from a snapshot、Creating a snapshot
- Deleting a DB instance、Stopping a DB instance
- Multi-AZ DB instance deployments、Multi-AZ DB cluster deployments、Read replicas
- Best practices for Amazon RDS