分析應用程式所使用的 Azure 資源(IaC 檔案及/或目標資源群組中的資源)並進行成本最佳化,同時針對識別出的最佳化項目建立 GitHub Issues。
Azure 成本最佳化 (Azure Cost Optimize)
此工作流程會分析程式碼化基礎架構 (IaC) 檔案與 Azure 資源,並產生成本最佳化建議。它會針對每個最佳化機會建立單獨的 GitHub Issue,並額外建立一個 EPIC Issue 來統一協調執行,實現高效率的成本削減追蹤與執行。
先決條件
- 已設定並完成驗證的 Azure MCP server
- 已設定並完成驗證的 GitHub MCP server
- 已指定目標 GitHub 儲存庫 (Repository)
- 已部署 Azure 資源(IaC 檔案為選填,但有助於分析)
- 只要有可用的 Azure MCP 工具 (
azmcp-*),優先使用 MCP 工具而非直接呼叫 Azure CLI
工作流程步驟
步驟 1:取得 Azure 最佳做法
操作:在分析前取得成本最佳化最佳做法
工具:Azure MCP 最佳做法工具
流程:
- 載入最佳做法:
- 執行
azmcp-bestpractices-get以取得最新部分的 Azure 最佳化指引。這可能無法涵蓋所有情境,但能提供基礎依據。 - 盡可能利用這些做法來協助後續的分析與建議。
- 在最佳化建議中引用最佳做法,可取自 MCP 工具輸出或一般的 Azure 官方文件。
- 執行
步驟 2:探索 Azure 基礎架構
操作:動態探索並分析 Azure 資源與設定
工具:Azure MCP 工具 + Azure CLI 備用機制 + 本地檔案系統存取
流程:
-
資源探索:
- 執行
azmcp-subscription-list找尋可用的訂閱 (Subscriptions) - 執行
azmcp-group-list --subscription <subscription-id>找尋資源群組 (Resource Groups) - 取得相關資源群組中的所有資源清單:
- 使用
az resource list --subscription <id> --resource-group <name>
- 使用
- 針對每種資源類型,優先使用 MCP 工具,若無則退回使用 CLI:
azmcp-cosmos-account-list --subscription <id>- Cosmos DB 帳號azmcp-storage-account-list --subscription <id>- 儲存體帳號 (Storage accounts)azmcp-monitor-workspace-list --subscription <id>- Log Analytics 工作區azmcp-keyvault-key-list- Key Vaults 金鑰庫az webapp list- Web Apps(備用 - 無可用 MCP 工具)az appservice plan list- App Service 計劃(備用)az functionapp list- Function Apps(備用)az sql server list- SQL 伺服器(備用)az redis list- Redis 快取(備用)- ...其他資源類型以此類推
- 執行
-
IaC 偵測:
- 使用
file_search掃描 IaC 檔案:"/*.bicep", "/*.tf", "/main.json", "/template.json" - 解析資源定義以了解預期的組態設定
- 與探索到的實際資源進行對比,找出差異
- 標記 IaC 檔案的存在,以便後續提出實施建議
- 切勿使用專案儲存庫中的任何其它檔案,僅限使用 IaC 檔案。嚴禁使用其它檔案,因為它們並非事實來源 (Source of truth)。
- 如果未搜尋到任何 IaC 檔案,請立即停止並向使用者回報未找到 IaC 檔案。
- 使用
-
組態設定分析:
- 擷取各項資源的當前 SKU、層級 (Tiers) 與設定
- 識別資源之間的關聯性與相依性
- 在可取得數據的情況下,對應資源使用率模式
步驟 3:收集使用率指標並驗證當前成本
操作:收集使用率數據並驗證實際資源成本
工具:Azure MCP 監控工具 + Azure CLI
流程:
-
尋找監控來源:
- 使用
azmcp-monitor-workspace-list --subscription <id>尋找 Log Analytics 工作區 - 使用
azmcp-monitor-table-list --subscription <id> --workspace <name> --table-type "CustomLog"探索可用數據
- 使用
-
執行使用率查詢:
- 使用
azmcp-monitor-log-query搭配以下預定義查詢:- 查詢語句:"recent" 查閱近期活動模式
- 查詢語句:"errors" 查閱表示有問題的錯誤層級記錄
- 如需自訂分析,請使用 KQL 查詢:
// App Services CPU 使用率 AppServiceAppLogs | where TimeGenerated > ago(7d) | summarize avg(CpuTime) by Resource, bin(TimeGenerated, 1h) // Cosmos DB RU 消耗量 AzureDiagnostics | where ResourceProvider == "MICROSOFT.DOCUMENTDB" | where TimeGenerated > ago(7d) | summarize avg(RequestCharge) by Resource // 儲存體帳號存取模式 StorageBlobLogs | where TimeGenerated > ago(7d) | summarize RequestCount=count() by AccountName, bin(TimeGenerated, 1d) - 使用
-
計算基準指標:
- CPU/記憶體平均使用率
- 資料庫吞吐量模式
- 儲存體存取頻率
- Function 執行率
-
驗證當前成本:
- 利用步驟 2 探索到的 SKU/層級設定
- 在 https://azure.microsoft.com/pricing/ 查詢最新 Azure 定價,或使用
az billing指令 - 記錄:資源 → 當前 SKU → 估算每月成本
- 在提出建議前,計算出合理的當前每月總支出
步驟 4:產生成本最佳化建議
操作:分析資源以識別最佳化機會
工具:利用收集到的數據進行本地分析
流程:
-
根據找到的資源類型套用最佳化模式:
算力最佳化 (Compute Optimizations):
- App Service Plans:根據 CPU/記憶體使用率調整至合適規格 (Right-size)
- Function Apps:使用率較低時,由 Premium 方案調整為 Consumption(按用量計費)方案
- 虛擬機器 (Virtual Machines):將規格過大的執行執行個體調降規模 (Scale down)
資料庫最佳化 (Database Optimizations):
- Cosmos DB:
- 變動工作負載由 Provisioned(預置)調為 Serverless(無伺服器)
- 根據實際使用量調整合宜的 RU/s 規格
- SQL Database:根據 DTU 使用率調整合宜的服務層級
儲存體最佳化 (Storage Optimizations):
- 實施生命週期策略(Hot 熱 → Cool 冷 → Archive 封存)
- 整合冗餘的儲存體帳號
- 根據存取模式調整合宜的儲存層級
基礎架構最佳化 (Infrastructure Optimizations):
- 移除未使用的冗餘資源
- 在有益處的情境下實施自動擴縮 (Auto-scaling)
- 針對非生產環境設定排程關機
-
計算有據可循的節省金額:
- 當前已驗證成本 → 目標成本 = 節省金額
- 記錄當前與目標設定的定價參考來源
-
計算各項建議的優先度分數 (Priority Score):
優先度分數 = (價值分數 × 每月節省金額) / (風險分數 × 實施所需天數) 高優先度:分數 > 20 中優先度:分數 5-20 低優先度:分數 < 5 -
驗證建議:
- 確保 Azure CLI 指令準確無誤
- 校驗估算的節省金額計算
- 評估實施風險與前置條件
- 確保所有節省金額計算皆有佐證數據支持
步驟 5:使用者確認
操作:在建立 GitHub issues 前展示摘要並取得授權
流程:
-
顯示最佳化摘要:
🎯 Azure 成本最佳化摘要 📊 分析結果: • 已分析資源總數:X • 當前每月成本:$X • 預估每月可節省:$Y • 最佳化機會數量:Z • 高優先度項目:N 🏆 建議列表: 1. [資源名稱]: [當前 SKU] → [目標 SKU] = 每月節省 $X - [風險層級] | [實施工作量] 2. [資源名稱]: [當前設定] → [目標設定] = 每月節省 $Y - [風險層級] | [實施工作量] 3. [資源名稱]: [當前設定] → [目標設定] = 每月節省 $Z - [風險層級] | [實施工作量] ...以此類推 💡 即將建立: • Y 個獨立 GitHub issues(每個最佳化項目一個) • 1 個 EPIC issue 用以統籌協調實施 ❓ 是否繼續建立 GitHub issues?(y/n) -
等待使用者確認:僅在使用者確認許可後才繼續執行
步驟 6:建立獨立最佳化 Issue
操作:針對每個最佳化機會建立單獨的 GitHub issue。為其加上 "cost-optimization"(綠色)與 "azure"(藍色)標籤。
所需的 MCP 工具:針對每項建議呼叫 create_issue
流程:
-
使用此範本建立獨立 Issue:
標題格式:
[COST-OPT] [資源類型] - [簡短說明] - 每月節省 $X內文範本:
## 💰 成本最佳化:[簡短標題] **每月節省金額**:$X | **風險層級**:[低/中/高] | **實施工作量**:X 天 ### 📋 案由說明 [清晰解釋最佳化方案及其必要性] ### 🔧 實施步驟 **已偵測到 IaC 檔案**:[是/否 - 依據 file_search 頁面結果] ```bash # 若找到 IaC 檔案:展示 IaC 修改內容 + 部署指令 # 檔案:infrastructure/bicep/modules/app-service.bicep # 變更:sku.name: 'S3' → 'B2' az deployment group create --resource-group [rg] --template-file infrastructure/bicep/main.bicep # 若未找到 IaC 檔案:直接使用 Azure CLI 指令 + 警示 # ⚠️ 未找到 IaC 檔案。若檔案保存在其它位置,請改為修改該處的檔案。 az appservice plan update --name [plan] --sku B2📊 佐證依據
- 當前組態設定:[詳細資訊]
- 使用模式:[監控數據佐證]
- 成本影響:$X/月 → $Y/月
- 最佳做法符合度:[若適用,附上 Azure 最佳做法參考說明]
✅ 驗證步驟
- [ ] 在非生產環境中進行測試
- [ ] 確認效能未受影響降級
- [ ] 在 Azure 成本管理中確認成本確實降低
- [ ] 視需要更新監控與告警
⚠️ 風險與注意事項
- [風險 1 及其緩解措施]
- [風險 2 及其緩解措施]
優先度分數:X | 價值:X/10 | 風險:X/10
步驟 7:建立 EPIC 統籌 Issue
操作:建立主 Issue (Master Issue) 以追蹤所有最佳化工作。為其加上 "cost-optimization"(綠色)、"azure"(藍色)及 "epic"(紫色)標籤。
所需的 MCP 工具:針對 EPIC 呼叫 create_issue
關於 Mermaid 圖表注意事項:請務必校驗 mermaid 語法無誤,並在繪製圖表時兼顧可存取性規範(樣式、顏色等)。
流程:
-
建立 EPIC Issue:
標題:
[EPIC] Azure 成本最佳化專案 - 預計每月可節省 $X內文範本:
# 🎯 Azure 成本最佳化 EPIC **預估每月節省總額**:$X/月 | **實施時程**:X 週 ## 📊 執行摘要 - **已分析資源**:X - **最佳化機會**:Y - **每月潛在節省總額**:$X - **高優先度項目**:N ## 🏗️ 當前架構概觀 ```mermaid graph TB subgraph "Resource Group: [name]" [產生的架構圖,呈現當前資源與成本] end📋 實施追蹤
🚀 高優先度(優先實施)
- [ ] #[issue-number]: [標題] - 每月節省 $X
- [ ] #[issue-number]: [標題] - 每月節省 $X
⚡ 中優先度
- [ ] #[issue-number]: [標題] - 每月節省 $X
- [ ] #[issue-number]: [標題] - 每月節省 $X
🔄 低優先度(有餘力再做)
- [ ] #[issue-number]: [標題] - 每月節省 $X
📈 進度追蹤
- 已完成:0 / Y 項最佳化
- 已實現節省:$0 / 每月 $X
- 實施狀態:未開始
🎯 成功標準
- [ ] 所有高優先度最佳化項目皆已實施
- [ ] 實際實現 >80% 的估算節省金額
- [ ] 觀察到無效能降級狀況
- [ ] 成本監控儀表板已更新
📝 備註
- 請在 Issue 完成時同步檢視並更新此 EPIC
- 監控實際與估算節省金額的差異
- 考慮定期安排成本最佳化審查
錯誤處理
- 成本驗證:若節省金額估算缺乏佐證依據,或與 Azure Pricing 定價不一致,請重新核對組態設定
<!-- truncated for translation batch; full body continues in source -->






