在 AWS 以 Aurora Serverless 搭建無伺服器 Web 應用程式 part1 — 建立 DB cluster
以往要在 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