關於我想看漫畫卻不想看廣告這檔事 (14) — Terraform 佈署 AWS RDS

Seaweed
7 min readSep 10, 2021

--

那麼慣例的:

不過能在一開始就把所有 bug 找出來就表示已經完成基本的測試流程了吧w

本篇程式碼

Amazon RDS 介紹

這裡讓我們先節錄 AWS 官方的介紹:

它提供經濟實惠且可調整大小的容量,且可自動處理硬體佈建、資料庫設定、修補程式和備份等耗時的管理任務。這讓您有更多時間專注在應用程式,以提供其所需的快速效能、高可用性、安全性和相容性。

說明已經說得很清楚了,AWS 就是利用 RDS 幫使用者直接準備好一個可存取的 DB。深入一點理解也就是可以當作 AWS 幫我們起了一台 EC2 然後在上面安裝資料庫、設定連線用帳號以及資料庫(表)的初始化。

因為管理上 AWS 是幫我們管「EC2 上的資料庫」,所以基本上所有關於資料庫的設定都可以透過網頁或者 AWS 的 API 做變更。同時,由於 AWS 擁有資料庫全方面的控管權限,它甚至可以提供原生資料庫未提供的服務維持手段(包含自動備份、連線控制、自動附載平衡等),因此一般狀況下使用 Amazon RDS 會比自己在 EC2 上配置資料庫要來得可靠。

不過很明顯,這麼多好用功能顯然並不是免費的,這邊簡單比較一下:

- 資料中心位置: us-east-1
- 執行實體類型: 隨需資料庫執行個體 - t3.micro
- 資料庫類別: Mysql
  • RDS(單一 Availability Zone): 0.017 USD/per hour
  • RDS(異地同步備份,二 Availability Zone): 0.034 USD/per hour
  • 相同執行實體類型的 EC2: 0.0104 USD/pre hour

這裡特別說明一下,異地同步備份的意思其實就是在兩個 Availability Zone 起兩台 RDS 然後讓它們做鏡像的意思,雖然可以提升效能以及維持高可用性,但價格就是單一 Availability Zone 的兩倍。不過就算是單一 Availability Zone 其價格依然是相同執行效能實體 EC2 的 1.7 倍,依然是貴。

雖然 Amazon RDS 為我們提供了強大可維護性與可靠性,但其成本依然是可觀的。因此,實際應用時必須仔細計算成本與收益才能下決策。

RDS 需要的 VPC 配置

介紹完了 Amazon RDS,那麼接下來就是來介紹一下佈署 RDS 所需的 VPC 架構。而大部分正如佈署 EC2 的時候一樣,所以關於 Route Table, Internet Gateway 以及 Security Group 的部份這裡就先省略,主要的架構如下:

可以發現,RDS 一整個就很奇怪,偏偏要跨在兩個 subnet 中間。不過這只是個示意圖,實際上 RDS 是基於 subnet group,而兩個 subnet 就是 subnet group 的組成。

關於要使用 Terraform 佈署 RDS 時的 subnet group 的組成條件只有兩個:

  1. 大於兩個的 subnet
  2. 所有 subnet 中包含至少兩個 Availability Zone

由於不同的 Availability Zone 表示不同的實體資料中心位置,其使用冗餘來保護資料庫的目的也是非常明顯。不過這是最低條件,意味著你不能使用低於 2 的 subnet 或者 Availability Zone 來建立 subnet group

關於這部份的說明可以看官網(Resolution 的第二點):

另外特別注意,針對 subnet group 底下的 subnet 的任何設定(除了 Availability Zone),所有 subnet 都必須保持一樣,不然你會遇到服務能起來,但有機率連線失敗的詭異狀況(大概是 m/n , m=設定錯誤的 subnet 數量, n 全部 subnet 數量)。

基本 RDS 佈署程式

雖然有點長但因為主要只有部署一個 RDS 並且相信各位也對 Terraform 有一定的熟悉度了,所以這次我們直接上 RDS 的完整佈署程式碼:

為求方便,這次我們直接部署可以從 terraform 佈署機器直接存取的 rds。

這邊的 data "http" 實際上是 terraform 提供的一個方便的 http 請求器,這邊是透過 http://ipv4.icanhazip.com來回傳「執行部署的」機器的 ip。

正如前述,建立 RDS 時必須指定一個 subnet group(否則它會把你的 RDS 塞到 Default VPC),並且該 subnet group 內部必須至少包含兩個不同 availability zone 的 subnet,這也是這次主要有變更的部分。

這邊需要特別提一下 subnet 設定中的 map_public_ip_on_launch="true"。這表示所有在該 subnet 啟動的實體都會被賦予一個公開 ip,如果沒設這個就算 security group 有放行也連不進去。然後因為這兩個 subnet 被用在一個 subnet group,兩個 subnet 都要開

最後關於 RDS 佈署的重頭戲 — aws_db_instance 嘛,說實在也沒什麼好說的,就看官網吧。

providers.tf, variables.tf, terrafrom.tfvars 的部分因為沒有變更所以不是很重要,想看或者執行看看的話就請移步專案連結的 github 吧(再貼一次):

結語

這篇可能會有點短,不過至少把重點的 RDS 整體部署流程解說完畢了。雖然原本還想多介紹一個叫 rds-proxy 的東東,但本藻不管怎麼部署都沒辦法正常運作(nc 怎麼戳都沒反應,更遑論連上了),而且實際上之後的章節也不會用到,這邊就先本藻繼續研究吧。那麼一樣,對這個系列有興趣的話就請持續關注吧。

不過如果你知道 rds-proxy 的正確部署方法的話,本藻跪求指教 <(_ _)>。

下篇預告

爬蟲超進化?漫畫爬蟲 + 閱讀器 + RDS

下篇傳送門↓

--

--

Seaweed

最大的才能是行光合作用,朋友是矽藻的海藻。