End-to-End 雲原生全端架構
類別:Cloud Architecture · Serverless · CI/CD技術棧:AWS Lambda · API Gateway · DynamoDB · S3 · CloudFront · GitHub Actions · Vue.js · iOS · Flutter
背景
這個系統最大的挑戰在於資料來源的多樣性:多個 iOS App、Android App,以及各式各樣的 Edge Devices(例如聲音盒子)同時在場域中運作,每個裝置都會高頻率地將音檔與感測資料打上雲端。
這不是一個簡單的「API 接資料庫」問題。真正需要解決的是:
- 高併發承載:裝置數量多,連線請求集中,後端不能被打掛
- 跨平台格式對齊:iOS、Android、Edge Device 的資料格式各有差異
- 維運可持續性:系統要能自動更新,不能每次部署都是高風險手術
系統架構
裝置端
由於我有 iOS App 開發背景,負責制定裝置端的資料上傳規範。清楚裝置端的限制(電池、網路斷線重連、背景執行限制),讓協議設計更貼近真實場景。
- iOS App:Swift 原生開發,負責音檔錄製與上傳
- Android App:Flutter 跨平台實作
- Edge Devices:自定義通訊協議,輕量化資料包設計
雲端層:純 Serverless 架構
為什麼選 Serverless? 裝置端的連線請求是突發性的,無法預測高峰時間。傳統 EC2 伺服器需要預先設定容量,高峰時可能不夠,離峰時又浪費費用。Serverless 可以根據實際請求量自動彈性擴展。
架構設計:
裝置端
↓
API Gateway(統一入口)
↓
Lambda(資料驗證 + 分流處理)
↓
DynamoDB(結構化 Metadata)+ S3(音檔實體)API Gateway 作為所有裝置的統一入口,負責請求驗證與路由。
Lambda 處理核心邏輯:
- 接收並驗證資料格式
- 將 Metadata 寫入 DynamoDB
- 將音檔實體上傳至 S3
由於 Lambda 可以根據併發請求數自動擴展,高峰期的大量裝置連線可以被平滑吸收。
CI/CD 全自動化部署
CI(持續整合)— GitHub Actions 每次 Git Push 自動觸發:
- 單元測試 + 整合測試
- Docker Image 建置與推送至 AWS ECR
- 測試報告與 Lint 檢查
CD(持續部署)— 自動化
- 後端 Lambda:測試通過後自動部署至 Lambda,無停機更新
- 前端 Vue.js:自動打包並同步至 S3,CloudFront 快取自動失效更新
整套 CI/CD 讓每次程式碼合併後,系統自動完成測試、建置、部署,維運工程師不需要手動介入。
關鍵決策:為何選擇純 Serverless
傳統方案的問題: EC2 + Load Balancer 需要預先設定機器規格,面對突發流量需要手動擴展或設置複雜的 Auto Scaling 規則。
Serverless 的優勢:
- 按請求計費,沒有請求就沒有費用
- 自動彈性擴展,無需手動設定容量
- 無需管理伺服器底層,降低維運複雜度
成果
- 系統穩定承接多種裝置的高頻資料上傳,無服務中斷事件
- CI/CD 自動化大幅降低部署風險與維運負擔
- Serverless 架構讓成本與流量成正比,避免了固定費用的浪費
反思
這個專案讓我最深刻的體會是:架構選型要回答的問題不是「哪個方案最先進」,而是「哪個方案最適合這個問題的形狀」。Serverless 不是萬靈丹,但對於突發性、多來源的裝置資料接收場景,它確實是最合理的選擇。
