本文概述網路服務的已實證 FinOps 做法。 他們著重於成本優化、效率改善和資源深入解析。
Azure 防火牆
下列各節提供適用於 Azure 防火牆 的 Azure Resource Graph (ARG) 查詢。 這些查詢可協助您深入瞭解 Azure 防火牆資源,並確保其已設定適當的設定。 藉由分析 Azure Advisor 的使用模式和呈現建議,您可以將 Azure 防火牆設定優化,以達到成本效益。
查詢:Azure 防火牆和防火牆原則分析
此 ARG 查詢會分析 Azure 防火牆及其 Azure 環境中的相關聯防火牆原則。 它特別以具有進階 SKU 層的防火牆為目標,並確認其相關聯防火牆原則中的設定正在使用進階功能。
類別
最佳化
查詢
resources
| where type =~ 'Microsoft.Network/azureFirewalls' and properties.sku.tier=="Premium"
| project FWID=id, firewallName=name, SkuTier=tostring(properties.sku.tier), resourceGroup, location
| join kind=inner (
resources
| where type =~ 'microsoft.network/firewallpolicies'
| mv-expand properties.firewalls
| extend intrusionDetection = tostring(properties.intrusionDetection contains "Alert"
or properties.intrusionDetection contains "Deny")
| extend transportSecurity = tostring(properties.transportSecurity contains "keyVaultSecretId")
| extend FWID = tostring(properties_firewalls.id)
| where intrusionDetection == "False"
and transportSecurity == "False"
| project
PolicyName = name,
PolicySKU = tostring(properties.sku.tier),
intrusionDetection,
transportSecurity,
FWID
) on FWID
查詢:Azure 防火牆 和相關聯的子網分析
此 ARG 查詢會分析 Azure 防火牆及其 Azure 環境中的相關聯子網。 它提供有關哪些子網與每個 Azure 防火牆實例相關聯的深入見解。 將 Azure 防火牆置於中樞虛擬網路或虛擬 WAN 安全中樞的中央實例,可優化 Azure 防火牆的使用。 然後在從相同區域連線到相同中樞的許多輪輻虛擬網路之間共用相同的防火牆。
類別
最佳化
查詢
resources
| where type =~ 'Microsoft.Network/azureFirewalls' and properties.sku.tier=="Premium"
| project
FWID=id,
firewallName=name,
SkuTier=tostring(properties.sku.tier),
resourceGroup,
location
| join kind=inner (
resources
| where type =~ 'microsoft.network/firewallpolicies'
| mv-expand properties.firewalls
| extend intrusionDetection = tostring(properties.intrusionDetection contains "Alert"
or properties.intrusionDetection contains "Deny")
| extend transportSecurity = tostring(properties.transportSecurity contains "keyVaultSecretId")
| extend FWID=tostring(properties_firewalls.id)
| where intrusionDetection == "False"
and transportSecurity == "False"
| project
PolicyName = name,
PolicySKU = tostring(properties.sku.tier),
intrusionDetection,
transportSecurity,
FWID
) on FWID
應用程式閘道
Azure 應用程式閘道是網路流量負載平衡器,可讓您管理 Web 應用程式的流量。 它提供應用層級的路由與負載平衡服務,讓你能在 Azure 中建立一個可擴展且高度可用的網頁前端。
相關資源:
移除閒置的應用程式閘道
建議:移除沒有後端池的應用閘道,以避免不必要的成本。
關於閒置應用閘道
沒有後端池目標的應用閘道器並非積極路由流量,可能是未使用的資源。 這些閒置閘道即使沒有功能,仍持續產生成本。
Note
FinOps 集線器 能自動識別閒置的應用閘道器。 了解更多。
識別閒置的應用程式閘道器
請使用下列 ARG 查詢來識別後端集區為空的應用程式閘道。
resources
| where type =~ 'Microsoft.Network/applicationGateways'
| extend
backendPoolsCount = array_length(properties.backendAddressPools),
SKUName = tostring(properties.sku.name),
SKUTier = tostring(properties.sku.tier),
SKUCapacity = properties.sku.capacity,
backendPools = properties.backendAddressPools,
resourceGroup = strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup)
| project id, name, SKUName, SKUTier, SKUCapacity, resourceGroup, subscriptionId
| join (
resources
| where type =~ 'Microsoft.Network/applicationGateways'
| mvexpand backendPools = properties.backendAddressPools
| extend backendIPCount = array_length(backendPools.properties.backendIPConfigurations)
| extend backendAddressesCount = array_length(backendPools.properties.backendAddresses)
| extend backendPoolName = backendPools.properties.backendAddressPools.name
| summarize
backendIPCount = sum(backendIPCount),
backendAddressesCount = sum(backendAddressesCount)
by id
) on id
| project-away id1
| where (backendIPCount == 0 or isempty(backendIPCount))
and (backendAddressesCount==0 or isempty(backendAddressesCount))
| order by id asc
升級經典應用閘道
建議:在 v1 退役日前,將 Application Gateway v1 SKU 升級至 v2,以維持支援並取得改進功能。
關於經典應用閘道
Application Gateway v1 SKU(標準版與 WAF)即將退役。 v2 SKU 提供自動擴展、區域冗餘及提升效能。 移轉至 v2 可確保持續獲得支援,並可能透過自動擴縮(根據流量自動調整執行個體數量)來降低成本。
識別經典應用閘道
請使用以下 ARG 查詢來辨識仍在使用 v1 SKU 的應用閘道。
resources
| where type =~ 'microsoft.network/applicationgateways'
| where properties.sku.tier in ('Standard', 'WAF')
| project
ResourceId = tolower(id),
ResourceName = name,
SKUTier = tostring(properties.sku.tier),
Region = location,
ResourceGroupName = resourceGroup,
SubscriptionId = subscriptionId
DDOS 保護
Azure DDoS 防護提供對抗最複雜 DDoS 威脅的防禦措施。 它為您的應用及部署在虛擬網路中的資源提供強化的 DDoS 緩解能力。
相關資源:
移除與 DDoS 無關聯的 DDoS 防護計畫
建議:移除與任何虛擬網路無關的 DDoS 防護方案,以避免不必要的成本。
關於非關聯的 DDoS 防護計畫
DDoS 防護計畫會收取固定的月費。 不與任何虛擬網路相關的方案則沒有保障,卻仍會產生成本。 移除未使用的計劃可消除不必要的支出。
識別非關聯的 DDoS 防護計畫
請使用以下 ARG 查詢,找出與任何虛擬網路無關聯的 DDoS 防護計畫。
resources
| where type =~ 'microsoft.network/ddosprotectionplans'
| where isnull(properties.virtualNetworks) or array_length(properties.virtualNetworks) == 0
| project
ResourceId = tolower(id),
ResourceName = name,
Region = location,
ResourceGroupName = resourceGroup,
SubscriptionId = subscriptionId
ExpressRoute
Azure ExpressRoute 讓你能透過私人連線將本地網路擴展到 Microsoft 雲端。 ExpressRoute 電路會根據 SKU 和所配置的頻寬產生每月費用。
相關資源:
移除未配置的 ExpressRoute 電路
建議:刪除或配置處於未配置狀態的 ExpressRoute 電路,以避免不必要的費用。
關於未配置的 ExpressRoute 電路
保持在「未配置」狀態的 ExpressRoute 電路雖然沒有積極承載流量,但仍會產生每月費用。 這些迴路可能已建立,但服務提供者從未完成。 識別並移除這些問題可消除不必要的成本。
Note
FinOps 集線器 能自動識別未配置的 ExpressRoute 迴路。 了解更多。
識別未配置的 ExpressRoute 迴路
請使用以下 ARG 查詢以識別處於未配置狀態的 ExpressRoute 迴路。
resources
| where type =~ 'Microsoft.Network/expressRouteCircuits'
and properties.serviceProviderProvisioningState == "NotProvisioned"
| extend
ServiceLocation = tostring(properties.serviceProviderProperties.peeringLocation),
ServiceProvider = tostring(properties.serviceProviderProperties.serviceProviderName),
BandwidthInMbps = tostring(properties.serviceProviderProperties.bandwidthInMbps)
| project
ERId = id,
ERName = name,
ERRG = resourceGroup,
SKUName = tostring(sku.name),
SKUTier = tostring(sku.tier),
SKUFamily = tostring(sku.family),
ERLocation = location,
ServiceLocation,
ServiceProvider,
BandwidthInMbps
Load Balancer
Azure Load Balancer 運作於 OSI 模型的第 4 層,並將入站流量分配到健康的後端池實例。 它透過監控後端實例的健康狀況,並自動將流量從不健康實例中重新導向,來提供高可用性。
相關資源:
拆除閒置負載平衡器
建議:移除沒有後端池的負載平衡器,以避免不必要的成本。
關於閒置負載平衡器
沒有後端池目標的負載平衡器並未積極分配流量,可能代表未使用的資源。 標準 SKU 負載平衡器即使在閒置時也會產生成本,因此移除未使用的實例可以減少不必要的支出。
識別閒置負載平衡器
請使用下列 ARG 查詢,識別後端集區為空的標準 SKU 負載平衡器。
resources
| extend resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| extend SKUName = tostring(sku.name)
| extend SKUTier = tostring(sku.tier)
| extend location,backendAddressPools = properties.backendAddressPools
| where type =~ 'microsoft.network/loadbalancers'
and array_length(backendAddressPools) == 0
and sku.name!='Basic'
| order by id asc
| project
id,
name,
SKUName,
SKUTier,
backendAddressPools,
location,
resourceGroup,
subscriptionId
升級基本負載平衡器
建議:將已退休的 Basic SKU 負載平衡器升級為標準,以提升效能、安全性及持續支援。
關於基本負載平衡器
Azure Load Balancer 的基本 SKU 已於 2025 年 9 月 30 日淘汰。 基本負載平衡器不提供 SLA,缺乏可用性區支援,診斷功能也有限。 升級至 Standard SKU 能提升可靠性、效能及安全性。
識別基本負載平衡器
請使用以下 ARG 查詢,找出使用 Basic SKU 的負載平衡器。
resources
| where type =~ 'microsoft.network/loadbalancers'
| where sku.name =~ 'Basic'
| project
ResourceId = tolower(id),
ResourceName = name,
SKUName = tostring(sku.name),
Region = location,
ResourceGroupName = resourceGroup,
SubscriptionId = subscriptionId
NAT Gateway
Azure NAT 閘道 提供虛擬網路的外接網際網路連線。 NAT 閘道器透過提供受管且高度可用的 SNAT 服務,簡化了僅外撥的網際網路連線。
相關資源:
移除孤立 NAT 閘道器
建議:移除與任何子網無關聯的 NAT 閘道器,以避免不必要的費用。
關於閒置的 NAT 閘道器
NAT 閘道器會收取每小時費用和資料處理費用。 不隸屬於任何子網的閘道器就無法提供出站連線,代表浪費的支出。 這些孤立的閘道器在子網路或虛擬網路重新配置後仍可能存在。
識別孤立的 NAT 閘道
請使用以下 ARG 查詢來識別與任何子網無關聯的 NAT 閘道。
resources
| where type == "microsoft.network/natgateways"
| where isnull(properties.subnets) or array_length(properties.subnets) == 0
| project
id,
GWName = name,
SKUName = tostring(sku.name),
SKUTier = tostring(sku.tier),
Location = location,
resourceGroup = tostring(strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)),
subnets = properties.subnets,
subscriptionId
網路介面
Azure 網路介面(NIC)使 Azure 虛擬機能夠與互聯網、Azure 及本地資源通訊。 網路介面卡本身不會產生直接費用,但閒置的網路介面卡可能表示錯過了清理這些資源的時機,並使資源管理更加複雜。
移除未連接的網路介面
建議:移除未連接任何虛擬機或私有端點的網路介面,以保持環境乾淨並降低管理負擔。
關於未連接網路介面
當虛擬機被刪除時,其相關的網路介面可能不會自動被清理。 這些已成孤兒的 NIC 可能會隨著時間不斷累積,使您的環境變得雜亂,並可能持續占用公用 IP 等相關資源。 雖然網路介面不會直接產生費用,但清理這些網路介面可簡化資源管理,並可能找出其他孤立資源。
識別未連接的網路介面
請使用以下 ARG 查詢來識別未連接任何虛擬機或私人端點的網路介面。
resources
| where type =~ 'microsoft.network/networkinterfaces'
| where isnull(properties.virtualMachine) and isnull(properties.privateEndpoint)
| project
ResourceId = tolower(id),
ResourceName = name,
PrivateIP = tostring(properties.ipConfigurations[0].properties.privateIPAddress),
Region = location,
ResourceGroupName = resourceGroup,
SubscriptionId = subscriptionId
網路安全性群組
網路安全群組(NSG)用來過濾虛擬網路中與 Azure 資源之間的網路流量。 NSG 包含安全規則,允許或拒絕進出網路流量。
移除空的網路安全群組
建議:移除與任何網路介面或子網路無關聯的網路安全群組,以簡化環境並降低管理負擔。
關於空白的網路安全性群組
沒有與任何網路介面或子網相關的 NSG,並不會主動過濾流量。 這些未使用的資源在基礎設施變更時會累積,增加雜亂並使安全稽核更加複雜。 移除它們簡化了網路管理,並有助於維持環境的清潔。
識別空的網路安全群組
請使用以下 ARG 查詢來識別與任何網路介面或子網無關聯的 NSG。
resources
| where type =~ 'microsoft.network/networksecuritygroups'
| where isnull(properties.networkInterfaces) and isnull(properties.subnets)
| project
ResourceId = tolower(id),
ResourceName = name,
Region = location,
ResourceGroupName = resourceGroup,
SubscriptionId = subscriptionId
私用 DNS
下一節提供 私用 DNS 的 ARG 查詢。 其可協助您深入瞭解 私用 DNS 資源,並確保這些資源已使用適當的設定進行設定。
查詢:私用 DNS
此 ARG 查詢會分析 Azure 環境中 私用 DNS 區域,以識別任何沒有 虛擬網絡 連結的區域。
類別
最佳化
查詢
resources
| where type == "microsoft.network/privatednszones"
and properties.numberOfVirtualNetworkLinks == 0
| project id, PrivateDNSName=name,
NumberOfRecordSets = tostring(properties.numberOfRecordSets),
resourceGroup = tostring(strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)),
vNets = tostring(properties.properties.numberOfVirtualNetworkLinks),
subscriptionId
公用 IP 位址
Azure 公共 IP 位址使 Azure 資源能夠與網際網路及其他面向公開的 Azure 服務通訊。 公共 IP 位址會分配給虛擬機、負載平衡器和應用閘道等資源。 靜態公共 IP 位址無論是否與資源相關聯,都會產生成本。
相關資源:
升級基本公開 IP
建議:將已停用的 Basic SKU 的公共 IP 位址升級為標準,以提升安全性並持續支援。
關於基本公用 IP 位址
Azure 公用 IP 位址的 Basic SKU 已於 2025 年 9 月 30 日淘汰。 基本的公共 IP 缺乏區域冗餘,不支援路由偏好,且預設開放給入站流量。 升級至標準 SKU 提供區域冗餘、預設安全行為(對入站流量封閉)及路由偏好設定的支援。
Note
FinOps 集線器 能自動識別 Basic 公共 IP。 了解更多。
識別基本公共 IP
請使用以下 ARG 查詢,使用 Basic SKU 來辨識公共 IP 位址。
resources
| where type =~ 'microsoft.network/publicipaddresses'
| where sku.name =~ 'Basic'
| project
ResourceId = tolower(id),
ResourceName = name,
SKUName = tostring(sku.name),
AllocationMethod = tostring(properties.publicIPAllocationMethod),
Region = location,
ResourceGroupName = resourceGroup,
SubscriptionId = subscriptionId
移除閒置的公共 IP 位址
建議:移除未掛掛的靜態公共 IP 位址,以避免不必要的網路成本。
關於閒置的公共 IP 位址
靜態公共 IP 位址無論是否與資源相關聯都會產生成本。 未連結的公用 IP 可能會隨著時間累積,因為資源雖已刪除,但其相關聯的公用 IP 卻被保留下來。 識別並移除這些被遺忘的資源,可以降低不必要的成本。
Note
FinOps 集線器 能自動識別未掛接的公共 IP 位址。 了解更多。
識別閒置的公共 IP 位址
請使用以下 ARG 查詢來識別未掛掛的靜態公共 IP 位址,包括與未掛接網路介面相關的位址。
resources
| where type =~ 'Microsoft.Network/publicIPAddresses'
and isempty(properties.ipConfiguration)
and isempty(properties.natGateway)
and properties.publicIPAllocationMethod =~ 'Static'
| extend
PublicIpId = id,
IPName = name,
AllocationMethod = tostring(properties.publicIPAllocationMethod),
SKUName = sku.name,
Location = location,
resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| project PublicIpId, IPName, SKUName, resourceGroup, Location, AllocationMethod, subscriptionId
| union (
Resources
| where type =~ 'microsoft.network/networkinterfaces'
and isempty(properties.virtualMachine)
and isnull(properties.privateEndpoint)
and isnotempty(properties.ipConfigurations)
| extend IPconfig = properties.ipConfigurations
| mv-expand IPconfig
| extend PublicIpId= tostring(IPconfig.properties.publicIPAddress.id)
| project PublicIpId
| join (
resource
| where type =~ 'Microsoft.Network/publicIPAddresses'
| extend
PublicIpId = id,
IPName = name,
AllocationMethod = tostring(properties.publicIPAllocationMethod),
SKUName = sku.name,
resourceGroup,
Location = location
) on PublicIpId
| project
PublicIpId,
IPName,
SKUName,
resourceGroup,
Location,
AllocationMethod,
subscriptionId
)
查詢:識別公用IP位址路由方法
此 ARG 查詢會分析公用 IP 位址,並識別路由方法、配置方法和 SKU。 它也會分析與IP組態相關聯的公用IP位址的其他詳細數據。
類別
最佳化
查詢
resources
| where type =~ 'Microsoft.Network/publicIPAddresses'
and isnotempty(properties.ipConfiguration)
| where tostring(properties.ipTags) == "[]"
| extend
PublicIpId = id,
RoutingMethod = id,
IPName = name,
AllocationMethod = tostring(properties.publicIPAllocationMethod),
SKUName = sku.name,
Location = location,
resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| project
PublicIpId,
IPName,
RoutingMethod,SKUName,
resourceGroup,
Location,
AllocationMethod,
subscriptionId
查詢:檢查公用IP位址的 DDoS 保護原則
如果您需要保護少於15個公用IP資源,IP保護層是更具成本效益的選項。 不過,如果您有15個以上的公用IP資源來保護,則網路保護層會變得更符合成本效益。
類別
最佳化
查詢
resources
| where type == "microsoft.network/publicipaddresses"
| project ddosProtection = tostring(properties.ddosSettings), name
| where ddosProtection has "Enabled"
| count
| project TotalIpsProtected = Count
| extend CheckIpsProtected = iff(TotalIpsProtected >= 15, "Enable Network Protection tier", "Enable PIP DDoS Protection")
虛擬網路閘道
Azure 虛擬網路 閘道器提供 Azure 虛擬網路與本地基礎設施之間的跨端連接。 閘道器會根據其 SKU 按小時收費。
相關資源:
移除閒置的 VNet 閘道
建議:移除沒有任何活躍連線的虛擬網路閘道器,以避免不必要的費用。
關於閒置的 VNet 閘道器
虛擬網路閘道器會根據其 SKU 層級產生每小時成本,無論是否被積極使用。 沒有任何連線的閘道器無法提供跨場連接,反而是浪費的花費。 這些閒置閘道器可能在遷移後或連接需求改變後仍保留。
識別閒置的 VNet 閘道
請使用以下 ARG 查詢來識別沒有任何活躍連線的虛擬網路閘道器。
resources
| where type == "microsoft.network/virtualnetworkgateways"
| extend resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| project id, GWName=name, resourceGroup, location, subscriptionId
| join kind = leftouter(
resources
| where type == "microsoft.network/connections"
| extend id = tostring(properties.virtualNetworkGateway1.id)
| project id
) on id
| where isempty(id1)
| project
id,
GWName,
resourceGroup,
location,
subscriptionId,
status=id
提供意見反應
請寫下您的快速評價,讓我們知道我們的表現如何。 我們會使用這些評論來改善及擴充 FinOps 工具和資源。
如果您要尋找特定專案,請投票給現有專案或建立新想法。 與其他人分享想法,以獲得更多的選票。 我們專注於擁有最多選票的想法。
相關內容
相關資源:
相關解決方案: