在 AWS 以 Aurora Serverless 搭建無伺服器 Web 應用程式 part1 — 建立 DB cluster

Luyo
verybuy-dev
Published in
9 min readMay 18, 2019

以往要在 AWS 架設 serverless 的 web 應用,心中認知的標配就是 Lambda + DynamoDB + API Gateway,但如果不想用 nosql 資料庫,就還是得開台機器;現在 Aurora Serverless 也加入了 serverless 行列,總算是有 RDB 的 serverless solution。

我其實是第一次玩 serverless,實際上從頭走一遍,發現還真是不少眉眉角角要克服,所以把整理過的資訊記錄在這一系列文章,希望能讓有興趣的朋友能少踩一些雷,節省一些時間。

本系列會從頭開始建立一個 REST API 應用程式,且將會設定好 lcoal、dev 及 prod 三個環境,其中 dev 和 prod 會同時佈署在 AWS 上,讓你走完後不用擔心再多加一個環境時該怎麼解決佈署問題。

本系列參考:

本系列文章將會直接操作到的工具或服務如下:
AWS Aurora Serverless
AWS VPC
AWS IAM
Serverless Framework

不直接操作,但會間接產生資源的服務如下:
AWS S3
AWS CloudFormation
AWS API Gateway
AWS Lambda

如何評估使用 Aurora Serverless

以下簡單說明如何評估是否使用 Aurora Serverless。

優點

  • 按容量單位 ACU 的用量計費 (先忽略硬碟及 IO 的費用)
  • 不用維護機器
  • 不用擔心 scaling 的問題
  • 內建 fault tolerance

缺點

  • 若一段時間沒有 request,再啟動會有 10秒上下的 cold start time (解決方法可參考 Thundra)

限制

  • 目前 (2019/5/18) 只支援 MySQL 5.6
  • 只能用 port 3306 連線
  • 只允許 VPC 內網存取
  • 無法用 AWS VPN 或 inter-region VPC peering 連線進入

費用

來到大家最關心的費用部分:1 個 ACU 單位的定價,美國是 0.06 元/小時,東京是 0.1 元/小時,其他區域請自行查詢 Amazon Aurora 定價

以美國的價格來計算,一個月 30 天的低消費用是24 x 0.06 x 30 = 43.2 美元,換算台幣約 1339 元 (以匯率 31 計算)。請注意,即使開了之後是閒置狀態,還是會收你設定的最低 ACU 單位的價錢。

因為 1 個 ACU 大約是 2GB 的 Memory,對比同規格的 instance 是 db.t3.small,一個小時只要 0.041 元,其實比 serverless 便宜,但如果你有以下幾種情況,serverless 就有可能比較划算:

  • 需要 HA 及 failover
  • 常常需要做 scale up & down

更詳細的資訊可參考:

建立 Auraro Serverless clusters

先寫在前面,接下來的範例會一次開 2 個 cluster,RDS 的費用就是 2 倍。如果還在開發階段想省錢,可以先開一個 cluster 就好。

登入 AWS 後,開啟 RDS console,點擊 “Launch an Auraro DB Instance” (或 “Create database”) 按鈕:

選擇 “Amazon Aurora”:

目前 (2019/5/18) Aurora Serverless 僅支援 MySQL 5.6 版本,沒得商量,選擇後點擊 “Next”:

選擇 “Serverles” 選項:

填入你想要的 DB cluster 名稱,結尾加上 “-dev” 代表開發環境,然後填入 Master username 及 password:

其他都先套用預設值:

“VPC security Groups” 點擊 “Choose existing VPC security groups” 後會自動帶入 “default”:

最後按 “Create database” 就會開始建立新的 cluster 了:

接著照上述步驟再開一個 prod 的 cluster:

設定 Security Group

在 Databases 列表中點擊 “magicbean-dev” 或你自己的 dev DB 名稱,會進入詳細資訊頁面,往下拉之後在 “Connectivity & security” 頁籤中會看到一些 VPC 相關設定,點擊下圖右邊紅框的連結:

在頁面下方找到 Security Group 的內容區塊,點擊 “Inbound” 頁籤:

將下圖紅框內的 “sg-xxx” 字串複製下來:

點擊 “Edit” 按鈕:

填入剛剛複製下來的 “sg-xxx” 文字貼上至 “Source” 空格中,然後按 “Save”:

到這邊就設定完 security group 了。如果不懂為什麼要這樣設定,建議 google 一下 “security group”,了解一下它是用來幹嘛的。我只簡單說一下,這個東西就是用來制定什麼樣的流量可以進出一個資源 (機器/服務) 的規則,inbound 是進入,outbound 是出去。這邊設定的同一個 security group 當作 Source 的作法叫做 “self-referencing” (自我參照),意思是只允許其他同樣設定此 security group 的資源的流量進入此資源。如果你未來要從內網的其他資源連線進來,也可以考慮將 source 改成 172.31.0.0/16 或你自訂的 VPC 內網區段。

接下來,請記得將 “magicbean-prod” 或你自己的 prod DB 名稱也做一次上述的步驟。

連線進入 DB cluster

因為 serverless 是沒有實體機器可以讓你 ssh 進去的,但我們還是得想辦法連進資料庫去下 SQL 建立資料庫及使用者。有件事必須先強調,現在的 Aurora serverless 只允許同一個 VPC 底下的 private 流量進入,這是 Aurora Serverless 的限制,沒得商量。

那這樣到底怎麼連?有以下幾種方法:

方法1: 在內網開一台 EC2,ssh 進去之後再下 mysql 指令。這個方法的缺點是開機器要錢,當然不用的時候可以關掉,但一直開開關關會非常麻煩。

方法2: 參考 AWS 官方的教學,透過 Cloud9 服務連線進去。這個方法的缺點跟方法1一樣,Cloud9 服務本身雖然不收費,但他其實也是幫你在 EC2 開機器連進去,EC2 的費用還是跑不掉,只是讓你方便在 console 介面操作而已。

方法3: 用 RDS console 的 Query Editor 功能,不用開機器就可以連進去,推薦使用這個方法。

以下說明方法3的設定步驟。

回到 RDS console,點擊左側的 “Query Editor”:

會跳出一個對話框,選擇 “magicbean-dev” 或你的 dev DB 名稱, “Database username” 選擇 “Add new database credentials”,然後填入你當初建立 cluster 時設定的 Master username 及 password:

按下 “Connect to database” 後,會跳下以下對話框:

意思就是還有些東西沒設定,我們就照他說的,點擊 “Modify Database” 回到 database 資訊頁面,然後按下圖右上角的 “Modify” 按鈕:

往下拉到 “Network & Security” 區塊,將 “Data API” 勾選起來:

接著往下拉按下 “Continue” 後,選擇 “Apply immediately”,然後按下 “Modify cluster”:

等設定生效之後,我們再回到 “Query editor”,就可以順利連線進去了:

小結

到這邊應該都不難,要注意的只有 security group 有沒有設定正確而已,如果沒設定好的話,之前從別的地方會怎麼連都連不進去喔。

下一篇:在 AWS 以 Aurora Serverless 搭建無伺服器 Web 應用程式 part2 — 設定 Cluster parameter group

--

--