Azure Container Apps vs Web Apps

在 Azure 的生態系中,Container Apps (ACA) 和 Web App (主要指 App Service for Containers) 雖然都能執行容器化應用,但其底層邏輯與適用情境有明顯差異。

核心定位與架構

Web App (App Service) 是成熟的 PaaS (平台即服務),最初是為了託管網頁程式設計的。它將底層基礎設施封裝得非常完整,你只需要專注於程式碼或單個容器。它強調的是穩定性、整合性以及對傳統 Web 模式的支援。

Container Apps (ACA) 則是建構在 Kubernetes (AKS) 之上的 Serverless 平台。它幫你隱藏了 K8s 的複雜性,但保留了微服務架構的靈活性。它適合由多個組件構成的系統,且具備更強的事件驅動擴展能力。

Kubernetes是用於自動部署、擴充和管理「容器化應用程式」的開源系統。Kubernetes 是在提供「跨主機叢集的自動部署、擴充以及執行應用程式容器的平台」。

主要差異分析

特性Web App (App Service)Container Apps (ACA)
設計目標單體應用 (Monolith) 或單一 Web API微服務架構 (Microservices)
自動擴展基於 CPU/記憶體負載,速度較慢基於 KEDA (事件驅動),可從 0 擴展至 N
計費模式預留實例 (按 App Service Plan 規格固定計費)消耗制 (按實際執行的資源秒數計費)
併發處理適合長連接、持續性流量適合突發流量、背景作業、排程工作
微服務特性較弱,通常需手動串接各個 App內建 Dapr 與 Envoy,支援服務發現與流量切分
複雜度極低,傳統開發者上手最快中等,需了解容器與微服務基本概念

如何選擇

選擇 Web App 的時機:

  • 你只需要執行一個單獨的 Web 網站或 API 伺服器。
  • 你的應用流量相對穩定,不希望遇到 Serverless 的冷啟動問題。
  • 你需要完整的 Windows 容器支援或特定的 IIS 整合。
  • 你偏好預測每個月固定的帳單預算。

選擇 Container Apps 的時機:

  • 你的系統是由多個互相溝通的微服務組成。
  • 流量波動很大,甚至在沒人使用時希望縮減到零以節省成本。
  • 你需要處理非 HTTP 的事件驅動任務(例如從 Queue 讀取訊息後處理)。
  • 你想享有類 Kubernetes 的功能(如 Sidecar 模式),但不想管理整個 K8s 叢集。

簡單來說,如果你做的是「一個網站」,選 Web App;如果你做的是「一套分散式系統」,選 Container Apps 會更合適。


Web App 可以有前端/後端機制?

在 Web App (App Service) 的架構中,確實可以實現前端與後端的機制,但具體的做法會根據你的專案規模與部署策略而有所不同。

單一 Web App 模式 (Monolith)

這是最傳統的做法,將前端網頁 (HTML/CSS/JS 或 React/Vue 編譯後的靜態檔案) 與後端程式 (Node.js, Python, Java, .NET) 打包在一起。當使用者存取網址時,同一個服務會負責處理 API 請求並回傳網頁內容。

這種方式的優點是管理簡單,只需要維護一個 App Service Plan 與一份部署流水線。缺點是當前端流量大增時,後端資源也會跟著被佔用,無法獨立擴展。

前後端分離模式 (Decoupled)

在 Azure 上更推薦的做法是將前端與後端拆分成兩個獨立的服務。

後端會部署在一個 Web App 中,專門處理 API 請求與資料庫互動。前端則有兩個選擇:第一是部署在另一個 Web App,第二則是使用 Azure Static Web Apps。

Azure Static Web Apps 是專門為 SPA (單頁式應用程式) 設計的服務,它將靜態檔案部署在全網域的邊緣節點,讀取速度更快,且成本通常比運行一個完整的 Web App 低很多。後端 Web App 則只需要開啟 CORS (跨來源資源共用) 設定,允許前端網址存取即可。

VNet 整合與安全性

如果你希望後端 API 不要暴露在網路上,只允許前端存取,可以透過虛擬網路 (VNet) 的機制。

你可以將後端 Web App 設定為僅接受來自前端服務的內部流量。這樣前端作為對外門戶,後端則隱藏在內網中,能有效提升系統的安全性。對於高中生理解來說,這就像是前端是餐廳的櫃檯,負責面對客人;後端是廚房,客人不能直接進去,只能透過櫃檯傳遞需求。

選擇建議

如果是小型專案或練習作品,採用單一 Web App 模式最省事。如果是正式的產品開發,建議將前端放在 Static Web Apps,後端放在 Web App,這樣不僅效能較好,開發時前後端團隊也可以各自獨立更新,互不干擾。


Container Apps 只能使用 Azure App Configuration, 無法使用 appsettings?

這是一個常見的誤解。事實上,Azure Container Apps (ACA) 當然可以使用 appsettings.json

Container Apps 本質上就是執行你的容器映像檔。只要你的程式碼(例如 .NET)邏輯裡有讀取 appsettings.json,它在雲端執行時依然會去讀取該檔案。

為什麼大家會討論這兩者的差異

雖然可以使用 appsettings.json,但在雲原生環境中,我們通常會避免將機密資訊或變動頻繁的設定直接寫死在映像檔裡的 appsettings.json。這時會有幾種層次的處理方式:

1. 容器環境變數 (Environment Variables)

這是最直接的做法。ACA 允許你在部署時設定環境變數。對於 .NET 程式來說,環境變數會自動覆蓋 appsettings.json 中的同名設定。

  • 優點:簡單、快速。
  • 缺點:如果設定值很多,管理起來很零碎。

2. ACA 內建的 Secrets

對於資料庫密碼、API Key 等敏感資訊,ACA 有專門的 Secrets 管理介面。你可以先在 ACA 層級定義 Secret,再將其映射為環境變數讓程式讀取。

3. Azure App Configuration

這是一個外部的中心化設定管理服務。

  • 適用時機: 當你有幾十個微服務(Container Apps),且希望在不重啟程式的情況下,改一個地方就讓所有服務同步更新設定(動態更新)。
  • 整合方式: 程式啟動時會連到 App Configuration 抓取設定,這同樣會覆蓋本地的 appsettings.json

總結建議

如果你只是單一服務,且設定不太會變動,繼續用 appsettings.json 配合 環境變數 覆蓋特定屬性是最平衡的做法。

如果你正在開發複雜的微服務架構,或是需要「功能開關」(Feature Flags),這時才需要考慮引入 Azure App Configuration。所以並不是「只能」用它,而是它提供了更強大的集中管理能力。

對於一般的開發流程:

  1. 開發環境:使用 appsettings.Development.json
  2. 部署到 ACA:將正式環境的資料庫連線字串等,設定在 ACA 的 SecretsConfiguration 區塊,程式執行時會自動優先採用這些雲端設定。

create Container Apps 一定要選 容器應用程式環境, 容器應用程式環境 要怎麼增加vnet

在建立 Azure Container Apps (ACA) 時,容器應用程式環境 (Container Apps Environment) 是強制的,因為它就像是一個邏輯邊界,負責管理底層的網路、記錄檔 (Logging) 以及所有在裡面執行的 Container Apps。

如果你想要讓 ACA 具備 VNet 功能,必須在建立環境的當下就進行設定。

為什麼一定要有環境

環境 (Environment) 扮演了虛擬叢集的角色。同一個環境內的 Container Apps 可以透過內部名稱互相溝通,並共用同一個虛擬網路設定與 Log Analytics 工作區。你可以把它想像成一個專屬的社區,而 VNet 就是這個社區對外連線的專用道路。

如何在建立時增加 VNet

一旦環境建立完成,目前是不支援從「非 VNet 模式」切換成「VNet 模式」的。如果你需要加入 VNet,請參考以下步驟:

  • 建立流程: 在建立 Container Apps 的過程中,進行到容器應用程式環境的設定分頁。
  • 網路分頁: 點選「建立新環境」或編輯現有環境設定時,找到 Networking (網路) 標籤。
  • 虛擬網路選項: 將「使用自有虛擬網路」勾選為 Yes (是)
  • 子網路配置: 你需要指定一個現有的 VNet 以及一個專門給 ACA 使用的子網路 (Subnet)。
    • 請注意:這個子網路必須是空的,且不能與其他服務共用。
    • 子網路的大小至少需要 /27 或更寬(建議 /23),以應付未來自動擴展時需要的 IP 位址。

外部與內部存取類型

在設定 VNet 時,你還需要決定 VIP (虛擬 IP) 類型

  • External (外部): 你的 VNet 會有一個公開的實體 IP,外界可以透過網路存取環境內的服務,但內部通訊走 VNet。
  • Internal (內部): 整個環境完全隱藏在 VNet 內,沒有對外的公開 IP。這適合處理後端 API 或內部管理系統,安全性最高。

注意事項

由於 ACA 底層是基於 Kubernetes 概念設計的,它對網路定義比較嚴格。如果你已經建立了一個「沒有 VNet」的環境,但現在需要連線到你私人網路裡的資料庫(例如位於 VNet 內的 SQL Server),唯一的做法是重新建立一個新的環境並在建立時勾選 VNet 整合。

如果你只是想連線到 Azure 其他有防火牆保護的服務(如 Key Vault),除了 VNet 之外,也可以考慮使用 Managed Identity (受控識別),這在雲原生架構中通常比單純鎖 IP 更安全且彈性。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *