网络方面的 FinOps 最佳做法

本文概述了针对网络服务的经过验证的 FinOps 实践。 他们专注于成本优化、效率改进和资源见解。


Azure 防火墙

以下部分提供用于Azure 防火墙的 Azure Resource Graph (ARG) 查询。 这些查询可帮助你深入了解 Azure 防火墙资源,并确保这些资源配置了适当的设置。 通过分析使用模式并采纳 Azure 顾问的建议,你可以优化 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 流量负载均衡器,可用于管理 Web 应用程序的流量。 它提供应用程序级路由和负载均衡服务,使你可以在Azure中构建可缩放且高度可用的 Web 前端。

相关资源:

删除空闲的应用程序网关

建议:删除没有任何后端池的应用程序网关,以避免不必要的成本。

关于空闲应用网关

没有任何后端池目标的应用程序网关不会主动路由流量,并且可能表示未使用的资源。 即使这些空闲网关无功能,这些空闲网关仍会产生费用。

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 停用日期之前将应用程序网关 v1 SKU 升级到 v2,以维护支持和访问改进的功能。

关于经典应用程序网关

应用程序网关 v1 SKU(标准和 WAF)即将停用。 v2 SKU 提供自动缩放、区域冗余和改进的性能。 迁移到 v2 可确保持续支持,并通过自动缩放来降低成本,从而根据流量自动调整实例数。

Note

FinOps 中心 可以使用 v1 SKU 自动识别经典应用程序网关。 了解详细信息

标识经典应用程序网关

使用以下 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 保护计划会产生固定的每月费用。 未与任何虚拟网络关联的计划不提供保护,但仍会产生成本。 删除未使用的计划可消除不必要的支出。

Note

FinOps 中心 可以自动标识未关联的 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

负载均衡器

Azure 负载均衡器 OSI 模型的第 4 层运行,并在正常的后端池实例之间分配入站流量。 它通过监视后端实例的运行状况并自动将流量从不正常的实例中重新路由,从而提供高可用性。

相关资源:

删除空闲负载均衡器

建议:删除没有任何后端池的负载均衡器,以避免不必要的成本。

关于空闲负载均衡器

没有后端池目标的负载均衡器不会主动分发流量,并且可能表示未使用的资源。 即使空闲,标准 SKU 负载均衡器也会产生成本,因此删除未使用的实例可以减少不必要的支出。

Note

FinOps 中心 可以自动识别空闲负载均衡器。 了解详细信息

识别空闲负载均衡器

使用以下 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

升级基本负载均衡器

建议:使用已停用的基本 SKU 将负载均衡器升级到标准版,以提高性能、安全性和持续支持。

关于基本负载均衡器

Azure 负载均衡器的基本 SKU 已于 2025 年 9 月 30 日停用。 基本负载均衡器不提供 SLA、缺少可用性区域支持,并且诊断功能有限。 升级到标准 SKU 可以提高可靠性、性能和安全功能。

Note

FinOps 中心 可以自动标识基本负载均衡器。 了解详细信息

识别基本负载均衡器

使用以下 ARG 查询来识别使用基本 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 网关

Azure NAT 网关为虚拟网络提供出站 Internet 连接。 NAT 网关通过提供托管的高可用性 SNAT 服务来简化仅限出站的 Internet 连接。

相关资源:

删除孤立的 NAT 网关

建议:删除未与任何子网关联的 NAT 网关,以避免不必要的费用。

关于孤立的 NAT 网关

NAT 网关会产生每小时费用和数据处理成本。 未与任何子网关联的网关无法提供出站连接,属于浪费开支。 这些孤立网关可能会在重新配置子网或虚拟网络后仍然遗留。

Note

FinOps 中心 可以自动标识孤立的 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 VM 能够与 Internet、Azure 和本地资源通信。 NIC 不会产生直接费用,但孤立的 NIC 可能表明存在遗漏的清理工作,并使资源管理更加复杂。

删除未附加的网络接口

建议:删除未附加到任何虚拟机或专用终结点的网络接口,以保持环境干净并减少管理开销。

关于未附加的网络接口

删除 VM 后,可能不会自动清理其关联的网络接口。 这些孤立的 NIC 可能会随着时间推移不断累积,使环境变得杂乱无章,并且还可能保留其关联资源,例如公网 IP。 虽然 NIC 不会产生直接费用,但清理它们可以简化资源管理,并可能显示其他孤立资源。

Note

FinOps 中心 可以自动标识未连接的网络接口。 了解详细信息

识别未附加的网络接口

使用以下 ARG 查询识别未关联到任何 VM 或专用终结点的网络接口。

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 不会主动筛选流量。 这些未使用的资源可以在基础结构更改期间累积,从而添加混乱和复杂的安全审核。 删除它们可简化网络管理,并帮助维护干净的环境。

Note

FinOps 中心 可以自动标识空的网络安全组。 了解详细信息

识别空的网络安全组

使用以下 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资源能够与 Internet 和其他面向公众的Azure服务进行通信。 公共 IP 地址分配给虚拟机、负载均衡器和应用程序网关等资源。 静态公共 IP 地址会产生成本,无论它们是否与资源相关联。

相关资源:

升级基本公共 IP 地址

建议:使用已停用的基本 SKU 将公共 IP 地址升级到标准版,以提高安全性和持续支持。

关于基本公共 IP 地址

Azure公共 IP 地址的基本 SKU 已于 2025 年 9 月 30 日停用。 基本公共 IP 缺少区域冗余,不支持路由首选项,并且默认对入站流量开放。 升级到标准 SKU 可提供区域冗余、默认安全行为(默认拒绝入站流量),并支持路由首选项。

Note

FinOps 中心 可以自动标识基本公共 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 地址,包括与未关联的网络接口相关联的 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 层级按小时收费,无论是否在主动使用。 没有任何连接的网关无法提供跨场所连接,还会造成成本浪费。 迁移后或连接要求发生更改时,这些空闲网关可能保持不变。

Note

FinOps 中心 可以自动标识空闲的 VNet 网关。 了解详细信息

识别空闲的 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 工具和资源。

如果您在寻找特定的东西,可以为现有想法投票或者创建新想法。 与他人分享想法,以获得更多的选票。 我们专注于拥有最多选票的想法。


相关资源:

相关解决方案: