diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 767edf7ba..6ca4dd7c3 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -3,7 +3,7 @@ title: FinOps toolkit changelog description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more. author: MSBrett ms.author: brettwil -ms.date: 09/09/2026 +ms.date: 09/11/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit @@ -67,6 +67,7 @@ The following section lists features and enhancements that are currently in deve - Switched the reservations and benefits workbooks from the retired `ccmstorageprod` isfratioblob.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** - Fixed a regression in the `AzureOptimizationConsumptionV1_CL` schema that was breaking the Reservations Usage workbook ([#2301](https://github.com/microsoft/finops-toolkit/issues/2301)). + - Fixed reservations disappearing from the reservation workbooks when their SKU is no longer sold. The instance size flexibility joins required a match, so an active reservation on a retired size was dropped from the report entirely rather than shown with its utilization. Unmatched SKUs now fall back to their own name as the flexibility group and a ratio of 1. The fallback applies to the reserved resource types that have instance size flexibility: virtual machines, Redis Cache, and dedicated hosts ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). ### [PowerShell module](powershell/powershell-commands.md) @@ -79,6 +80,9 @@ The following section lists features and enhancements that are currently in deve - **Added** - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). + - Ratios use the same scale as the retired isfratioblob.csv: each flexibility group is normalized so its smallest SKU is `1`, matching the retired file for 1,223 of the 1,291 rows the two share. The Catalogs API publishes them unnormalized, and the Optimization Engine converts quantities into units of a group's smallest SKU ([#2309](https://github.com/microsoft/finops-toolkit/issues/2309)). + - Covers every physical Azure region instead of a fixed region list, so SKUs that launch in only a handful of regions are included. + - Refreshes weekly from the live catalog, so newly released SKUs appear and retired SKUs age out without anyone republishing the file. **[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** diff --git a/docs-mslearn/toolkit/open-data.md b/docs-mslearn/toolkit/open-data.md index bed426f87..99cd98f92 100644 --- a/docs-mslearn/toolkit/open-data.md +++ b/docs-mslearn/toolkit/open-data.md @@ -4,7 +4,7 @@ description: Use open data to normalize and enhance your FinOps reporting, ensur ms.topic: concept-article author: flanakin ms.author: micflan -ms.date: 09/01/2026 +ms.date: 09/11/2026 ms.service: finops ms.subservice: finops-toolkit ms.reviewer: micflan @@ -185,17 +185,17 @@ Instance size flexibility (ISF) lets a reservation apply across multiple SKUs in Sample data: -| InstanceSizeFlexibilityGroup | ArmSkuName | Ratio | -| ---------------------------- | -------------- | ----- | -| Av2 Series | Standard_A1_v2 | 1 | -| Av2 Series | Standard_A2_v2 | 2.1 | -| Av2 Series | Standard_A4_v2 | 4.44 | +| InstanceSizeFlexibilityGroup | ArmSkuName | Ratio | +| ------------------------------------ | ----------------- | ----- | +| Virtual Machines Dadsv6-series Linux | Standard_D2ads_v6 | 1 | +| Virtual Machines Dadsv6-series Linux | Standard_D4ads_v6 | 2 | +| Virtual Machines Dadsv6-series Linux | Standard_D8ads_v6 | 4 | A few important notes about the data: -- It covers Virtual Machines, Redis Cache, and Dedicated Host. +- It covers Virtual Machines, Redis Cache, and Dedicated Host across every physical Azure region. - `ArmSkuName` is unique across the file and can be used as a join key on its own. -- Ratios are the raw Microsoft values within each group (the smallest SKU isn't always `1`). +- Ratios are normalized so the smallest SKU in each flexibility group has a ratio of `1`. Compare ratios only within a flexibility group. - Data is updated weekly via a GitHub Actions workflow and always reflects the current API catalog, so retired SKUs are removed automatically. diff --git a/src/open-data/InstanceSizeFlexibility.csv b/src/open-data/InstanceSizeFlexibility.csv index 498cb64d7..fb75c27bc 100644 --- a/src/open-data/InstanceSizeFlexibility.csv +++ b/src/open-data/InstanceSizeFlexibility.csv @@ -57,92 +57,57 @@ "Azure Redis Cache Premium","azure_redis_cache_premium_p3_cache","4" "Azure Redis Cache Premium","azure_redis_cache_premium_p4_cache","8" "Azure Redis Cache Premium","azure_redis_cache_premium_p5_cache","18.14" -"Basv2 Series","Standard_B16als_v2","113.4" -"Basv2 Series","Standard_B16as_v2","128.08" -"Basv2 Series","Standard_B2als_v2","8" -"Basv2 Series","Standard_B2as_v2","16" -"Basv2 Series","Standard_B2ats_v2","2" -"Basv2 Series","Standard_B32als_v2","226.6" -"Basv2 Series","Standard_B32as_v2","255.96" -"Basv2 Series","Standard_B4als_v2","28.3" -"Basv2 Series","Standard_B4as_v2","31.92" -"Basv2 Series","Standard_B8als_v2","56.6" -"Basv2 Series","Standard_B8as_v2","64.04" -"Bpsv2 Series","Standard_B16pls_v2","113.34" -"Bpsv2 Series","Standard_B16ps_v2","128.1" -"Bpsv2 Series","Standard_B2pls_v2","8" -"Bpsv2 Series","Standard_B2ps_v2","16" -"Bpsv2 Series","Standard_B2pts_v2","2" -"Bpsv2 Series","Standard_B4pls_v2","28.34" -"Bpsv2 Series","Standard_B4ps_v2","31.9" -"Bpsv2 Series","Standard_B8pls_v2","56.66" -"Bpsv2 Series","Standard_B8ps_v2","64.04" -"Bsv2 Series","Standard_B16ls_v2","113.27" -"Bsv2 Series","Standard_B16s_v2","128.08" -"Bsv2 Series","Standard_B2ls_v2","8" -"Bsv2 Series","Standard_B2s_v2","16" -"Bsv2 Series","Standard_B2ts_v2","2" -"Bsv2 Series","Standard_B32ls_v2","226.73" -"Bsv2 Series","Standard_B32s_v2","255.96" -"Bsv2 Series","Standard_B4ls_v2","28.27" -"Bsv2 Series","Standard_B4s_v2","31.92" -"Bsv2 Series","Standard_B8ls_v2","56.73" -"Bsv2 Series","Standard_B8s_v2","64.04" -"Dadsv5 Series","Standard_D16ads_v5","16" -"Dadsv5 Series","Standard_D2ads_v5","2" -"Dadsv5 Series","Standard_D32ads_v5","32" -"Dadsv5 Series","Standard_D48ads_v5","48" -"Dadsv5 Series","Standard_D4ads_v5","4" -"Dadsv5 Series","Standard_D64ads_v5","64" -"Dadsv5 Series","Standard_D8ads_v5","8" -"Dadsv5 Series","Standard_D96ads_v5","96" -"Dadsv5 Series DedicatedHost","dadsv5_type1","112" -"Dasv4 Series","Standard_D16as_v4","16" -"Dasv4 Series","Standard_D2as_v4","2" -"Dasv4 Series","Standard_D32as_v4","32" -"Dasv4 Series","Standard_D48as_v4","48" -"Dasv4 Series","Standard_D4as_v4","4" -"Dasv4 Series","Standard_D64as_v4","64" -"Dasv4 Series","Standard_D8as_v4","8" -"Dasv4 Series","Standard_D96as_v4","96" -"Dasv4 Series Dedicated Host","dasv4_type1","96" -"Dasv4 Series Dedicated Host","dasv4_type2","99.84" -"Dasv5 Series","Standard_D16as_v5","16" -"Dasv5 Series","Standard_D2as_v5","2" -"Dasv5 Series","Standard_D32as_v5","32" -"Dasv5 Series","Standard_D48as_v5","48" -"Dasv5 Series","Standard_D4as_v5","4" -"Dasv5 Series","Standard_D64as_v5","64" -"Dasv5 Series","Standard_D8as_v5","8" -"Dasv5 Series","Standard_D96as_v5","96" -"Dasv5 Series DedicatedHost","dasv5_type1","112" -"Dav4 Series","Standard_D16a_v4","16" -"Dav4 Series","Standard_D2a_v4","2" -"Dav4 Series","Standard_D32a_v4","32" -"Dav4 Series","Standard_D48a_v4","48" -"Dav4 Series","Standard_D4a_v4","4" -"Dav4 Series","Standard_D64a_v4","64" -"Dav4 Series","Standard_D8a_v4","8" -"Dav4 Series","Standard_D96a_v4","96" -"DCadsv5-series DedicatedHost","dcadsv5 type 1","112" -"DCadsv5-series Linux","Standard_DC16ads_v5","16" -"DCadsv5-series Linux","Standard_DC2ads_v5","2" -"DCadsv5-series Linux","Standard_DC32ads_v5","32" -"DCadsv5-series Linux","Standard_DC48ads_v5","48" -"DCadsv5-series Linux","Standard_DC4ads_v5","4" -"DCadsv5-series Linux","Standard_DC64ads_v5","64" -"DCadsv5-series Linux","Standard_DC8ads_v5","8" -"DCadsv5-series Linux","Standard_DC96ads_v5","96" -"DCasv5-series DedicatedHost","dcasv5 type 1","112" -"DCasv5-series Linux","Standard_DC16as_v5","16" -"DCasv5-series Linux","Standard_DC2as_v5","2" -"DCasv5-series Linux","Standard_DC32as_v5","32" -"DCasv5-series Linux","Standard_DC48as_v5","48" -"DCasv5-series Linux","Standard_DC4as_v5","4" -"DCasv5-series Linux","Standard_DC64as_v5","64" -"DCasv5-series Linux","Standard_DC8as_v5","8" -"DCasv5-series Linux","Standard_DC96as_v5","96" -"DCdsv3 Series DedicatedHost","dcdsv3 type1","60" +"BS Series High Memory","Standard_B20ms","1" +"Basv2 Series","Standard_B16als_v2","56.7" +"Basv2 Series","Standard_B16as_v2","64.04" +"Basv2 Series","Standard_B2als_v2","4" +"Basv2 Series","Standard_B2as_v2","8" +"Basv2 Series","Standard_B2ats_v2","1" +"Basv2 Series","Standard_B32als_v2","113.3" +"Basv2 Series","Standard_B32as_v2","127.98" +"Basv2 Series","Standard_B4als_v2","14.15" +"Basv2 Series","Standard_B4as_v2","15.96" +"Basv2 Series","Standard_B8als_v2","28.3" +"Basv2 Series","Standard_B8as_v2","32.02" +"Bpsv2 Series","Standard_B16pls_v2","56.67" +"Bpsv2 Series","Standard_B16ps_v2","64.05" +"Bpsv2 Series","Standard_B2pls_v2","4" +"Bpsv2 Series","Standard_B2ps_v2","8" +"Bpsv2 Series","Standard_B2pts_v2","1" +"Bpsv2 Series","Standard_B4pls_v2","14.17" +"Bpsv2 Series","Standard_B4ps_v2","15.95" +"Bpsv2 Series","Standard_B8pls_v2","28.33" +"Bpsv2 Series","Standard_B8ps_v2","32.02" +"Bsv2 Series","Standard_B16ls_v2","56.635" +"Bsv2 Series","Standard_B16s_v2","64.04" +"Bsv2 Series","Standard_B2ls_v2","4" +"Bsv2 Series","Standard_B2s_v2","8" +"Bsv2 Series","Standard_B2ts_v2","1" +"Bsv2 Series","Standard_B32ls_v2","113.365" +"Bsv2 Series","Standard_B32s_v2","127.98" +"Bsv2 Series","Standard_B4ls_v2","14.135" +"Bsv2 Series","Standard_B4s_v2","15.96" +"Bsv2 Series","Standard_B8ls_v2","28.365" +"Bsv2 Series","Standard_B8s_v2","32.02" +"DCadsv5-series DedicatedHost","dcadsv5 type 1","1" +"DCadsv5-series Linux","Standard_DC16ads_v5","8" +"DCadsv5-series Linux","Standard_DC2ads_v5","1" +"DCadsv5-series Linux","Standard_DC32ads_v5","16" +"DCadsv5-series Linux","Standard_DC48ads_v5","24" +"DCadsv5-series Linux","Standard_DC4ads_v5","2" +"DCadsv5-series Linux","Standard_DC64ads_v5","32" +"DCadsv5-series Linux","Standard_DC8ads_v5","4" +"DCadsv5-series Linux","Standard_DC96ads_v5","48" +"DCasv5-series DedicatedHost","dcasv5 type 1","1" +"DCasv5-series Linux","Standard_DC16as_v5","8" +"DCasv5-series Linux","Standard_DC2as_v5","1" +"DCasv5-series Linux","Standard_DC32as_v5","16" +"DCasv5-series Linux","Standard_DC48as_v5","24" +"DCasv5-series Linux","Standard_DC4as_v5","2" +"DCasv5-series Linux","Standard_DC64as_v5","32" +"DCasv5-series Linux","Standard_DC8as_v5","4" +"DCasv5-series Linux","Standard_DC96as_v5","48" +"DCdsv3 Series DedicatedHost","dcdsv3 type1","1" "DCdsv3 Series Linux","Standard_DC16ds_v3","16" "DCdsv3 Series Linux","Standard_DC1ds_v3","1" "DCdsv3 Series Linux","Standard_DC24ds_v3","24" @@ -151,7 +116,7 @@ "DCdsv3 Series Linux","Standard_DC48ds_v3","48" "DCdsv3 Series Linux","Standard_DC4ds_v3","4" "DCdsv3 Series Linux","Standard_DC8ds_v3","8" -"DCsv3 Series DedicatedHost","dcsv3 type1","51" +"DCsv3 Series DedicatedHost","dcsv3 type1","1" "DCsv3 Series Linux","Standard_DC16s_v3","16" "DCsv3 Series Linux","Standard_DC1s_v3","1" "DCsv3 Series Linux","Standard_DC24s_v3","24" @@ -160,458 +125,492 @@ "DCsv3 Series Linux","Standard_DC48s_v3","48" "DCsv3 Series Linux","Standard_DC4s_v3","4" "DCsv3 Series Linux","Standard_DC8s_v3","8" -"Ddsv4 Series","Standard_D16ds_v4","16" -"Ddsv4 Series","Standard_D2ds_v4","2" -"Ddsv4 Series","Standard_D32ds_v4","32" -"Ddsv4 Series","Standard_D48ds_v4","48" -"Ddsv4 Series","Standard_D4ds_v4","4" -"Ddsv4 Series","Standard_D64ds_v4","64" -"Ddsv4 Series","Standard_D8ds_v4","8" -"Ddsv4 Series Dedicated Host","ddsv4_type 1","68" -"Ddsv4 Series Dedicated Host","ddsv4_type2","80.92" -"Ddsv5 Series","Standard_D16ds_v5","16" -"Ddsv5 Series","Standard_D2ds_v5","2" -"Ddsv5 Series","Standard_D32ds_v5","32" -"Ddsv5 Series","Standard_D48ds_v5","48" -"Ddsv5 Series","Standard_D4ds_v5","4" -"Ddsv5 Series","Standard_D64ds_v5","64" -"Ddsv5 Series","Standard_D8ds_v5","8" -"Ddsv5 Series","Standard_D96ds_v5","96" -"Ddsv5 Series DedicatedHost","ddsv5_type1","107" -"Ddv4 Series","Standard_D16d_v4","16" -"Ddv4 Series","Standard_D2d_v4","2" -"Ddv4 Series","Standard_D32d_v4","32" -"Ddv4 Series","Standard_D48d_v4","48" -"Ddv4 Series","Standard_D4d_v4","4" -"Ddv4 Series","Standard_D64d_v4","64" -"Ddv4 Series","Standard_D8d_v4","8" -"Ddv5 Series","Standard_D16d_v5","16" -"Ddv5 Series","Standard_D2d_v5","2" -"Ddv5 Series","Standard_D32d_v5","32" -"Ddv5 Series","Standard_D48d_v5","48" -"Ddv5 Series","Standard_D4d_v5","4" -"Ddv5 Series","Standard_D64d_v5","64" -"Ddv5 Series","Standard_D8d_v5","8" -"Ddv5 Series","Standard_D96d_v5","96" -"Dldsv5 Series","Standard_D16lds_v5","16" -"Dldsv5 Series","Standard_D2lds_v5","2" -"Dldsv5 Series","Standard_D32lds_v5","32" -"Dldsv5 Series","Standard_D48lds_v5","48" -"Dldsv5 Series","Standard_D4lds_v5","4" -"Dldsv5 Series","Standard_D64lds_v5","64" -"Dldsv5 Series","Standard_D8lds_v5","8" -"Dldsv5 Series","Standard_D96lds_v5","96" -"Dlsv5 Series","Standard_D16ls_v5","16" -"Dlsv5 Series","Standard_D2ls_v5","2" -"Dlsv5 Series","Standard_D32ls_v5","32" -"Dlsv5 Series","Standard_D48ls_v5","48" -"Dlsv5 Series","Standard_D4ls_v5","4" -"Dlsv5 Series","Standard_D64ls_v5","64" -"Dlsv5 Series","Standard_D8ls_v5","8" -"Dlsv5 Series","Standard_D96ls_v5","96" -"Dpdsv5 Series","Standard_D16pds_v5","16" -"Dpdsv5 Series","Standard_D2pds_v5","2" -"Dpdsv5 Series","Standard_D32pds_v5","32" -"Dpdsv5 Series","Standard_D48pds_v5","48" -"Dpdsv5 Series","Standard_D4pds_v5","4" -"Dpdsv5 Series","Standard_D64pds_v5","64" -"Dpdsv5 Series","Standard_D8pds_v5","8" -"Dpldsv5 Series","Standard_D16plds_v5","16" -"Dpldsv5 Series","Standard_D2plds_v5","2" -"Dpldsv5 Series","Standard_D32plds_v5","32" -"Dpldsv5 Series","Standard_D48plds_v5","48" -"Dpldsv5 Series","Standard_D4plds_v5","4" -"Dpldsv5 Series","Standard_D64plds_v5","64" -"Dpldsv5 Series","Standard_D8plds_v5","8" -"Dplsv5 Series","Standard_D16pls_v5","16" -"Dplsv5 Series","Standard_D2pls_v5","2" -"Dplsv5 Series","Standard_D32pls_v5","32" -"Dplsv5 Series","Standard_D48pls_v5","48" -"Dplsv5 Series","Standard_D4pls_v5","4" -"Dplsv5 Series","Standard_D64pls_v5","64" -"Dplsv5 Series","Standard_D8pls_v5","8" -"Dpsv5 Series","Standard_D16ps_v5","16" -"Dpsv5 Series","Standard_D2ps_v5","2" -"Dpsv5 Series","Standard_D32ps_v5","32" -"Dpsv5 Series","Standard_D48ps_v5","48" -"Dpsv5 Series","Standard_D4ps_v5","4" -"Dpsv5 Series","Standard_D64ps_v5","64" -"Dpsv5 Series","Standard_D8ps_v5","8" "DSv2 Series","Standard_DS1_v2","1" "DSv2 Series","Standard_DS2_v2","2" "DSv2 Series","Standard_DS3_v2","4" "DSv2 Series","Standard_DS4_v2","8" "DSv2 Series","Standard_DS5_v2","16" -"DSv2 Series High Memory","Standard_DS11_v2","2" -"DSv2 Series High Memory","Standard_DS11-1_v2","2" -"DSv2 Series High Memory","Standard_DS12_v2","4" -"DSv2 Series High Memory","Standard_DS12-1_v2","4" -"DSv2 Series High Memory","Standard_DS12-2_v2","4" -"DSv2 Series High Memory","Standard_DS13_v2","8" -"DSv2 Series High Memory","Standard_DS13-2_v2","8" -"DSv2 Series High Memory","Standard_DS13-4_v2","8" -"DSv2 Series High Memory","Standard_DS14_v2","16" -"DSv2 Series High Memory","Standard_DS14-4_v2","16" -"DSv2 Series High Memory","Standard_DS14-8_v2","16" -"DSv2 Series High Memory","Standard_DS15_v2","20" -"DSv3 Series Dedicated Host","dsv3_type3","85" -"DSv3 Series Dedicated Host","dsv3_type4","106.08" -"Dsv4 Series","Standard_D16s_v4","16" -"Dsv4 Series","Standard_D2s_v4","2" -"Dsv4 Series","Standard_D32s_v4","32" -"Dsv4 Series","Standard_D48s_v4","48" -"Dsv4 Series","Standard_D4s_v4","4" -"Dsv4 Series","Standard_D64s_v4","64" -"Dsv4 Series","Standard_D8s_v4","8" -"DSv4 Series Dedicated Host","dsv4_type1","80" -"DSv4 Series Dedicated Host","dsv4_type2","96" -"Dsv5 Series","Standard_D16s_v5","16" -"Dsv5 Series","Standard_D2s_v5","2" -"Dsv5 Series","Standard_D32s_v5","32" -"Dsv5 Series","Standard_D48s_v5","48" -"Dsv5 Series","Standard_D4s_v5","4" -"Dsv5 Series","Standard_D64s_v5","64" -"Dsv5 Series","Standard_D8s_v5","8" -"Dsv5 Series","Standard_D96s_v5","96" -"Dsv5 Series DedicatedHost","dsv5_type1","107" -"Dv4 Series","Standard_D16_v4","16" -"Dv4 Series","Standard_D2_v4","2" -"Dv4 Series","Standard_D32_v4","32" -"Dv4 Series","Standard_D4_v4","4" -"Dv4 Series","Standard_D48_v4","48" -"Dv4 Series","Standard_D64_v4","64" -"Dv4 Series","Standard_D8_v4","8" -"Dv5 Series","Standard_D16_v5","16" -"Dv5 Series","Standard_D2_v5","2" -"Dv5 Series","Standard_D32_v5","32" -"Dv5 Series","Standard_D4_v5","4" -"Dv5 Series","Standard_D48_v5","48" -"Dv5 Series","Standard_D64_v5","64" -"Dv5 Series","Standard_D8_v5","8" -"Dv5 Series","Standard_D96_v5","96" -"Eadsv5 Series","Standard_E112iads_v5","123.2" -"Eadsv5 Series","Standard_E16-4ads_v5","16" -"Eadsv5 Series","Standard_E16-8ads_v5","16" -"Eadsv5 Series","Standard_E16ads_v5","16" -"Eadsv5 Series","Standard_E20ads_v5","20" -"Eadsv5 Series","Standard_E2ads_v5","2" -"Eadsv5 Series","Standard_E32-16ads_v5","32" -"Eadsv5 Series","Standard_E32-8ads_v5","32" -"Eadsv5 Series","Standard_E32ads_v5","32" -"Eadsv5 Series","Standard_E4-2ads_v5","4" -"Eadsv5 Series","Standard_E48ads_v5","48" -"Eadsv5 Series","Standard_E4ads_v5","4" -"Eadsv5 Series","Standard_E64-16ads_v5","64" -"Eadsv5 Series","Standard_E64-32ads_v5","64" -"Eadsv5 Series","Standard_E64ads_v5","64" -"Eadsv5 Series","Standard_E8-2ads_v5","8" -"Eadsv5 Series","Standard_E8-4ads_v5","8" -"Eadsv5 Series","Standard_E8ads_v5","8" -"Eadsv5 Series","Standard_E96-24ads_v5","96" -"Eadsv5 Series","Standard_E96-48ads_v5","96" -"Eadsv5 Series","Standard_E96ads_v5","96" -"Eadsv5 Series DedicatedHost","eadsv5_type1","112" -"Easv4 Series","Standard_E16-4as_v4","16" -"Easv4 Series","Standard_E16-8as_v4","16" -"Easv4 Series","Standard_E16as_v4","16" -"Easv4 Series","Standard_E20as_v4","20" -"Easv4 Series","Standard_E2as_v4","2" -"Easv4 Series","Standard_E32-16as_v4","32" -"Easv4 Series","Standard_E32-8as_v4","32" -"Easv4 Series","Standard_E32as_v4","32" -"Easv4 Series","Standard_E4-2as_v4","4" -"Easv4 Series","Standard_E48as_v4","48" -"Easv4 Series","Standard_E4as_v4","4" -"Easv4 Series","Standard_E64-16as_v4","64" -"Easv4 Series","Standard_E64-32as_v4","64" -"Easv4 Series","Standard_E64as_v4","64" -"Easv4 Series","Standard_E8-2as_v4","8" -"Easv4 Series","Standard_E8-4as_v4","8" -"Easv4 Series","Standard_E8as_v4","8" -"Easv4 Series","Standard_E96-24as_v4","96" -"Easv4 Series","Standard_E96-48as_v4","96" -"Easv4 Series","Standard_E96as_v4","96" -"Easv4 Series","Standard_E96ias_v4","96" -"Easv4 Series Dedicated Host","easv4_type1","96" -"Easv4 Series Dedicated Host","easv4_type2","112" -"Easv5 Series","Standard_E112ias_v5","123.2" -"Easv5 Series","Standard_E16-4as_v5","16" -"Easv5 Series","Standard_E16-8as_v5","16" -"Easv5 Series","Standard_E16as_v5","16" -"Easv5 Series","Standard_E20as_v5","20" -"Easv5 Series","Standard_E2as_v5","2" -"Easv5 Series","Standard_E32-16as_v5","32" -"Easv5 Series","Standard_E32-8as_v5","32" -"Easv5 Series","Standard_E32as_v5","32" -"Easv5 Series","Standard_E4-2as_v5","4" -"Easv5 Series","Standard_E48as_v5","48" -"Easv5 Series","Standard_E4as_v5","4" -"Easv5 Series","Standard_E64-16as_v5","64" -"Easv5 Series","Standard_E64-32as_v5","64" -"Easv5 Series","Standard_E64as_v5","64" -"Easv5 Series","Standard_E8-2as_v5","8" -"Easv5 Series","Standard_E8-4as_v5","8" -"Easv5 Series","Standard_E8as_v5","8" -"Easv5 Series","Standard_E96-24as_v5","96" -"Easv5 Series","Standard_E96-48as_v5","96" -"Easv5 Series","Standard_E96as_v5","96" -"Easv5 Series DedicatedHost","easv5_type1","112" -"Eav4 Series","Standard_E16a_v4","16" -"Eav4 Series","Standard_E20a_v4","20" -"Eav4 Series","Standard_E2a_v4","2" -"Eav4 Series","Standard_E32a_v4","32" -"Eav4 Series","Standard_E48a_v4","48" -"Eav4 Series","Standard_E4a_v4","4" -"Eav4 Series","Standard_E64a_v4","64" -"Eav4 Series","Standard_E8a_v4","8" -"Eav4 Series","Standard_E96a_v4","96" -"Ebdsv5 Series","Standard_E112ibds_v5","123.2" -"Ebdsv5 Series","Standard_E16bds_v5","16" -"Ebdsv5 Series","Standard_E2bds_v5","2" -"Ebdsv5 Series","Standard_E32bds_v5","32" -"Ebdsv5 Series","Standard_E48bds_v5","48" -"Ebdsv5 Series","Standard_E4bds_v5","4" -"Ebdsv5 Series","Standard_E64bds_v5","64" -"Ebdsv5 Series","Standard_E8bds_v5","8" -"Ebdsv5 Series","Standard_E96bds_v5","96" -"Ebdsv5 Series Dedicated Host","ebdsv5-type1","112" -"Ebsv5 Series","Standard_E112ibs_v5","123.2" -"Ebsv5 Series","Standard_E16bs_v5","16" -"Ebsv5 Series","Standard_E2bs_v5","2" -"Ebsv5 Series","Standard_E32bs_v5","32" -"Ebsv5 Series","Standard_E48bs_v5","48" -"Ebsv5 Series","Standard_E4bs_v5","4" -"Ebsv5 Series","Standard_E64bs_v5","64" -"Ebsv5 Series","Standard_E8bs_v5","8" -"Ebsv5 Series","Standard_E96bs_v5","96" -"Ebsv5 Series Dedicated Host","ebsv5-type1","112" -"ECadsv5-series DedicatedHost","ecadsv5 type 1","112" -"ECadsv5-series Linux","Standard_EC16ads_v5","16" -"ECadsv5-series Linux","Standard_EC20ads_v5","20" -"ECadsv5-series Linux","Standard_EC2ads_v5","2" -"ECadsv5-series Linux","Standard_EC32ads_v5","32" -"ECadsv5-series Linux","Standard_EC48ads_v5","48" -"ECadsv5-series Linux","Standard_EC4ads_v5","4" -"ECadsv5-series Linux","Standard_EC64ads_v5","64" -"ECadsv5-series Linux","Standard_EC8ads_v5","8" -"ECadsv5-series Linux","Standard_EC96ads_v5","96" -"ECadsv5-series Linux","Standard_EC96iads_v5","105.6" -"ECasv5-series DedicatedHost","ecasv5 type 1","112" -"ECasv5-series Linux","Standard_EC16as_v5","16" -"ECasv5-series Linux","Standard_EC20as_v5","20" -"ECasv5-series Linux","Standard_EC2as_v5","2" -"ECasv5-series Linux","Standard_EC32as_v5","32" -"ECasv5-series Linux","Standard_EC48as_v5","48" -"ECasv5-series Linux","Standard_EC4as_v5","4" -"ECasv5-series Linux","Standard_EC64as_v5","64" -"ECasv5-series Linux","Standard_EC8as_v5","8" -"ECasv5-series Linux","Standard_EC96as_v5","96" -"ECasv5-series Linux","Standard_EC96ias_v5","105.6" -"Edsv4 Series","Standard_E16-4ds_v4","16" -"Edsv4 Series","Standard_E16-8ds_v4","16" -"Edsv4 Series","Standard_E16ds_v4","16" -"Edsv4 Series","Standard_E20ds_v4","20" -"Edsv4 Series","Standard_E2ds_v4","2" -"Edsv4 Series","Standard_E32-16ds_v4","32" -"Edsv4 Series","Standard_E32-8ds_v4","32" -"Edsv4 Series","Standard_E32ds_v4","32" -"Edsv4 Series","Standard_E4-2ds_v4","4" -"Edsv4 Series","Standard_E48ds_v4","48" -"Edsv4 Series","Standard_E4ds_v4","4" -"Edsv4 Series","Standard_E64-16ds_v4","64" -"Edsv4 Series","Standard_E64-32ds_v4","64" -"Edsv4 Series","Standard_E64ds_v4","64" -"Edsv4 Series","Standard_E8-2ds_v4","8" -"Edsv4 Series","Standard_E8-4ds_v4","8" -"Edsv4 Series","Standard_E8ds_v4","8" -"Edsv4 Series Dedicated Host","edsv4_type 1","68" -"Edsv4 Series Dedicated Host","edsv4_type2","80.92" -"Edsv4 Series Isolated","Standard_E80ids_v4","80" -"Edsv5 Series","Standard_E16-4ds_v5","16" -"Edsv5 Series","Standard_E16-8ds_v5","16" -"Edsv5 Series","Standard_E16ds_v5","16" -"Edsv5 Series","Standard_E20ds_v5","20" -"Edsv5 Series","Standard_E2ds_v5","2" -"Edsv5 Series","Standard_E32-16ds_v5","32" -"Edsv5 Series","Standard_E32-8ds_v5","32" -"Edsv5 Series","Standard_E32ds_v5","32" -"Edsv5 Series","Standard_E4-2ds_v5","4" -"Edsv5 Series","Standard_E48ds_v5","48" -"Edsv5 Series","Standard_E4ds_v5","4" -"Edsv5 Series","Standard_E64-16ds_v5","64" -"Edsv5 Series","Standard_E64-32ds_v5","64" -"Edsv5 Series","Standard_E64ds_v5","64" -"Edsv5 Series","Standard_E8-2ds_v5","8" -"Edsv5 Series","Standard_E8-4ds_v5","8" -"Edsv5 Series","Standard_E8ds_v5","8" -"Edsv5 Series","Standard_E96-24ds_v5","96" -"Edsv5 Series","Standard_E96-48ds_v5","96" -"Edsv5 Series","Standard_E96ds_v5","96" -"Edsv5 Series DedicatedHost","edsv5_type1","107" -"Edsv5 Series Isolated","Standard_E104ids_v5","104" -"Edv4 Series","Standard_E16d_v4","16" -"Edv4 Series","Standard_E20d_v4","20" -"Edv4 Series","Standard_E2d_v4","2" -"Edv4 Series","Standard_E32d_v4","32" -"Edv4 Series","Standard_E48d_v4","48" -"Edv4 Series","Standard_E4d_v4","4" -"Edv4 Series","Standard_E64d_v4","64" -"Edv4 Series","Standard_E8d_v4","8" -"Edv5 Series","Standard_E104id_v5","114.4" -"Edv5 Series","Standard_E16d_v5","16" -"Edv5 Series","Standard_E20d_v5","20" -"Edv5 Series","Standard_E2d_v5","2" -"Edv5 Series","Standard_E32d_v5","32" -"Edv5 Series","Standard_E48d_v5","48" -"Edv5 Series","Standard_E4d_v5","4" -"Edv5 Series","Standard_E64d_v5","64" -"Edv5 Series","Standard_E8d_v5","8" -"Edv5 Series","Standard_E96d_v5","96" -"Epdsv5 Series","Standard_E16pds_v5","16" -"Epdsv5 Series","Standard_E20pds_v5","20" -"Epdsv5 Series","Standard_E2pds_v5","2" -"Epdsv5 Series","Standard_E32pds_v5","32" -"Epdsv5 Series","Standard_E4pds_v5","4" -"Epdsv5 Series","Standard_E8pds_v5","8" -"Epsv5 Series","Standard_E16ps_v5","16" -"Epsv5 Series","Standard_E20ps_v5","20" -"Epsv5 Series","Standard_E2ps_v5","2" -"Epsv5 Series","Standard_E32ps_v5","32" -"Epsv5 Series","Standard_E4ps_v5","4" -"Epsv5 Series","Standard_E8ps_v5","8" -"ESv3 Series","Standard_E16-4s_v3","16" -"ESv3 Series","Standard_E16-8s_v3","16" -"ESv3 Series","Standard_E16s_v3","16" -"ESv3 Series","Standard_E20s_v3","20" -"ESv3 Series","Standard_E2s_v3","2" -"ESv3 Series","Standard_E32-16s_v3","32" -"ESv3 Series","Standard_E32-8s_v3","32" -"ESv3 Series","Standard_E32s_v3","32" -"ESv3 Series","Standard_E4-2s_v3","4" -"ESv3 Series","Standard_E48s_v3","48" -"ESv3 Series","Standard_E4s_v3","4" -"ESv3 Series","Standard_E64-16s_v3","57.6" -"ESv3 Series","Standard_E64-32s_v3","57.6" -"ESv3 Series","Standard_E64s_v3","57.6" -"ESv3 Series","Standard_E8-2s_v3","8" -"ESv3 Series","Standard_E8-4s_v3","8" -"ESv3 Series","Standard_E8s_v3","8" -"ESv3 Series Dedicated Host","esv3_type3","68.82" -"ESv3 Series Dedicated Host","esv3_type4","93" -"Esv4 Series","Standard_E16-4s_v4","16" -"Esv4 Series","Standard_E16-8s_v4","16" -"Esv4 Series","Standard_E16s_v4","16" -"Esv4 Series","Standard_E20s_v4","20" -"Esv4 Series","Standard_E2s_v4","2" -"Esv4 Series","Standard_E32-16s_v4","32" -"Esv4 Series","Standard_E32-8s_v4","32" -"Esv4 Series","Standard_E32s_v4","32" -"Esv4 Series","Standard_E4-2s_v4","4" -"Esv4 Series","Standard_E48s_v4","48" -"Esv4 Series","Standard_E4s_v4","4" -"Esv4 Series","Standard_E64-16s_v4","64" -"Esv4 Series","Standard_E64-32s_v4","64" -"Esv4 Series","Standard_E64s_v4","64" -"Esv4 Series","Standard_E8-2s_v4","8" -"Esv4 Series","Standard_E8-4s_v4","8" -"Esv4 Series","Standard_E8s_v4","8" -"ESv4 Series Dedicated Host","esv4_type1","64" -"ESv4 Series Dedicated Host","esv4_type2","83.84" -"ESv4 Series Dedicated Host","standard_e64is_v4_special","64" -"Esv4 Series Isolated","Standard_E80is_v4","80" -"Esv5 Series","Standard_E16-4s_v5","16" -"Esv5 Series","Standard_E16-8s_v5","16" -"Esv5 Series","Standard_E16s_v5","16" -"Esv5 Series","Standard_E20s_v5","20" -"Esv5 Series","Standard_E2s_v5","2" -"Esv5 Series","Standard_E32-16s_v5","32" -"Esv5 Series","Standard_E32-8s_v5","32" -"Esv5 Series","Standard_E32s_v5","32" -"Esv5 Series","Standard_E4-2s_v5","4" -"Esv5 Series","Standard_E48s_v5","48" -"Esv5 Series","Standard_E4s_v5","4" -"Esv5 Series","Standard_E64-16s_v5","64" -"Esv5 Series","Standard_E64-32s_v5","64" -"Esv5 Series","Standard_E64s_v5","64" -"Esv5 Series","Standard_E8-2s_v5","8" -"Esv5 Series","Standard_E8-4s_v5","8" -"Esv5 Series","Standard_E8s_v5","8" -"Esv5 Series","Standard_E96-24s_v5","96" -"Esv5 Series","Standard_E96-48s_v5","96" -"Esv5 Series","Standard_E96s_v5","96" -"Esv5 Series DedicatedHost","esv5_type1","107" -"Esv5 Series Isolated","Standard_E104is_v5","104" -"Ev4 Series","Standard_E16_v4","16" -"Ev4 Series","Standard_E2_v4","2" -"Ev4 Series","Standard_E20_v4","20" -"Ev4 Series","Standard_E32_v4","32" -"Ev4 Series","Standard_E4_v4","4" -"Ev4 Series","Standard_E48_v4","48" -"Ev4 Series","Standard_E64_v4","64" -"Ev4 Series","Standard_E8_v4","8" -"Ev5 Series","Standard_E104i_v5","114.4" -"Ev5 Series","Standard_E16_v5","16" -"Ev5 Series","Standard_E2_v5","2" -"Ev5 Series","Standard_E20_v5","20" -"Ev5 Series","Standard_E32_v5","32" -"Ev5 Series","Standard_E4_v5","4" -"Ev5 Series","Standard_E48_v5","48" -"Ev5 Series","Standard_E64_v5","64" -"Ev5 Series","Standard_E8_v5","8" -"Ev5 Series","Standard_E96_v5","96" -"FSv2 Series","Standard_F16s_v2","16" -"FSv2 Series","Standard_F2s_v2","2" -"FSv2 Series","Standard_F32s_v2","32" -"FSv2 Series","Standard_F48s_v2","48" -"FSv2 Series","Standard_F4s_v2","4" -"FSv2 Series","Standard_F64s_v2","64" -"FSv2 Series","Standard_F72s_v2","72" -"FSv2 Series","Standard_F8s_v2","8" -"FSv2 Series Dedicated Host","fsv2 type3","93.6" -"FSv2 Series Dedicated Host","fsv2_type2","80" -"FSv2 Series Dedicated Host","fsv2_type4","106.4" -"FX Series Dedicated Host","fxmds type1","56" -"FX Series Linux","Standard_FX12mds","12" -"FX Series Linux","Standard_FX24mds","24" -"FX Series Linux","Standard_FX36mds","36" -"FX Series Linux","Standard_FX48mds","48" -"FX Series Linux","Standard_FX4mds","4" -"HBrsv3 Series Low Latency","Standard_HB120-16rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120-32rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120-64rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120-96rs_v3","120" -"HBrsv3 Series Low Latency","Standard_HB120rs_v3","120" -"HBSv2 Series Low Latency","Standard_HB120-16rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-32rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-64rs_v2","120" -"HBSv2 Series Low Latency","Standard_HB120-96rs_v2","120" -"HCS Series","Standard_HC44-16rs","44" -"HCS Series","Standard_HC44-32rs","44" -"HCS Series","Standard_HC44rs","44" -"Lasv3 Series DedicatedHost","lasv3_type1","80" -"Lasv3 Series Linux","Standard_L16as_v3","16" -"Lasv3 Series Linux","Standard_L32as_v3","32" -"Lasv3 Series Linux","Standard_L48as_v3","48" -"Lasv3 Series Linux","Standard_L64as_v3","64" -"Lasv3 Series Linux","Standard_L80as_v3","80" -"Lasv3 Series Linux","Standard_L8as_v3","8" -"LSv2 Series Dedicated Host","lsv2_type1","80" -"Lsv3 Series DedicatedHost","lsv3_type1","80" -"Lsv3 Series Linux","Standard_L16s_v3","16" -"Lsv3 Series Linux","Standard_L32s_v3","32" -"Lsv3 Series Linux","Standard_L48s_v3","48" -"Lsv3 Series Linux","Standard_L64s_v3","64" -"Lsv3 Series Linux","Standard_L80s_v3","80" -"Lsv3 Series Linux","Standard_L8s_v3","8" -"MdSv2 Series 32 Disk","Standard_M32dms_v2","1" -"MdSv2 Series 64 Disk","Standard_M64ds_v2","1" -"Mdsv2 Series Dedicated Host","mdsv2medmem_type1","1" -"MdSv2 Series Disk","Standard_M192idms_v2","1" -"MdSv2 Series Disk 192s","Standard_M192ids_v2","1" -"MdSv2 Series Fractional High Memory Disk","Standard_M128ds_v2","1" -"MdSv2 Series High Memory Disk","Standard_M128dms_v2","1" -"Mdsv2 Series HM Dedicated Host","mdmsv2medmem _type1","1" -"MdSv2 Series Memory Disk","Standard_M64dms_v2","1" +"DSv2 Series High Memory","Standard_DS11-1_v2","1" +"DSv2 Series High Memory","Standard_DS11_v2","1" +"DSv2 Series High Memory","Standard_DS12-1_v2","2" +"DSv2 Series High Memory","Standard_DS12-2_v2","2" +"DSv2 Series High Memory","Standard_DS12_v2","2" +"DSv2 Series High Memory","Standard_DS13-2_v2","4" +"DSv2 Series High Memory","Standard_DS13-4_v2","4" +"DSv2 Series High Memory","Standard_DS13_v2","4" +"DSv2 Series High Memory","Standard_DS14-4_v2","8" +"DSv2 Series High Memory","Standard_DS14-8_v2","8" +"DSv2 Series High Memory","Standard_DS14_v2","8" +"DSv2 Series High Memory","Standard_DS15_v2","10" +"DSv3 Series Dedicated Host","dsv3_type1","1" +"DSv3 Series Dedicated Host","dsv3_type2","1.1263" +"DSv3 Series Dedicated Host","dsv3_type3","1.25" +"DSv3 Series Dedicated Host","dsv3_type4","1.56" +"DSv4 Series Dedicated Host","dsv4_type1","1" +"DSv4 Series Dedicated Host","dsv4_type2","1.2" +"Dadsv5 Series","Standard_D16ads_v5","8" +"Dadsv5 Series","Standard_D2ads_v5","1" +"Dadsv5 Series","Standard_D32ads_v5","16" +"Dadsv5 Series","Standard_D48ads_v5","24" +"Dadsv5 Series","Standard_D4ads_v5","2" +"Dadsv5 Series","Standard_D64ads_v5","32" +"Dadsv5 Series","Standard_D8ads_v5","4" +"Dadsv5 Series","Standard_D96ads_v5","48" +"Dadsv5 Series DedicatedHost","dadsv5_type1","1" +"Dasv4 Series","Standard_D16as_v4","8" +"Dasv4 Series","Standard_D2as_v4","1" +"Dasv4 Series","Standard_D32as_v4","16" +"Dasv4 Series","Standard_D48as_v4","24" +"Dasv4 Series","Standard_D4as_v4","2" +"Dasv4 Series","Standard_D64as_v4","32" +"Dasv4 Series","Standard_D8as_v4","4" +"Dasv4 Series","Standard_D96as_v4","48" +"Dasv4 Series Dedicated Host","dasv4_type1","1" +"Dasv4 Series Dedicated Host","dasv4_type2","1.04" +"Dasv5 Series","Standard_D16as_v5","8" +"Dasv5 Series","Standard_D2as_v5","1" +"Dasv5 Series","Standard_D32as_v5","16" +"Dasv5 Series","Standard_D48as_v5","24" +"Dasv5 Series","Standard_D4as_v5","2" +"Dasv5 Series","Standard_D64as_v5","32" +"Dasv5 Series","Standard_D8as_v5","4" +"Dasv5 Series","Standard_D96as_v5","48" +"Dasv5 Series DedicatedHost","dasv5_type1","1" +"Dav4 Series","Standard_D16a_v4","8" +"Dav4 Series","Standard_D2a_v4","1" +"Dav4 Series","Standard_D32a_v4","16" +"Dav4 Series","Standard_D48a_v4","24" +"Dav4 Series","Standard_D4a_v4","2" +"Dav4 Series","Standard_D64a_v4","32" +"Dav4 Series","Standard_D8a_v4","4" +"Dav4 Series","Standard_D96a_v4","48" +"Ddsv4 Series","Standard_D16ds_v4","8" +"Ddsv4 Series","Standard_D2ds_v4","1" +"Ddsv4 Series","Standard_D32ds_v4","16" +"Ddsv4 Series","Standard_D48ds_v4","24" +"Ddsv4 Series","Standard_D4ds_v4","2" +"Ddsv4 Series","Standard_D64ds_v4","32" +"Ddsv4 Series","Standard_D8ds_v4","4" +"Ddsv4 Series Dedicated Host","ddsv4_type 1","1" +"Ddsv4 Series Dedicated Host","ddsv4_type2","1.19" +"Ddsv5 Series","Standard_D16ds_v5","8" +"Ddsv5 Series","Standard_D2ds_v5","1" +"Ddsv5 Series","Standard_D32ds_v5","16" +"Ddsv5 Series","Standard_D48ds_v5","24" +"Ddsv5 Series","Standard_D4ds_v5","2" +"Ddsv5 Series","Standard_D64ds_v5","32" +"Ddsv5 Series","Standard_D8ds_v5","4" +"Ddsv5 Series","Standard_D96ds_v5","48" +"Ddsv5 Series DedicatedHost","ddsv5_type1","1" +"Ddv4 Series","Standard_D16d_v4","8" +"Ddv4 Series","Standard_D2d_v4","1" +"Ddv4 Series","Standard_D32d_v4","16" +"Ddv4 Series","Standard_D48d_v4","24" +"Ddv4 Series","Standard_D4d_v4","2" +"Ddv4 Series","Standard_D64d_v4","32" +"Ddv4 Series","Standard_D8d_v4","4" +"Ddv5 Series","Standard_D16d_v5","8" +"Ddv5 Series","Standard_D2d_v5","1" +"Ddv5 Series","Standard_D32d_v5","16" +"Ddv5 Series","Standard_D48d_v5","24" +"Ddv5 Series","Standard_D4d_v5","2" +"Ddv5 Series","Standard_D64d_v5","32" +"Ddv5 Series","Standard_D8d_v5","4" +"Ddv5 Series","Standard_D96d_v5","48" +"Dldsv5 Series","Standard_D16lds_v5","8" +"Dldsv5 Series","Standard_D2lds_v5","1" +"Dldsv5 Series","Standard_D32lds_v5","16" +"Dldsv5 Series","Standard_D48lds_v5","24" +"Dldsv5 Series","Standard_D4lds_v5","2" +"Dldsv5 Series","Standard_D64lds_v5","32" +"Dldsv5 Series","Standard_D8lds_v5","4" +"Dldsv5 Series","Standard_D96lds_v5","48" +"Dlsv5 Series","Standard_D16ls_v5","8" +"Dlsv5 Series","Standard_D2ls_v5","1" +"Dlsv5 Series","Standard_D32ls_v5","16" +"Dlsv5 Series","Standard_D48ls_v5","24" +"Dlsv5 Series","Standard_D4ls_v5","2" +"Dlsv5 Series","Standard_D64ls_v5","32" +"Dlsv5 Series","Standard_D8ls_v5","4" +"Dlsv5 Series","Standard_D96ls_v5","48" +"Dpdsv5 Series","Standard_D16pds_v5","8" +"Dpdsv5 Series","Standard_D2pds_v5","1" +"Dpdsv5 Series","Standard_D32pds_v5","16" +"Dpdsv5 Series","Standard_D48pds_v5","24" +"Dpdsv5 Series","Standard_D4pds_v5","2" +"Dpdsv5 Series","Standard_D64pds_v5","32" +"Dpdsv5 Series","Standard_D8pds_v5","4" +"Dpldsv5 Series","Standard_D16plds_v5","8" +"Dpldsv5 Series","Standard_D2plds_v5","1" +"Dpldsv5 Series","Standard_D32plds_v5","16" +"Dpldsv5 Series","Standard_D48plds_v5","24" +"Dpldsv5 Series","Standard_D4plds_v5","2" +"Dpldsv5 Series","Standard_D64plds_v5","32" +"Dpldsv5 Series","Standard_D8plds_v5","4" +"Dplsv5 Series","Standard_D16pls_v5","8" +"Dplsv5 Series","Standard_D2pls_v5","1" +"Dplsv5 Series","Standard_D32pls_v5","16" +"Dplsv5 Series","Standard_D48pls_v5","24" +"Dplsv5 Series","Standard_D4pls_v5","2" +"Dplsv5 Series","Standard_D64pls_v5","32" +"Dplsv5 Series","Standard_D8pls_v5","4" +"Dpsv5 Series","Standard_D16ps_v5","8" +"Dpsv5 Series","Standard_D2ps_v5","1" +"Dpsv5 Series","Standard_D32ps_v5","16" +"Dpsv5 Series","Standard_D48ps_v5","24" +"Dpsv5 Series","Standard_D4ps_v5","2" +"Dpsv5 Series","Standard_D64ps_v5","32" +"Dpsv5 Series","Standard_D8ps_v5","4" +"Dsv4 Series","Standard_D16s_v4","8" +"Dsv4 Series","Standard_D2s_v4","1" +"Dsv4 Series","Standard_D32s_v4","16" +"Dsv4 Series","Standard_D48s_v4","24" +"Dsv4 Series","Standard_D4s_v4","2" +"Dsv4 Series","Standard_D64s_v4","32" +"Dsv4 Series","Standard_D8s_v4","4" +"Dsv5 Series","Standard_D16s_v5","8" +"Dsv5 Series","Standard_D2s_v5","1" +"Dsv5 Series","Standard_D32s_v5","16" +"Dsv5 Series","Standard_D48s_v5","24" +"Dsv5 Series","Standard_D4s_v5","2" +"Dsv5 Series","Standard_D64s_v5","32" +"Dsv5 Series","Standard_D8s_v5","4" +"Dsv5 Series","Standard_D96s_v5","48" +"Dsv5 Series DedicatedHost","dsv5_type1","1" +"Dv4 Series","Standard_D16_v4","8" +"Dv4 Series","Standard_D2_v4","1" +"Dv4 Series","Standard_D32_v4","16" +"Dv4 Series","Standard_D48_v4","24" +"Dv4 Series","Standard_D4_v4","2" +"Dv4 Series","Standard_D64_v4","32" +"Dv4 Series","Standard_D8_v4","4" +"Dv5 Series","Standard_D16_v5","8" +"Dv5 Series","Standard_D2_v5","1" +"Dv5 Series","Standard_D32_v5","16" +"Dv5 Series","Standard_D48_v5","24" +"Dv5 Series","Standard_D4_v5","2" +"Dv5 Series","Standard_D64_v5","32" +"Dv5 Series","Standard_D8_v5","4" +"Dv5 Series","Standard_D96_v5","48" +"ECadsv5-series DedicatedHost","ecadsv5 type 1","1" +"ECadsv5-series Linux","Standard_EC16ads_v5","8" +"ECadsv5-series Linux","Standard_EC20ads_v5","10" +"ECadsv5-series Linux","Standard_EC2ads_v5","1" +"ECadsv5-series Linux","Standard_EC32ads_v5","16" +"ECadsv5-series Linux","Standard_EC48ads_v5","24" +"ECadsv5-series Linux","Standard_EC4ads_v5","2" +"ECadsv5-series Linux","Standard_EC64ads_v5","32" +"ECadsv5-series Linux","Standard_EC8ads_v5","4" +"ECadsv5-series Linux","Standard_EC96ads_v5","48" +"ECadsv5-series Linux","Standard_EC96iads_v5","52.8" +"ECasv5-series DedicatedHost","ecasv5 type 1","1" +"ECasv5-series Linux","Standard_EC16as_v5","8" +"ECasv5-series Linux","Standard_EC20as_v5","10" +"ECasv5-series Linux","Standard_EC2as_v5","1" +"ECasv5-series Linux","Standard_EC32as_v5","16" +"ECasv5-series Linux","Standard_EC48as_v5","24" +"ECasv5-series Linux","Standard_EC4as_v5","2" +"ECasv5-series Linux","Standard_EC64as_v5","32" +"ECasv5-series Linux","Standard_EC8as_v5","4" +"ECasv5-series Linux","Standard_EC96as_v5","48" +"ECasv5-series Linux","Standard_EC96ias_v5","52.8" +"ESv3 Series","Standard_E16-4s_v3","8" +"ESv3 Series","Standard_E16-8s_v3","8" +"ESv3 Series","Standard_E16s_v3","8" +"ESv3 Series","Standard_E20s_v3","10" +"ESv3 Series","Standard_E2s_v3","1" +"ESv3 Series","Standard_E32-16s_v3","16" +"ESv3 Series","Standard_E32-8s_v3","16" +"ESv3 Series","Standard_E32s_v3","16" +"ESv3 Series","Standard_E4-2s_v3","2" +"ESv3 Series","Standard_E48s_v3","24" +"ESv3 Series","Standard_E4s_v3","2" +"ESv3 Series","Standard_E64-16s_v3","28.8" +"ESv3 Series","Standard_E64-32s_v3","28.8" +"ESv3 Series","Standard_E64s_v3","28.8" +"ESv3 Series","Standard_E8-2s_v3","4" +"ESv3 Series","Standard_E8-4s_v3","4" +"ESv3 Series","Standard_E8s_v3","4" +"ESv3 Series Dedicated Host","esv3_type1","1.0968" +"ESv3 Series Dedicated Host","esv3_type2","1" +"ESv3 Series Dedicated Host","esv3_type3","1.11" +"ESv3 Series Dedicated Host","esv3_type4","1.5" +"ESv4 Series Dedicated Host","esv4_type1","1" +"ESv4 Series Dedicated Host","esv4_type2","1.31" +"ESv4 Series Dedicated Host","standard_e64is_v4_special","1" +"Eadsv5 Series","Standard_E112iads_v5","61.6" +"Eadsv5 Series","Standard_E16-4ads_v5","8" +"Eadsv5 Series","Standard_E16-8ads_v5","8" +"Eadsv5 Series","Standard_E16ads_v5","8" +"Eadsv5 Series","Standard_E20ads_v5","10" +"Eadsv5 Series","Standard_E2ads_v5","1" +"Eadsv5 Series","Standard_E32-16ads_v5","16" +"Eadsv5 Series","Standard_E32-8ads_v5","16" +"Eadsv5 Series","Standard_E32ads_v5","16" +"Eadsv5 Series","Standard_E4-2ads_v5","2" +"Eadsv5 Series","Standard_E48ads_v5","24" +"Eadsv5 Series","Standard_E4ads_v5","2" +"Eadsv5 Series","Standard_E64-16ads_v5","32" +"Eadsv5 Series","Standard_E64-32ads_v5","32" +"Eadsv5 Series","Standard_E64ads_v5","32" +"Eadsv5 Series","Standard_E8-2ads_v5","4" +"Eadsv5 Series","Standard_E8-4ads_v5","4" +"Eadsv5 Series","Standard_E8ads_v5","4" +"Eadsv5 Series","Standard_E96-24ads_v5","48" +"Eadsv5 Series","Standard_E96-48ads_v5","48" +"Eadsv5 Series","Standard_E96ads_v5","48" +"Eadsv5 Series DedicatedHost","eadsv5_type1","1" +"Easv4 Series","Standard_E16-4as_v4","8" +"Easv4 Series","Standard_E16-8as_v4","8" +"Easv4 Series","Standard_E16as_v4","8" +"Easv4 Series","Standard_E20as_v4","10" +"Easv4 Series","Standard_E2as_v4","1" +"Easv4 Series","Standard_E32-16as_v4","16" +"Easv4 Series","Standard_E32-8as_v4","16" +"Easv4 Series","Standard_E32as_v4","16" +"Easv4 Series","Standard_E4-2as_v4","2" +"Easv4 Series","Standard_E48as_v4","24" +"Easv4 Series","Standard_E4as_v4","2" +"Easv4 Series","Standard_E64-16as_v4","32" +"Easv4 Series","Standard_E64-32as_v4","32" +"Easv4 Series","Standard_E64as_v4","32" +"Easv4 Series","Standard_E8-2as_v4","4" +"Easv4 Series","Standard_E8-4as_v4","4" +"Easv4 Series","Standard_E8as_v4","4" +"Easv4 Series","Standard_E96-24as_v4","48" +"Easv4 Series","Standard_E96-48as_v4","48" +"Easv4 Series","Standard_E96as_v4","48" +"Easv4 Series","Standard_E96ias_v4","48" +"Easv4 Series Dedicated Host","easv4_type1","1" +"Easv4 Series Dedicated Host","easv4_type2","1.1667" +"Easv5 Series","Standard_E112ias_v5","61.6" +"Easv5 Series","Standard_E16-4as_v5","8" +"Easv5 Series","Standard_E16-8as_v5","8" +"Easv5 Series","Standard_E16as_v5","8" +"Easv5 Series","Standard_E20as_v5","10" +"Easv5 Series","Standard_E2as_v5","1" +"Easv5 Series","Standard_E32-16as_v5","16" +"Easv5 Series","Standard_E32-8as_v5","16" +"Easv5 Series","Standard_E32as_v5","16" +"Easv5 Series","Standard_E4-2as_v5","2" +"Easv5 Series","Standard_E48as_v5","24" +"Easv5 Series","Standard_E4as_v5","2" +"Easv5 Series","Standard_E64-16as_v5","32" +"Easv5 Series","Standard_E64-32as_v5","32" +"Easv5 Series","Standard_E64as_v5","32" +"Easv5 Series","Standard_E8-2as_v5","4" +"Easv5 Series","Standard_E8-4as_v5","4" +"Easv5 Series","Standard_E8as_v5","4" +"Easv5 Series","Standard_E96-24as_v5","48" +"Easv5 Series","Standard_E96-48as_v5","48" +"Easv5 Series","Standard_E96as_v5","48" +"Easv5 Series DedicatedHost","easv5_type1","1" +"Eav4 Series","Standard_E16a_v4","8" +"Eav4 Series","Standard_E20a_v4","10" +"Eav4 Series","Standard_E2a_v4","1" +"Eav4 Series","Standard_E32a_v4","16" +"Eav4 Series","Standard_E48a_v4","24" +"Eav4 Series","Standard_E4a_v4","2" +"Eav4 Series","Standard_E64a_v4","32" +"Eav4 Series","Standard_E8a_v4","4" +"Eav4 Series","Standard_E96a_v4","48" +"Ebdsv5 Series","Standard_E112ibds_v5","61.6" +"Ebdsv5 Series","Standard_E16bds_v5","8" +"Ebdsv5 Series","Standard_E2bds_v5","1" +"Ebdsv5 Series","Standard_E32bds_v5","16" +"Ebdsv5 Series","Standard_E48bds_v5","24" +"Ebdsv5 Series","Standard_E4bds_v5","2" +"Ebdsv5 Series","Standard_E64bds_v5","32" +"Ebdsv5 Series","Standard_E8bds_v5","4" +"Ebdsv5 Series","Standard_E96bds_v5","48" +"Ebdsv5 Series Dedicated Host","ebdsv5-type1","1" +"Ebsv5 Series","Standard_E112ibs_v5","61.6" +"Ebsv5 Series","Standard_E16bs_v5","8" +"Ebsv5 Series","Standard_E2bs_v5","1" +"Ebsv5 Series","Standard_E32bs_v5","16" +"Ebsv5 Series","Standard_E48bs_v5","24" +"Ebsv5 Series","Standard_E4bs_v5","2" +"Ebsv5 Series","Standard_E64bs_v5","32" +"Ebsv5 Series","Standard_E8bs_v5","4" +"Ebsv5 Series","Standard_E96bs_v5","48" +"Ebsv5 Series Dedicated Host","ebsv5-type1","1" +"Edsv4 Series","Standard_E16-4ds_v4","8" +"Edsv4 Series","Standard_E16-8ds_v4","8" +"Edsv4 Series","Standard_E16ds_v4","8" +"Edsv4 Series","Standard_E20ds_v4","10" +"Edsv4 Series","Standard_E2ds_v4","1" +"Edsv4 Series","Standard_E32-16ds_v4","16" +"Edsv4 Series","Standard_E32-8ds_v4","16" +"Edsv4 Series","Standard_E32ds_v4","16" +"Edsv4 Series","Standard_E4-2ds_v4","2" +"Edsv4 Series","Standard_E48ds_v4","24" +"Edsv4 Series","Standard_E4ds_v4","2" +"Edsv4 Series","Standard_E64-16ds_v4","32" +"Edsv4 Series","Standard_E64-32ds_v4","32" +"Edsv4 Series","Standard_E64ds_v4","32" +"Edsv4 Series","Standard_E8-2ds_v4","4" +"Edsv4 Series","Standard_E8-4ds_v4","4" +"Edsv4 Series","Standard_E8ds_v4","4" +"Edsv4 Series Dedicated Host","edsv4_type 1","1" +"Edsv4 Series Dedicated Host","edsv4_type2","1.19" +"Edsv4 Series Isolated","Standard_E80ids_v4","1" +"Edsv5 Series","Standard_E16-4ds_v5","8" +"Edsv5 Series","Standard_E16-8ds_v5","8" +"Edsv5 Series","Standard_E16ds_v5","8" +"Edsv5 Series","Standard_E20ds_v5","10" +"Edsv5 Series","Standard_E2ds_v5","1" +"Edsv5 Series","Standard_E32-16ds_v5","16" +"Edsv5 Series","Standard_E32-8ds_v5","16" +"Edsv5 Series","Standard_E32ds_v5","16" +"Edsv5 Series","Standard_E4-2ds_v5","2" +"Edsv5 Series","Standard_E48ds_v5","24" +"Edsv5 Series","Standard_E4ds_v5","2" +"Edsv5 Series","Standard_E64-16ds_v5","32" +"Edsv5 Series","Standard_E64-32ds_v5","32" +"Edsv5 Series","Standard_E64ds_v5","32" +"Edsv5 Series","Standard_E8-2ds_v5","4" +"Edsv5 Series","Standard_E8-4ds_v5","4" +"Edsv5 Series","Standard_E8ds_v5","4" +"Edsv5 Series","Standard_E96-24ds_v5","48" +"Edsv5 Series","Standard_E96-48ds_v5","48" +"Edsv5 Series","Standard_E96ds_v5","48" +"Edsv5 Series DedicatedHost","edsv5_type1","1" +"Edsv5 Series Isolated","Standard_E104ids_v5","1" +"Edv4 Series","Standard_E16d_v4","8" +"Edv4 Series","Standard_E20d_v4","10" +"Edv4 Series","Standard_E2d_v4","1" +"Edv4 Series","Standard_E32d_v4","16" +"Edv4 Series","Standard_E48d_v4","24" +"Edv4 Series","Standard_E4d_v4","2" +"Edv4 Series","Standard_E64d_v4","32" +"Edv4 Series","Standard_E8d_v4","4" +"Edv5 Series","Standard_E104id_v5","57.2" +"Edv5 Series","Standard_E16d_v5","8" +"Edv5 Series","Standard_E20d_v5","10" +"Edv5 Series","Standard_E2d_v5","1" +"Edv5 Series","Standard_E32d_v5","16" +"Edv5 Series","Standard_E48d_v5","24" +"Edv5 Series","Standard_E4d_v5","2" +"Edv5 Series","Standard_E64d_v5","32" +"Edv5 Series","Standard_E8d_v5","4" +"Edv5 Series","Standard_E96d_v5","48" +"Epdsv5 Series","Standard_E16pds_v5","8" +"Epdsv5 Series","Standard_E20pds_v5","10" +"Epdsv5 Series","Standard_E2pds_v5","1" +"Epdsv5 Series","Standard_E32pds_v5","16" +"Epdsv5 Series","Standard_E4pds_v5","2" +"Epdsv5 Series","Standard_E8pds_v5","4" +"Epsv5 Series","Standard_E16ps_v5","8" +"Epsv5 Series","Standard_E20ps_v5","10" +"Epsv5 Series","Standard_E2ps_v5","1" +"Epsv5 Series","Standard_E32ps_v5","16" +"Epsv5 Series","Standard_E4ps_v5","2" +"Epsv5 Series","Standard_E8ps_v5","4" +"Esv4 Series","Standard_E16-4s_v4","8" +"Esv4 Series","Standard_E16-8s_v4","8" +"Esv4 Series","Standard_E16s_v4","8" +"Esv4 Series","Standard_E20s_v4","10" +"Esv4 Series","Standard_E2s_v4","1" +"Esv4 Series","Standard_E32-16s_v4","16" +"Esv4 Series","Standard_E32-8s_v4","16" +"Esv4 Series","Standard_E32s_v4","16" +"Esv4 Series","Standard_E4-2s_v4","2" +"Esv4 Series","Standard_E48s_v4","24" +"Esv4 Series","Standard_E4s_v4","2" +"Esv4 Series","Standard_E64-16s_v4","32" +"Esv4 Series","Standard_E64-32s_v4","32" +"Esv4 Series","Standard_E64s_v4","32" +"Esv4 Series","Standard_E8-2s_v4","4" +"Esv4 Series","Standard_E8-4s_v4","4" +"Esv4 Series","Standard_E8s_v4","4" +"Esv4 Series Isolated","Standard_E80is_v4","1" +"Esv5 Series","Standard_E16-4s_v5","8" +"Esv5 Series","Standard_E16-8s_v5","8" +"Esv5 Series","Standard_E16s_v5","8" +"Esv5 Series","Standard_E20s_v5","10" +"Esv5 Series","Standard_E2s_v5","1" +"Esv5 Series","Standard_E32-16s_v5","16" +"Esv5 Series","Standard_E32-8s_v5","16" +"Esv5 Series","Standard_E32s_v5","16" +"Esv5 Series","Standard_E4-2s_v5","2" +"Esv5 Series","Standard_E48s_v5","24" +"Esv5 Series","Standard_E4s_v5","2" +"Esv5 Series","Standard_E64-16s_v5","32" +"Esv5 Series","Standard_E64-32s_v5","32" +"Esv5 Series","Standard_E64s_v5","32" +"Esv5 Series","Standard_E8-2s_v5","4" +"Esv5 Series","Standard_E8-4s_v5","4" +"Esv5 Series","Standard_E8s_v5","4" +"Esv5 Series","Standard_E96-24s_v5","48" +"Esv5 Series","Standard_E96-48s_v5","48" +"Esv5 Series","Standard_E96s_v5","48" +"Esv5 Series DedicatedHost","esv5_type1","1" +"Esv5 Series Isolated","Standard_E104is_v5","1" +"Ev3 Series","Standard_E20_v3","10" +"Ev3 Series","Standard_E2_v3","1" +"Ev3 Series","Standard_E32_v3","16" +"Ev4 Series","Standard_E16_v4","8" +"Ev4 Series","Standard_E20_v4","10" +"Ev4 Series","Standard_E2_v4","1" +"Ev4 Series","Standard_E32_v4","16" +"Ev4 Series","Standard_E48_v4","24" +"Ev4 Series","Standard_E4_v4","2" +"Ev4 Series","Standard_E64_v4","32" +"Ev4 Series","Standard_E8_v4","4" +"Ev5 Series","Standard_E104i_v5","57.2" +"Ev5 Series","Standard_E16_v5","8" +"Ev5 Series","Standard_E20_v5","10" +"Ev5 Series","Standard_E2_v5","1" +"Ev5 Series","Standard_E32_v5","16" +"Ev5 Series","Standard_E48_v5","24" +"Ev5 Series","Standard_E4_v5","2" +"Ev5 Series","Standard_E64_v5","32" +"Ev5 Series","Standard_E8_v5","4" +"Ev5 Series","Standard_E96_v5","48" +"FSv2 Series","Standard_F16s_v2","8" +"FSv2 Series","Standard_F2s_v2","1" +"FSv2 Series","Standard_F32s_v2","16" +"FSv2 Series","Standard_F48s_v2","24" +"FSv2 Series","Standard_F4s_v2","2" +"FSv2 Series","Standard_F64s_v2","32" +"FSv2 Series","Standard_F72s_v2","36" +"FSv2 Series","Standard_F8s_v2","4" +"FSv2 Series Dedicated Host","fsv2 type3","1.17" +"FSv2 Series Dedicated Host","fsv2_type2","1" +"FSv2 Series Dedicated Host","fsv2_type4","1.33" +"FX Series Dedicated Host","fxmds type1","1" +"FX Series Linux","Standard_FX12mds","3" +"FX Series Linux","Standard_FX24mds","6" +"FX Series Linux","Standard_FX36mds","9" +"FX Series Linux","Standard_FX48mds","12" +"FX Series Linux","Standard_FX4mds","1" +"HBSv2 Series Low Latency","Standard_HB120-16rs_v2","1" +"HBSv2 Series Low Latency","Standard_HB120-32rs_v2","1" +"HBSv2 Series Low Latency","Standard_HB120-64rs_v2","1" +"HBSv2 Series Low Latency","Standard_HB120-96rs_v2","1" +"HBrsv3 Series Low Latency","Standard_HB120-16rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120-32rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120-64rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120-96rs_v3","1" +"HBrsv3 Series Low Latency","Standard_HB120rs_v3","1" +"HCS Series","Standard_HC44-16rs","1" +"HCS Series","Standard_HC44-32rs","1" +"HCS Series","Standard_HC44rs","1" +"LSv2 Series Dedicated Host","lsv2_type1","1" +"Lasv3 Series DedicatedHost","lasv3_type1","1" +"Lasv3 Series Linux","Standard_L16as_v3","2" +"Lasv3 Series Linux","Standard_L32as_v3","4" +"Lasv3 Series Linux","Standard_L48as_v3","6" +"Lasv3 Series Linux","Standard_L64as_v3","8" +"Lasv3 Series Linux","Standard_L80as_v3","10" +"Lasv3 Series Linux","Standard_L8as_v3","1" +"Lsv3 Series DedicatedHost","lsv3_type1","1" +"Lsv3 Series Linux","Standard_L16s_v3","2" +"Lsv3 Series Linux","Standard_L32s_v3","4" +"Lsv3 Series Linux","Standard_L48s_v3","6" +"Lsv3 Series Linux","Standard_L64s_v3","8" +"Lsv3 Series Linux","Standard_L80s_v3","10" +"Lsv3 Series Linux","Standard_L8s_v3","1" "MS Series","Standard_M128","2" "MS Series","Standard_M128s","2" "MS Series","Standard_M64","1" @@ -629,6 +628,7 @@ "MS Series Fractional Large","Standard_M32ls","1" "MS Series Fractional Large","Standard_M64ls","1.9" "MS Series Fractional Tiny","Standard_M32ts","1" +"MS Series HM Dedicated Host","msm_type1","1" "MS Series High Memory","Standard_M128-32ms","2.6" "MS Series High Memory","Standard_M128-64ms","2.6" "MS Series High Memory","Standard_M128m","2.6" @@ -637,7 +637,6 @@ "MS Series High Memory","Standard_M64-32ms","1" "MS Series High Memory","Standard_M64m","1" "MS Series High Memory","Standard_M64ms","1" -"MS Series HM Dedicated Host","msm_type1","1" "MSv2 Series","Standard_M208s_v2","1" "MSv2 Series","Standard_M416-208s_v2","2.2" "MSv2 Series","Standard_M416s_v2","2.2" @@ -647,435 +646,498 @@ "MSv2 Series Dedicated Host","msv2_type1","1" "MSv2 Series Disk 192s","Standard_M192is_v2","1" "MSv2 Series Fractional High Memory 128s","Standard_M128s_v2","1" -"MSv2 Series High Memory","Standard_M208ms_v2","4.4" -"MSv2 Series High Memory","Standard_M416-208ms_v2","9.8" -"MSv2 Series High Memory","Standard_M416ms_v2","9.8" -"MSv2 Series High Memory","Standard_M416s_10_v2","8.16" -"MSv2 Series High Memory","Standard_M416s_8_v2","6.5" -"MSv2 Series High Memory","Standard_M416s_9_v2","7.36" -"MSv2 Series High Memory 128ms","Standard_M128ms_v2","1" "MSv2 Series HM Dedicated Host","msmv2_type1","1" +"MSv2 Series High Memory","Standard_M208ms_v2","1" +"MSv2 Series High Memory","Standard_M416-208ms_v2","2.2273" +"MSv2 Series High Memory","Standard_M416ms_v2","2.2273" +"MSv2 Series High Memory","Standard_M416s_10_v2","1.8545" +"MSv2 Series High Memory","Standard_M416s_8_v2","1.4773" +"MSv2 Series High Memory","Standard_M416s_9_v2","1.6727" +"MSv2 Series High Memory 128ms","Standard_M128ms_v2","1" "MSv2 Series MedMem Dedicated Host","msv2medmem type1","1" "MSv2 Series MedMem HM Dedicated Host","mmsv2medmem-type1","1" "MSv2 Series Memory","Standard_M64ms_v2","1" -"NCads A100 v4 Series Linux","Standard_NC24ads_A100_v4","24" -"NCads A100 v4 Series Linux","Standard_NC48ads_A100_v4","48" -"NCads A100 v4 Series Linux","Standard_NC96ads_A100_v4","96" -"NCas T4 v3 Series","Standard_NC16as_T4_v3","9.16" -"NCas T4 v3 Series","Standard_NC4as_T4_v3","4" -"NCas T4 v3 Series","Standard_NC64as_T4_v3","33.08" -"NCas T4 v3 Series","Standard_NC8as_T4_v3","5.72" -"NCasA10_v4 Linux","Standard_NC16ads_A10_v4","16" -"NCasA10_v4 Linux","Standard_NC32ads_A10_v4","32" -"NCasA10_v4 Linux","Standard_NC8ads_A10_v4","8" -"NDamsr A100 v4 Series","ndamsra100v4_type1","96" -"NDamsr A100 v4 Series Linux","Standard_ND96amsr_A100_v4","106.56" -"NDasr A100 v4 Series","ndasra100v4_type1","105.6" -"NDasr A100 v4 Series","Standard_ND96asr_v4","96" -"NDrSv2 Series Low Latency","Standard_ND40rs_v2","40" -"NP Series","Standard_NP10s","10" -"NP Series","Standard_NP20s","20" -"NP Series","Standard_NP40s","40" -"NVadsA10_v5 DedicatedHost","nvadsa10v5_type1","72" -"NVadsA10_v5 Linux","Standard_NV12ads_A10_v5","12" -"NVadsA10_v5 Linux","Standard_NV18ads_A10_v5","21.12" -"NVadsA10_v5 Linux","Standard_NV36adms_A10_v5","59.76" -"NVadsA10_v5 Linux","Standard_NV36ads_A10_v5","42.3" -"NVadsA10_v5 Linux","Standard_NV6ads_A10_v5","6" -"NVadsA10_v5 Linux","Standard_NV72ads_A10_v5","86.16" -"Virtual Machines Dadsv6-series Linux","Standard_D16ads_v6","16" -"Virtual Machines Dadsv6-series Linux","Standard_D2ads_v6","2" -"Virtual Machines Dadsv6-series Linux","Standard_D32ads_v6","32" -"Virtual Machines Dadsv6-series Linux","Standard_D48ads_v6","48" -"Virtual Machines Dadsv6-series Linux","Standard_D4ads_v6","4" -"Virtual Machines Dadsv6-series Linux","Standard_D64ads_v6","64" -"Virtual Machines Dadsv6-series Linux","Standard_D8ads_v6","8" -"Virtual Machines Dadsv6-series Linux","Standard_D96ads_v6","96" -"Virtual Machines Dadsv7-series Linux","Standard_D128ads_v7","128" -"Virtual Machines Dadsv7-series Linux","Standard_D160ads_v7","160" -"Virtual Machines Dadsv7-series Linux","Standard_D16ads_v7","16" -"Virtual Machines Dadsv7-series Linux","Standard_D2ads_v7","2" -"Virtual Machines Dadsv7-series Linux","Standard_D32ads_v7","32" -"Virtual Machines Dadsv7-series Linux","Standard_D48ads_v7","48" -"Virtual Machines Dadsv7-series Linux","Standard_D4ads_v7","4" -"Virtual Machines Dadsv7-series Linux","Standard_D64ads_v7","64" -"Virtual Machines Dadsv7-series Linux","Standard_D8ads_v7","8" -"Virtual Machines Dadsv7-series Linux","Standard_D96ads_v7","96" -"Virtual Machines Daldsv6-series Linux","Standard_D16alds_v6","16" -"Virtual Machines Daldsv6-series Linux","Standard_D2alds_v6","2" -"Virtual Machines Daldsv6-series Linux","Standard_D32alds_v6","32" -"Virtual Machines Daldsv6-series Linux","Standard_D48alds_v6","48" -"Virtual Machines Daldsv6-series Linux","Standard_D4alds_v6","4" -"Virtual Machines Daldsv6-series Linux","Standard_D64alds_v6","64" -"Virtual Machines Daldsv6-series Linux","Standard_D8alds_v6","8" -"Virtual Machines Daldsv6-series Linux","Standard_D96alds_v6","96" -"Virtual Machines Daldsv7-series Linux","Standard_D128alds_v7","128" -"Virtual Machines Daldsv7-series Linux","Standard_D160alds_v7","160" -"Virtual Machines Daldsv7-series Linux","Standard_D16alds_v7","16" -"Virtual Machines Daldsv7-series Linux","Standard_D2alds_v7","2" -"Virtual Machines Daldsv7-series Linux","Standard_D32alds_v7","32" -"Virtual Machines Daldsv7-series Linux","Standard_D48alds_v7","48" -"Virtual Machines Daldsv7-series Linux","Standard_D4alds_v7","4" -"Virtual Machines Daldsv7-series Linux","Standard_D64alds_v7","64" -"Virtual Machines Daldsv7-series Linux","Standard_D8alds_v7","8" -"Virtual Machines Daldsv7-series Linux","Standard_D96alds_v7","96" -"Virtual Machines Dalsv6-series Linux","Standard_D16als_v6","16" -"Virtual Machines Dalsv6-series Linux","Standard_D2als_v6","2" -"Virtual Machines Dalsv6-series Linux","Standard_D32als_v6","32" -"Virtual Machines Dalsv6-series Linux","Standard_D48als_v6","48" -"Virtual Machines Dalsv6-series Linux","Standard_D4als_v6","4" -"Virtual Machines Dalsv6-series Linux","Standard_D64als_v6","64" -"Virtual Machines Dalsv6-series Linux","Standard_D8als_v6","8" -"Virtual Machines Dalsv6-series Linux","Standard_D96als_v6","96" -"Virtual Machines Dalsv7-series Linux","Standard_D128als_v7","128" -"Virtual Machines Dalsv7-series Linux","Standard_D160als_v7","160" -"Virtual Machines Dalsv7-series Linux","Standard_D16als_v7","16" -"Virtual Machines Dalsv7-series Linux","Standard_D2als_v7","2" -"Virtual Machines Dalsv7-series Linux","Standard_D32als_v7","32" -"Virtual Machines Dalsv7-series Linux","Standard_D48als_v7","48" -"Virtual Machines Dalsv7-series Linux","Standard_D4als_v7","4" -"Virtual Machines Dalsv7-series Linux","Standard_D64als_v7","64" -"Virtual Machines Dalsv7-series Linux","Standard_D8als_v7","8" -"Virtual Machines Dalsv7-series Linux","Standard_D96als_v7","96" -"Virtual Machines Dasv6-series DedicatedHost","dasv6_type1","144" -"Virtual Machines Dasv6-series Linux","Standard_D16as_v6","16" -"Virtual Machines Dasv6-series Linux","Standard_D2as_v6","2" -"Virtual Machines Dasv6-series Linux","Standard_D32as_v6","32" -"Virtual Machines Dasv6-series Linux","Standard_D48as_v6","48" -"Virtual Machines Dasv6-series Linux","Standard_D4as_v6","4" -"Virtual Machines Dasv6-series Linux","Standard_D64as_v6","64" -"Virtual Machines Dasv6-series Linux","Standard_D8as_v6","8" -"Virtual Machines Dasv6-series Linux","Standard_D96as_v6","96" -"Virtual Machines Dasv7-series Linux","Standard_D128as_v7","128" -"Virtual Machines Dasv7-series Linux","Standard_D160as_v7","160" -"Virtual Machines Dasv7-series Linux","Standard_D16as_v7","16" -"Virtual Machines Dasv7-series Linux","Standard_D2as_v7","2" -"Virtual Machines Dasv7-series Linux","Standard_D32as_v7","32" -"Virtual Machines Dasv7-series Linux","Standard_D48as_v7","48" -"Virtual Machines Dasv7-series Linux","Standard_D4as_v7","4" -"Virtual Machines Dasv7-series Linux","Standard_D64as_v7","64" -"Virtual Machines Dasv7-series Linux","Standard_D8as_v7","8" -"Virtual Machines Dasv7-series Linux","Standard_D96as_v7","96" -"Virtual Machines DCadsv6-series Linux","Standard_DC16ads_v6","16" -"Virtual Machines DCadsv6-series Linux","Standard_DC2ads_v6","2" -"Virtual Machines DCadsv6-series Linux","Standard_DC32ads_v6","32" -"Virtual Machines DCadsv6-series Linux","Standard_DC48ads_v6","48" -"Virtual Machines DCadsv6-series Linux","Standard_DC4ads_v6","4" -"Virtual Machines DCadsv6-series Linux","Standard_DC64ads_v6","64" -"Virtual Machines DCadsv6-series Linux","Standard_DC8ads_v6","8" -"Virtual Machines DCadsv6-series Linux","Standard_DC96ads_v6","96" -"Virtual Machines DCasv6-series Linux","Standard_DC16as_v6","16" -"Virtual Machines DCasv6-series Linux","Standard_DC2as_v6","2" -"Virtual Machines DCasv6-series Linux","Standard_DC32as_v6","32" -"Virtual Machines DCasv6-series Linux","Standard_DC48as_v6","48" -"Virtual Machines DCasv6-series Linux","Standard_DC4as_v6","4" -"Virtual Machines DCasv6-series Linux","Standard_DC64as_v6","64" -"Virtual Machines DCasv6-series Linux","Standard_DC8as_v6","8" -"Virtual Machines DCasv6-series Linux","Standard_DC96as_v6","96" -"Virtual Machines DCedsv6-series Linux","Standard_DC128eds_v6","128" -"Virtual Machines DCedsv6-series Linux","Standard_DC16eds_v6","16" -"Virtual Machines DCedsv6-series Linux","Standard_DC2eds_v6","2" -"Virtual Machines DCedsv6-series Linux","Standard_DC32eds_v6","32" -"Virtual Machines DCedsv6-series Linux","Standard_DC48eds_v6","48" -"Virtual Machines DCedsv6-series Linux","Standard_DC4eds_v6","4" -"Virtual Machines DCedsv6-series Linux","Standard_DC64eds_v6","64" -"Virtual Machines DCedsv6-series Linux","Standard_DC8eds_v6","8" -"Virtual Machines DCedsv6-series Linux","Standard_DC96eds_v6","96" -"Virtual Machines DCesv6-series Linux","Standard_DC128es_v6","128" -"Virtual Machines DCesv6-series Linux","Standard_DC16es_v6","16" -"Virtual Machines DCesv6-series Linux","Standard_DC2es_v6","2" -"Virtual Machines DCesv6-series Linux","Standard_DC32es_v6","32" -"Virtual Machines DCesv6-series Linux","Standard_DC48es_v6","48" -"Virtual Machines DCesv6-series Linux","Standard_DC4es_v6","4" -"Virtual Machines DCesv6-series Linux","Standard_DC64es_v6","64" -"Virtual Machines DCesv6-series Linux","Standard_DC8es_v6","8" -"Virtual Machines DCesv6-series Linux","Standard_DC96es_v6","96" -"Virtual Machines Ddsv6-series DedicatedHost","ddsv6_type1","192" -"Virtual Machines Ddsv6-series Linux","Standard_D128ds_v6","127.56" -"Virtual Machines Ddsv6-series Linux","Standard_D16ds_v6","16" -"Virtual Machines Ddsv6-series Linux","Standard_D192ds_v6","191.36" -"Virtual Machines Ddsv6-series Linux","Standard_D2ds_v6","2" -"Virtual Machines Ddsv6-series Linux","Standard_D32ds_v6","31.88" -"Virtual Machines Ddsv6-series Linux","Standard_D48ds_v6","47.84" -"Virtual Machines Ddsv6-series Linux","Standard_D4ds_v6","4" -"Virtual Machines Ddsv6-series Linux","Standard_D64ds_v6","63.8" -"Virtual Machines Ddsv6-series Linux","Standard_D8ds_v6","8" -"Virtual Machines Ddsv6-series Linux","Standard_D96ds_v6","95.68" -"Virtual Machines Dldsv6-series Linux","Standard_D128lds_v6","128.36" -"Virtual Machines Dldsv6-series Linux","Standard_D16lds_v6","16" -"Virtual Machines Dldsv6-series Linux","Standard_D2lds_v6","2" -"Virtual Machines Dldsv6-series Linux","Standard_D32lds_v6","32" -"Virtual Machines Dldsv6-series Linux","Standard_D48lds_v6","48.14" -"Virtual Machines Dldsv6-series Linux","Standard_D4lds_v6","4" -"Virtual Machines Dldsv6-series Linux","Standard_D64lds_v6","64.18" -"Virtual Machines Dldsv6-series Linux","Standard_D8lds_v6","8" -"Virtual Machines Dldsv6-series Linux","Standard_D96lds_v6","96.28" -"Virtual Machines Dlsv6-Series Linux","Standard_D128ls_v6","128" -"Virtual Machines Dlsv6-Series Linux","Standard_D16ls_v6","16" -"Virtual Machines Dlsv6-Series Linux","Standard_D2ls_v6","2" -"Virtual Machines Dlsv6-Series Linux","Standard_D32ls_v6","32" -"Virtual Machines Dlsv6-Series Linux","Standard_D48ls_v6","48" -"Virtual Machines Dlsv6-Series Linux","Standard_D4ls_v6","4" -"Virtual Machines Dlsv6-Series Linux","Standard_D64ls_v6","64" -"Virtual Machines Dlsv6-Series Linux","Standard_D8ls_v6","8" -"Virtual Machines Dlsv6-Series Linux","Standard_D96ls_v6","96" -"Virtual Machines Dndv6-series Linux","Standard_D128nds_v6","128" -"Virtual Machines Dndv6-series Linux","Standard_D16nds_v6","16" -"Virtual Machines Dndv6-series Linux","Standard_D2nds_v6","2" -"Virtual Machines Dndv6-series Linux","Standard_D32nds_v6","32" -"Virtual Machines Dndv6-series Linux","Standard_D48nds_v6","48" -"Virtual Machines Dndv6-series Linux","Standard_D4nds_v6","4" -"Virtual Machines Dndv6-series Linux","Standard_D64nds_v6","64" -"Virtual Machines Dndv6-series Linux","Standard_D8nds_v6","8" -"Virtual Machines Dndv6-series Linux","Standard_D96nds_v6","96" -"Virtual Machines Dnldv6-series Linux","Standard_D128nlds_v6","128" -"Virtual Machines Dnldv6-series Linux","Standard_D16nlds_v6","16" -"Virtual Machines Dnldv6-series Linux","Standard_D2nlds_v6","2" -"Virtual Machines Dnldv6-series Linux","Standard_D32nlds_v6","32" -"Virtual Machines Dnldv6-series Linux","Standard_D48nlds_v6","48" -"Virtual Machines Dnldv6-series Linux","Standard_D4nlds_v6","4" -"Virtual Machines Dnldv6-series Linux","Standard_D64nlds_v6","64" -"Virtual Machines Dnldv6-series Linux","Standard_D8nlds_v6","8" -"Virtual Machines Dnldv6-series Linux","Standard_D96nlds_v6","96" -"Virtual Machines Dnlv6-series Linux","Standard_D128nls_v6","128" -"Virtual Machines Dnlv6-series Linux","Standard_D16nls_v6","16" -"Virtual Machines Dnlv6-series Linux","Standard_D2nls_v6","2" -"Virtual Machines Dnlv6-series Linux","Standard_D32nls_v6","32" -"Virtual Machines Dnlv6-series Linux","Standard_D48nls_v6","48" -"Virtual Machines Dnlv6-series Linux","Standard_D4nls_v6","4" -"Virtual Machines Dnlv6-series Linux","Standard_D64nls_v6","64" -"Virtual Machines Dnlv6-series Linux","Standard_D8nls_v6","8" -"Virtual Machines Dnlv6-series Linux","Standard_D96nls_v6","96" -"Virtual Machines Dnv6-series Linux","Standard_D128ns_v6","128" -"Virtual Machines Dnv6-series Linux","Standard_D16ns_v6","16" -"Virtual Machines Dnv6-series Linux","Standard_D2ns_v6","2" -"Virtual Machines Dnv6-series Linux","Standard_D32ns_v6","32" -"Virtual Machines Dnv6-series Linux","Standard_D48ns_v6","48" -"Virtual Machines Dnv6-series Linux","Standard_D4ns_v6","4" -"Virtual Machines Dnv6-series Linux","Standard_D64ns_v6","64" -"Virtual Machines Dnv6-series Linux","Standard_D8ns_v6","8" -"Virtual Machines Dnv6-series Linux","Standard_D96ns_v6","96" -"Virtual Machines Dpdsv6-series Linux","Standard_D16pds_v6","16" -"Virtual Machines Dpdsv6-series Linux","Standard_D2pds_v6","2" -"Virtual Machines Dpdsv6-series Linux","Standard_D32pds_v6","32" -"Virtual Machines Dpdsv6-series Linux","Standard_D48pds_v6","48" -"Virtual Machines Dpdsv6-series Linux","Standard_D4pds_v6","4" -"Virtual Machines Dpdsv6-series Linux","Standard_D64pds_v6","64" -"Virtual Machines Dpdsv6-series Linux","Standard_D8pds_v6","8" -"Virtual Machines Dpdsv6-series Linux","Standard_D96pds_v6","96" -"Virtual Machines Dpldsv6-series Linux","Standard_D16plds_v6","16" -"Virtual Machines Dpldsv6-series Linux","Standard_D2plds_v6","2" -"Virtual Machines Dpldsv6-series Linux","Standard_D32plds_v6","32" -"Virtual Machines Dpldsv6-series Linux","Standard_D48plds_v6","48" -"Virtual Machines Dpldsv6-series Linux","Standard_D4plds_v6","4" -"Virtual Machines Dpldsv6-series Linux","Standard_D64plds_v6","64" -"Virtual Machines Dpldsv6-series Linux","Standard_D8plds_v6","8" -"Virtual Machines Dpldsv6-series Linux","Standard_D96plds_v6","96" -"Virtual Machines Dplsv6-series Linux","Standard_D16pls_v6","16" -"Virtual Machines Dplsv6-series Linux","Standard_D2pls_v6","2" -"Virtual Machines Dplsv6-series Linux","Standard_D32pls_v6","32" -"Virtual Machines Dplsv6-series Linux","Standard_D48pls_v6","48" -"Virtual Machines Dplsv6-series Linux","Standard_D4pls_v6","4" -"Virtual Machines Dplsv6-series Linux","Standard_D64pls_v6","64" -"Virtual Machines Dplsv6-series Linux","Standard_D8pls_v6","8" -"Virtual Machines Dplsv6-series Linux","Standard_D96pls_v6","96" -"Virtual Machines Dpsv6-series Linux","Standard_D16ps_v6","16" -"Virtual Machines Dpsv6-series Linux","Standard_D2ps_v6","2" -"Virtual Machines Dpsv6-series Linux","Standard_D32ps_v6","32" -"Virtual Machines Dpsv6-series Linux","Standard_D48ps_v6","48" -"Virtual Machines Dpsv6-series Linux","Standard_D4ps_v6","4" -"Virtual Machines Dpsv6-series Linux","Standard_D64ps_v6","64" -"Virtual Machines Dpsv6-series Linux","Standard_D8ps_v6","8" -"Virtual Machines Dpsv6-series Linux","Standard_D96ps_v6","96" -"Virtual Machines Dsv6-series DedicatedHost","dsv6_type1","192" -"Virtual Machines Dsv6-series Linux","Standard_D128s_v6","127.74" -"Virtual Machines Dsv6-series Linux","Standard_D16s_v6","16" -"Virtual Machines Dsv6-series Linux","Standard_D192s_v6","191.62" -"Virtual Machines Dsv6-series Linux","Standard_D2s_v6","2" -"Virtual Machines Dsv6-series Linux","Standard_D32s_v6","32" -"Virtual Machines Dsv6-series Linux","Standard_D48s_v6","48" -"Virtual Machines Dsv6-series Linux","Standard_D4s_v6","4" -"Virtual Machines Dsv6-series Linux","Standard_D64s_v6","63.88" -"Virtual Machines Dsv6-series Linux","Standard_D8s_v6","8" -"Virtual Machines Dsv6-series Linux","Standard_D96s_v6","95.8" -"Virtual Machines Eadsv6-series Linux","Standard_E16ads_v6","16" -"Virtual Machines Eadsv6-series Linux","Standard_E20ads_v6","20" -"Virtual Machines Eadsv6-series Linux","Standard_E2ads_v6","2" -"Virtual Machines Eadsv6-series Linux","Standard_E32ads_v6","32" -"Virtual Machines Eadsv6-series Linux","Standard_E48ads_v6","48" -"Virtual Machines Eadsv6-series Linux","Standard_E4ads_v6","4" -"Virtual Machines Eadsv6-series Linux","Standard_E64ads_v6","64" -"Virtual Machines Eadsv6-series Linux","Standard_E8ads_v6","8" -"Virtual Machines Eadsv6-series Linux","Standard_E96ads_v6","96.14" -"Virtual Machines Eadsv7-series Linux","Standard_E128-32ads_v7","128" -"Virtual Machines Eadsv7-series Linux","Standard_E128-64ads_v7","128" -"Virtual Machines Eadsv7-series Linux","Standard_E128ads_v7","128" -"Virtual Machines Eadsv7-series Linux","Standard_E16-4ads_v7","16" -"Virtual Machines Eadsv7-series Linux","Standard_E16-8ads_v7","16" -"Virtual Machines Eadsv7-series Linux","Standard_E160ads_v7","160" -"Virtual Machines Eadsv7-series Linux","Standard_E16ads_v7","16" -"Virtual Machines Eadsv7-series Linux","Standard_E2ads_v7","2" -"Virtual Machines Eadsv7-series Linux","Standard_E32-16ads_v7","32" -"Virtual Machines Eadsv7-series Linux","Standard_E32-8ads_v7","32" -"Virtual Machines Eadsv7-series Linux","Standard_E32ads_v7","32" -"Virtual Machines Eadsv7-series Linux","Standard_E4-2ads_v7","4" -"Virtual Machines Eadsv7-series Linux","Standard_E48ads_v7","48" -"Virtual Machines Eadsv7-series Linux","Standard_E4ads_v7","4" -"Virtual Machines Eadsv7-series Linux","Standard_E64-16ads_v7","64" -"Virtual Machines Eadsv7-series Linux","Standard_E64-32ads_v7","64" -"Virtual Machines Eadsv7-series Linux","Standard_E64ads_v7","64" -"Virtual Machines Eadsv7-series Linux","Standard_E8-2ads_v7","8" -"Virtual Machines Eadsv7-series Linux","Standard_E8-4ads_v7","8" -"Virtual Machines Eadsv7-series Linux","Standard_E8ads_v7","8" -"Virtual Machines Eadsv7-series Linux","Standard_E96-24ads_v7","96" -"Virtual Machines Eadsv7-series Linux","Standard_E96-48ads_v7","96" -"Virtual Machines Eadsv7-series Linux","Standard_E96ads_v7","96" -"Virtual Machines Easv6-series DedicatedHost","easv6_type1","144" -"Virtual Machines Easv6-series Linux","Standard_E16as_v6","16" -"Virtual Machines Easv6-series Linux","Standard_E20as_v6","20" -"Virtual Machines Easv6-series Linux","Standard_E2as_v6","2" -"Virtual Machines Easv6-series Linux","Standard_E32as_v6","32" -"Virtual Machines Easv6-series Linux","Standard_E48as_v6","48" -"Virtual Machines Easv6-series Linux","Standard_E4as_v6","4" -"Virtual Machines Easv6-series Linux","Standard_E64as_v6","64.1" -"Virtual Machines Easv6-series Linux","Standard_E8as_v6","8" -"Virtual Machines Easv6-series Linux","Standard_E96as_v6","96.16" -"Virtual Machines Easv7-series Linux","Standard_E128-32as_v7","128" -"Virtual Machines Easv7-series Linux","Standard_E128-64as_v7","128" -"Virtual Machines Easv7-series Linux","Standard_E128as_v7","128" -"Virtual Machines Easv7-series Linux","Standard_E16-4as_v7","16" -"Virtual Machines Easv7-series Linux","Standard_E16-8as_v7","16" -"Virtual Machines Easv7-series Linux","Standard_E160as_v7","160" -"Virtual Machines Easv7-series Linux","Standard_E16as_v7","16" -"Virtual Machines Easv7-series Linux","Standard_E2as_v7","2" -"Virtual Machines Easv7-series Linux","Standard_E32-16as_v7","32" -"Virtual Machines Easv7-series Linux","Standard_E32-8as_v7","32" -"Virtual Machines Easv7-series Linux","Standard_E32as_v7","32" -"Virtual Machines Easv7-series Linux","Standard_E4-2as_v7","4" -"Virtual Machines Easv7-series Linux","Standard_E48as_v7","48" -"Virtual Machines Easv7-series Linux","Standard_E4as_v7","4" -"Virtual Machines Easv7-series Linux","Standard_E64-16as_v7","64" -"Virtual Machines Easv7-series Linux","Standard_E64-32as_v7","64" -"Virtual Machines Easv7-series Linux","Standard_E64as_v7","64" -"Virtual Machines Easv7-series Linux","Standard_E8-2as_v7","8" -"Virtual Machines Easv7-series Linux","Standard_E8-4as_v7","8" -"Virtual Machines Easv7-series Linux","Standard_E8as_v7","8" -"Virtual Machines Easv7-series Linux","Standard_E96-24as_v7","96" -"Virtual Machines Easv7-series Linux","Standard_E96-48as_v7","96" -"Virtual Machines Easv7-series Linux","Standard_E96as_v7","96" -"Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","16" -"Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","2" -"Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","32" -"Virtual Machines ECadsv6-series Linux","Standard_EC48ads_v6","48" -"Virtual Machines ECadsv6-series Linux","Standard_EC4ads_v6","4" -"Virtual Machines ECadsv6-series Linux","Standard_EC64ads_v6","64" -"Virtual Machines ECadsv6-series Linux","Standard_EC8ads_v6","8" -"Virtual Machines ECadsv6-series Linux","Standard_EC96ads_v6","96" -"Virtual Machines ECasv6-series Linux","Standard_EC16as_v6","16" -"Virtual Machines ECasv6-series Linux","Standard_EC2as_v6","2" -"Virtual Machines ECasv6-series Linux","Standard_EC32as_v6","32" -"Virtual Machines ECasv6-series Linux","Standard_EC48as_v6","48" -"Virtual Machines ECasv6-series Linux","Standard_EC4as_v6","4" -"Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","64" -"Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","8" -"Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","96" -"Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","16" -"Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","2" -"Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","32" -"Virtual Machines ECedsv6-series Linux","Standard_EC48eds_v6","48" -"Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","4" -"Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","64" -"Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","8" -"Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","16" -"Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","2" -"Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","32" -"Virtual Machines ECesv6-series Linux","Standard_EC48es_v6","48" -"Virtual Machines ECesv6-series Linux","Standard_EC4es_v6","4" -"Virtual Machines ECesv6-series Linux","Standard_EC64es_v6","64" -"Virtual Machines ECesv6-series Linux","Standard_EC8es_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E128-32ds_v6","127.62" -"Virtual Machines Edsv6-series Linux","Standard_E128-64ds_v6","127.62" -"Virtual Machines Edsv6-series Linux","Standard_E128ds_v6","127.62" -"Virtual Machines Edsv6-series Linux","Standard_E16-4ds_v6","16" -"Virtual Machines Edsv6-series Linux","Standard_E16-8ds_v6","16" -"Virtual Machines Edsv6-series Linux","Standard_E16ds_v6","16" -"Virtual Machines Edsv6-series Linux","Standard_E192ids_v6","210.58" -"Virtual Machines Edsv6-series Linux","Standard_E20ds_v6","20" -"Virtual Machines Edsv6-series Linux","Standard_E2ds_v6","2" -"Virtual Machines Edsv6-series Linux","Standard_E32-16ds_v6","32" -"Virtual Machines Edsv6-series Linux","Standard_E32-8ds_v6","32" -"Virtual Machines Edsv6-series Linux","Standard_E32ds_v6","32" -"Virtual Machines Edsv6-series Linux","Standard_E4-2ds_v6","4" -"Virtual Machines Edsv6-series Linux","Standard_E48ds_v6","47.86" -"Virtual Machines Edsv6-series Linux","Standard_E4ds_v6","4" -"Virtual Machines Edsv6-series Linux","Standard_E64-16ds_v6","63.82" -"Virtual Machines Edsv6-series Linux","Standard_E64-32ds_v6","63.82" -"Virtual Machines Edsv6-series Linux","Standard_E64ds_v6","63.82" -"Virtual Machines Edsv6-series Linux","Standard_E8-2ds_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E8-4ds_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E8ds_v6","8" -"Virtual Machines Edsv6-series Linux","Standard_E96-24ds_v6","95.72" -"Virtual Machines Edsv6-series Linux","Standard_E96-48ds_v6","95.72" -"Virtual Machines Edsv6-series Linux","Standard_E96ds_v6","95.72" -"Virtual Machines Endv6-series Linux","Standard_E128nds_v6","128" -"Virtual Machines Endv6-series Linux","Standard_E16nds_v6","16" -"Virtual Machines Endv6-series Linux","Standard_E2nds_v6","2" -"Virtual Machines Endv6-series Linux","Standard_E32nds_v6","32" -"Virtual Machines Endv6-series Linux","Standard_E48nds_v6","48" -"Virtual Machines Endv6-series Linux","Standard_E4nds_v6","4" -"Virtual Machines Endv6-series Linux","Standard_E64nds_v6","64" -"Virtual Machines Endv6-series Linux","Standard_E8nds_v6","8" -"Virtual Machines Endv6-series Linux","Standard_E96nds_v6","96" -"Virtual Machines Env6-series Linux","Standard_E128ns_v6","128" -"Virtual Machines Env6-series Linux","Standard_E16ns_v6","16" -"Virtual Machines Env6-series Linux","Standard_E2ns_v6","2" -"Virtual Machines Env6-series Linux","Standard_E32ns_v6","32" -"Virtual Machines Env6-series Linux","Standard_E48ns_v6","48" -"Virtual Machines Env6-series Linux","Standard_E4ns_v6","4" -"Virtual Machines Env6-series Linux","Standard_E64ns_v6","64" -"Virtual Machines Env6-series Linux","Standard_E8ns_v6","8" -"Virtual Machines Env6-series Linux","Standard_E96ns_v6","96" -"Virtual Machines Epdsv6-series Linux","Standard_E16pds_v6","16" -"Virtual Machines Epdsv6-series Linux","Standard_E2pds_v6","2" -"Virtual Machines Epdsv6-series Linux","Standard_E32pds_v6","32" -"Virtual Machines Epdsv6-series Linux","Standard_E48pds_v6","48" -"Virtual Machines Epdsv6-series Linux","Standard_E4pds_v6","4" -"Virtual Machines Epdsv6-series Linux","Standard_E64pds_v6","64" -"Virtual Machines Epdsv6-series Linux","Standard_E8pds_v6","8" -"Virtual Machines Epdsv6-series Linux","Standard_E96pds_v6","96" -"Virtual Machines Epsv6-series Linux","Standard_E16ps_v6","16" -"Virtual Machines Epsv6-series Linux","Standard_E2ps_v6","2" -"Virtual Machines Epsv6-series Linux","Standard_E32ps_v6","32" -"Virtual Machines Epsv6-series Linux","Standard_E48ps_v6","48" -"Virtual Machines Epsv6-series Linux","Standard_E4ps_v6","4" -"Virtual Machines Epsv6-series Linux","Standard_E64ps_v6","64" -"Virtual Machines Epsv6-series Linux","Standard_E8ps_v6","8" -"Virtual Machines Epsv6-series Linux","Standard_E96ps_v6","96" -"Virtual Machines Esv6-series DedicatedHost","esv6_type1","192" -"Virtual Machines Esv6-series Linux","Standard_E128-32s_v6","128.28" -"Virtual Machines Esv6-series Linux","Standard_E128-64s_v6","128.28" -"Virtual Machines Esv6-series Linux","Standard_E128s_v6","128.28" -"Virtual Machines Esv6-series Linux","Standard_E16-4s_v6","16" -"Virtual Machines Esv6-series Linux","Standard_E16-8s_v6","16" -"Virtual Machines Esv6-series Linux","Standard_E16s_v6","16" -"Virtual Machines Esv6-series Linux","Standard_E192is_v6","211.68" -"Virtual Machines Esv6-series Linux","Standard_E20s_v6","20" -"Virtual Machines Esv6-series Linux","Standard_E2s_v6","2" -"Virtual Machines Esv6-series Linux","Standard_E32-16s_v6","32" -"Virtual Machines Esv6-series Linux","Standard_E32-8s_v6","32" -"Virtual Machines Esv6-series Linux","Standard_E32s_v6","32" -"Virtual Machines Esv6-series Linux","Standard_E4-2s_v6","4" -"Virtual Machines Esv6-series Linux","Standard_E48s_v6","48.1" -"Virtual Machines Esv6-series Linux","Standard_E4s_v6","4" -"Virtual Machines Esv6-series Linux","Standard_E64-16s_v6","64.16" -"Virtual Machines Esv6-series Linux","Standard_E64-32s_v6","64.16" -"Virtual Machines Esv6-series Linux","Standard_E64s_v6","64.16" -"Virtual Machines Esv6-series Linux","Standard_E8-2s_v6","8" -"Virtual Machines Esv6-series Linux","Standard_E8-4s_v6","8" -"Virtual Machines Esv6-series Linux","Standard_E8s_v6","8" -"Virtual Machines Esv6-series Linux","Standard_E96-24s_v6","96.22" -"Virtual Machines Esv6-series Linux","Standard_E96-48s_v6","96.22" -"Virtual Machines Esv6-series Linux","Standard_E96s_v6","96.22" +"MdSv2 Series 32 Disk","Standard_M32dms_v2","1" +"MdSv2 Series 64 Disk","Standard_M64ds_v2","1" +"MdSv2 Series Disk","Standard_M192idms_v2","1" +"MdSv2 Series Disk 192s","Standard_M192ids_v2","1" +"MdSv2 Series Fractional High Memory Disk","Standard_M128ds_v2","1" +"MdSv2 Series High Memory Disk","Standard_M128dms_v2","1" +"MdSv2 Series Memory Disk","Standard_M64dms_v2","1" +"Mdsv2 Series Dedicated Host","mdsv2medmem_type1","1" +"Mdsv2 Series HM Dedicated Host","mdmsv2medmem _type1","1" +"NCads A100 v4 Series Linux","Standard_NC24ads_A100_v4","1" +"NCads A100 v4 Series Linux","Standard_NC48ads_A100_v4","2" +"NCads A100 v4 Series Linux","Standard_NC96ads_A100_v4","4" +"NCas T4 v3 Series","Standard_NC16as_T4_v3","2.29" +"NCas T4 v3 Series","Standard_NC4as_T4_v3","1" +"NCas T4 v3 Series","Standard_NC64as_T4_v3","8.27" +"NCas T4 v3 Series","Standard_NC8as_T4_v3","1.43" +"NCasA10_v4 Linux","Standard_NC16ads_A10_v4","2" +"NCasA10_v4 Linux","Standard_NC32ads_A10_v4","4" +"NCasA10_v4 Linux","Standard_NC8ads_A10_v4","1" +"NDamsr A100 v4 Series","ndamsra100v4_type1","1" +"NDamsr A100 v4 Series Linux","Standard_ND96amsr_A100_v4","1" +"NDasr A100 v4 Series","Standard_ND96asr_v4","1" +"NDasr A100 v4 Series","ndasra100v4_type1","1.1" +"NDrSv2 Series Low Latency","Standard_ND40rs_v2","1" +"NP Series","Standard_NP10s","1" +"NP Series","Standard_NP20s","2" +"NP Series","Standard_NP40s","4" +"NVadsA10_v5 DedicatedHost","nvadsa10v5_type1","1" +"NVadsA10_v5 Linux","Standard_NV12ads_A10_v5","2" +"NVadsA10_v5 Linux","Standard_NV18ads_A10_v5","3.52" +"NVadsA10_v5 Linux","Standard_NV36adms_A10_v5","9.96" +"NVadsA10_v5 Linux","Standard_NV36ads_A10_v5","7.05" +"NVadsA10_v5 Linux","Standard_NV6ads_A10_v5","1" +"NVadsA10_v5 Linux","Standard_NV72ads_A10_v5","14.36" +"Virtual Machines DCadsv6-series Linux","Standard_DC16ads_v6","8" +"Virtual Machines DCadsv6-series Linux","Standard_DC2ads_v6","1" +"Virtual Machines DCadsv6-series Linux","Standard_DC32ads_v6","16" +"Virtual Machines DCadsv6-series Linux","Standard_DC48ads_v6","24" +"Virtual Machines DCadsv6-series Linux","Standard_DC4ads_v6","2" +"Virtual Machines DCadsv6-series Linux","Standard_DC64ads_v6","32" +"Virtual Machines DCadsv6-series Linux","Standard_DC8ads_v6","4" +"Virtual Machines DCadsv6-series Linux","Standard_DC96ads_v6","48" +"Virtual Machines DCasv6-series Linux","Standard_DC16as_v6","8" +"Virtual Machines DCasv6-series Linux","Standard_DC2as_v6","1" +"Virtual Machines DCasv6-series Linux","Standard_DC32as_v6","16" +"Virtual Machines DCasv6-series Linux","Standard_DC48as_v6","24" +"Virtual Machines DCasv6-series Linux","Standard_DC4as_v6","2" +"Virtual Machines DCasv6-series Linux","Standard_DC64as_v6","32" +"Virtual Machines DCasv6-series Linux","Standard_DC8as_v6","4" +"Virtual Machines DCasv6-series Linux","Standard_DC96as_v6","48" +"Virtual Machines DCedsv6-series Linux","Standard_DC128eds_v6","64" +"Virtual Machines DCedsv6-series Linux","Standard_DC16eds_v6","8" +"Virtual Machines DCedsv6-series Linux","Standard_DC2eds_v6","1" +"Virtual Machines DCedsv6-series Linux","Standard_DC32eds_v6","16" +"Virtual Machines DCedsv6-series Linux","Standard_DC48eds_v6","24" +"Virtual Machines DCedsv6-series Linux","Standard_DC4eds_v6","2" +"Virtual Machines DCedsv6-series Linux","Standard_DC64eds_v6","32" +"Virtual Machines DCedsv6-series Linux","Standard_DC8eds_v6","4" +"Virtual Machines DCedsv6-series Linux","Standard_DC96eds_v6","48" +"Virtual Machines DCesv6-series Linux","Standard_DC128es_v6","64" +"Virtual Machines DCesv6-series Linux","Standard_DC16es_v6","8" +"Virtual Machines DCesv6-series Linux","Standard_DC2es_v6","1" +"Virtual Machines DCesv6-series Linux","Standard_DC32es_v6","16" +"Virtual Machines DCesv6-series Linux","Standard_DC48es_v6","24" +"Virtual Machines DCesv6-series Linux","Standard_DC4es_v6","2" +"Virtual Machines DCesv6-series Linux","Standard_DC64es_v6","32" +"Virtual Machines DCesv6-series Linux","Standard_DC8es_v6","4" +"Virtual Machines DCesv6-series Linux","Standard_DC96es_v6","48" +"Virtual Machines Dadsv6-series Linux","Standard_D16ads_v6","8" +"Virtual Machines Dadsv6-series Linux","Standard_D2ads_v6","1" +"Virtual Machines Dadsv6-series Linux","Standard_D32ads_v6","16" +"Virtual Machines Dadsv6-series Linux","Standard_D48ads_v6","24" +"Virtual Machines Dadsv6-series Linux","Standard_D4ads_v6","2" +"Virtual Machines Dadsv6-series Linux","Standard_D64ads_v6","32" +"Virtual Machines Dadsv6-series Linux","Standard_D8ads_v6","4" +"Virtual Machines Dadsv6-series Linux","Standard_D96ads_v6","48" +"Virtual Machines Dadsv7-series Linux","Standard_D128ads_v7","64" +"Virtual Machines Dadsv7-series Linux","Standard_D160ads_v7","80" +"Virtual Machines Dadsv7-series Linux","Standard_D16ads_v7","8" +"Virtual Machines Dadsv7-series Linux","Standard_D2ads_v7","1" +"Virtual Machines Dadsv7-series Linux","Standard_D32ads_v7","16" +"Virtual Machines Dadsv7-series Linux","Standard_D48ads_v7","24" +"Virtual Machines Dadsv7-series Linux","Standard_D4ads_v7","2" +"Virtual Machines Dadsv7-series Linux","Standard_D64ads_v7","32" +"Virtual Machines Dadsv7-series Linux","Standard_D8ads_v7","4" +"Virtual Machines Dadsv7-series Linux","Standard_D96ads_v7","48" +"Virtual Machines Daldsv6-series Linux","Standard_D16alds_v6","8" +"Virtual Machines Daldsv6-series Linux","Standard_D2alds_v6","1" +"Virtual Machines Daldsv6-series Linux","Standard_D32alds_v6","16" +"Virtual Machines Daldsv6-series Linux","Standard_D48alds_v6","24" +"Virtual Machines Daldsv6-series Linux","Standard_D4alds_v6","2" +"Virtual Machines Daldsv6-series Linux","Standard_D64alds_v6","32" +"Virtual Machines Daldsv6-series Linux","Standard_D8alds_v6","4" +"Virtual Machines Daldsv6-series Linux","Standard_D96alds_v6","48" +"Virtual Machines Daldsv7-series Linux","Standard_D128alds_v7","64" +"Virtual Machines Daldsv7-series Linux","Standard_D160alds_v7","80" +"Virtual Machines Daldsv7-series Linux","Standard_D16alds_v7","8" +"Virtual Machines Daldsv7-series Linux","Standard_D2alds_v7","1" +"Virtual Machines Daldsv7-series Linux","Standard_D32alds_v7","16" +"Virtual Machines Daldsv7-series Linux","Standard_D48alds_v7","24" +"Virtual Machines Daldsv7-series Linux","Standard_D4alds_v7","2" +"Virtual Machines Daldsv7-series Linux","Standard_D64alds_v7","32" +"Virtual Machines Daldsv7-series Linux","Standard_D8alds_v7","4" +"Virtual Machines Daldsv7-series Linux","Standard_D96alds_v7","48" +"Virtual Machines Dalsv6-series Linux","Standard_D16als_v6","8" +"Virtual Machines Dalsv6-series Linux","Standard_D2als_v6","1" +"Virtual Machines Dalsv6-series Linux","Standard_D32als_v6","16" +"Virtual Machines Dalsv6-series Linux","Standard_D48als_v6","24" +"Virtual Machines Dalsv6-series Linux","Standard_D4als_v6","2" +"Virtual Machines Dalsv6-series Linux","Standard_D64als_v6","32" +"Virtual Machines Dalsv6-series Linux","Standard_D8als_v6","4" +"Virtual Machines Dalsv6-series Linux","Standard_D96als_v6","48" +"Virtual Machines Dalsv7-series Linux","Standard_D128als_v7","64" +"Virtual Machines Dalsv7-series Linux","Standard_D160als_v7","80" +"Virtual Machines Dalsv7-series Linux","Standard_D16als_v7","8" +"Virtual Machines Dalsv7-series Linux","Standard_D2als_v7","1" +"Virtual Machines Dalsv7-series Linux","Standard_D32als_v7","16" +"Virtual Machines Dalsv7-series Linux","Standard_D48als_v7","24" +"Virtual Machines Dalsv7-series Linux","Standard_D4als_v7","2" +"Virtual Machines Dalsv7-series Linux","Standard_D64als_v7","32" +"Virtual Machines Dalsv7-series Linux","Standard_D8als_v7","4" +"Virtual Machines Dalsv7-series Linux","Standard_D96als_v7","48" +"Virtual Machines Dasv6-series DedicatedHost","dasv6_type1","1" +"Virtual Machines Dasv6-series Linux","Standard_D16as_v6","8" +"Virtual Machines Dasv6-series Linux","Standard_D2as_v6","1" +"Virtual Machines Dasv6-series Linux","Standard_D32as_v6","16" +"Virtual Machines Dasv6-series Linux","Standard_D48as_v6","24" +"Virtual Machines Dasv6-series Linux","Standard_D4as_v6","2" +"Virtual Machines Dasv6-series Linux","Standard_D64as_v6","32" +"Virtual Machines Dasv6-series Linux","Standard_D8as_v6","4" +"Virtual Machines Dasv6-series Linux","Standard_D96as_v6","48" +"Virtual Machines Dasv7-series Linux","Standard_D128as_v7","64" +"Virtual Machines Dasv7-series Linux","Standard_D160as_v7","80" +"Virtual Machines Dasv7-series Linux","Standard_D16as_v7","8" +"Virtual Machines Dasv7-series Linux","Standard_D2as_v7","1" +"Virtual Machines Dasv7-series Linux","Standard_D32as_v7","16" +"Virtual Machines Dasv7-series Linux","Standard_D48as_v7","24" +"Virtual Machines Dasv7-series Linux","Standard_D4as_v7","2" +"Virtual Machines Dasv7-series Linux","Standard_D64as_v7","32" +"Virtual Machines Dasv7-series Linux","Standard_D8as_v7","4" +"Virtual Machines Dasv7-series Linux","Standard_D96as_v7","48" +"Virtual Machines Ddsv6-series DedicatedHost","ddsv6_type1","1" +"Virtual Machines Ddsv6-series Linux","Standard_D128ds_v6","63.78" +"Virtual Machines Ddsv6-series Linux","Standard_D16ds_v6","8" +"Virtual Machines Ddsv6-series Linux","Standard_D192ds_v6","95.68" +"Virtual Machines Ddsv6-series Linux","Standard_D2ds_v6","1" +"Virtual Machines Ddsv6-series Linux","Standard_D32ds_v6","15.94" +"Virtual Machines Ddsv6-series Linux","Standard_D48ds_v6","23.92" +"Virtual Machines Ddsv6-series Linux","Standard_D4ds_v6","2" +"Virtual Machines Ddsv6-series Linux","Standard_D64ds_v6","31.9" +"Virtual Machines Ddsv6-series Linux","Standard_D8ds_v6","4" +"Virtual Machines Ddsv6-series Linux","Standard_D96ds_v6","47.84" +"Virtual Machines Dldsv6-series Linux","Standard_D128lds_v6","64.18" +"Virtual Machines Dldsv6-series Linux","Standard_D16lds_v6","8" +"Virtual Machines Dldsv6-series Linux","Standard_D2lds_v6","1" +"Virtual Machines Dldsv6-series Linux","Standard_D32lds_v6","16" +"Virtual Machines Dldsv6-series Linux","Standard_D48lds_v6","24.07" +"Virtual Machines Dldsv6-series Linux","Standard_D4lds_v6","2" +"Virtual Machines Dldsv6-series Linux","Standard_D64lds_v6","32.09" +"Virtual Machines Dldsv6-series Linux","Standard_D8lds_v6","4" +"Virtual Machines Dldsv6-series Linux","Standard_D96lds_v6","48.14" +"Virtual Machines Dlsv6-Series Linux","Standard_D128ls_v6","64" +"Virtual Machines Dlsv6-Series Linux","Standard_D16ls_v6","8" +"Virtual Machines Dlsv6-Series Linux","Standard_D2ls_v6","1" +"Virtual Machines Dlsv6-Series Linux","Standard_D32ls_v6","16" +"Virtual Machines Dlsv6-Series Linux","Standard_D48ls_v6","24" +"Virtual Machines Dlsv6-Series Linux","Standard_D4ls_v6","2" +"Virtual Machines Dlsv6-Series Linux","Standard_D64ls_v6","32" +"Virtual Machines Dlsv6-Series Linux","Standard_D8ls_v6","4" +"Virtual Machines Dlsv6-Series Linux","Standard_D96ls_v6","48" +"Virtual Machines Dndv6-series Linux","Standard_D128nds_v6","64" +"Virtual Machines Dndv6-series Linux","Standard_D16nds_v6","8" +"Virtual Machines Dndv6-series Linux","Standard_D2nds_v6","1" +"Virtual Machines Dndv6-series Linux","Standard_D32nds_v6","16" +"Virtual Machines Dndv6-series Linux","Standard_D48nds_v6","24" +"Virtual Machines Dndv6-series Linux","Standard_D4nds_v6","2" +"Virtual Machines Dndv6-series Linux","Standard_D64nds_v6","32" +"Virtual Machines Dndv6-series Linux","Standard_D8nds_v6","4" +"Virtual Machines Dndv6-series Linux","Standard_D96nds_v6","48" +"Virtual Machines Dnldv6-series Linux","Standard_D128nlds_v6","64" +"Virtual Machines Dnldv6-series Linux","Standard_D16nlds_v6","8" +"Virtual Machines Dnldv6-series Linux","Standard_D2nlds_v6","1" +"Virtual Machines Dnldv6-series Linux","Standard_D32nlds_v6","16" +"Virtual Machines Dnldv6-series Linux","Standard_D48nlds_v6","24" +"Virtual Machines Dnldv6-series Linux","Standard_D4nlds_v6","2" +"Virtual Machines Dnldv6-series Linux","Standard_D64nlds_v6","32" +"Virtual Machines Dnldv6-series Linux","Standard_D8nlds_v6","4" +"Virtual Machines Dnldv6-series Linux","Standard_D96nlds_v6","48" +"Virtual Machines Dnlv6-series Linux","Standard_D128nls_v6","64" +"Virtual Machines Dnlv6-series Linux","Standard_D16nls_v6","8" +"Virtual Machines Dnlv6-series Linux","Standard_D2nls_v6","1" +"Virtual Machines Dnlv6-series Linux","Standard_D32nls_v6","16" +"Virtual Machines Dnlv6-series Linux","Standard_D48nls_v6","24" +"Virtual Machines Dnlv6-series Linux","Standard_D4nls_v6","2" +"Virtual Machines Dnlv6-series Linux","Standard_D64nls_v6","32" +"Virtual Machines Dnlv6-series Linux","Standard_D8nls_v6","4" +"Virtual Machines Dnlv6-series Linux","Standard_D96nls_v6","48" +"Virtual Machines Dnv6-series Linux","Standard_D128ns_v6","64" +"Virtual Machines Dnv6-series Linux","Standard_D16ns_v6","8" +"Virtual Machines Dnv6-series Linux","Standard_D2ns_v6","1" +"Virtual Machines Dnv6-series Linux","Standard_D32ns_v6","16" +"Virtual Machines Dnv6-series Linux","Standard_D48ns_v6","24" +"Virtual Machines Dnv6-series Linux","Standard_D4ns_v6","2" +"Virtual Machines Dnv6-series Linux","Standard_D64ns_v6","32" +"Virtual Machines Dnv6-series Linux","Standard_D8ns_v6","4" +"Virtual Machines Dnv6-series Linux","Standard_D96ns_v6","48" +"Virtual Machines Dpdsv6-series Linux","Standard_D16pds_v6","8" +"Virtual Machines Dpdsv6-series Linux","Standard_D2pds_v6","1" +"Virtual Machines Dpdsv6-series Linux","Standard_D32pds_v6","16" +"Virtual Machines Dpdsv6-series Linux","Standard_D48pds_v6","24" +"Virtual Machines Dpdsv6-series Linux","Standard_D4pds_v6","2" +"Virtual Machines Dpdsv6-series Linux","Standard_D64pds_v6","32" +"Virtual Machines Dpdsv6-series Linux","Standard_D8pds_v6","4" +"Virtual Machines Dpdsv6-series Linux","Standard_D96pds_v6","48" +"Virtual Machines Dpldsv6-series Linux","Standard_D16plds_v6","8" +"Virtual Machines Dpldsv6-series Linux","Standard_D2plds_v6","1" +"Virtual Machines Dpldsv6-series Linux","Standard_D32plds_v6","16" +"Virtual Machines Dpldsv6-series Linux","Standard_D48plds_v6","24" +"Virtual Machines Dpldsv6-series Linux","Standard_D4plds_v6","2" +"Virtual Machines Dpldsv6-series Linux","Standard_D64plds_v6","32" +"Virtual Machines Dpldsv6-series Linux","Standard_D8plds_v6","4" +"Virtual Machines Dpldsv6-series Linux","Standard_D96plds_v6","48" +"Virtual Machines Dplsv6-series Linux","Standard_D16pls_v6","8" +"Virtual Machines Dplsv6-series Linux","Standard_D2pls_v6","1" +"Virtual Machines Dplsv6-series Linux","Standard_D32pls_v6","16" +"Virtual Machines Dplsv6-series Linux","Standard_D48pls_v6","24" +"Virtual Machines Dplsv6-series Linux","Standard_D4pls_v6","2" +"Virtual Machines Dplsv6-series Linux","Standard_D64pls_v6","32" +"Virtual Machines Dplsv6-series Linux","Standard_D8pls_v6","4" +"Virtual Machines Dplsv6-series Linux","Standard_D96pls_v6","48" +"Virtual Machines Dpsv6-series Linux","Standard_D16ps_v6","8" +"Virtual Machines Dpsv6-series Linux","Standard_D2ps_v6","1" +"Virtual Machines Dpsv6-series Linux","Standard_D32ps_v6","16" +"Virtual Machines Dpsv6-series Linux","Standard_D48ps_v6","24" +"Virtual Machines Dpsv6-series Linux","Standard_D4ps_v6","2" +"Virtual Machines Dpsv6-series Linux","Standard_D64ps_v6","32" +"Virtual Machines Dpsv6-series Linux","Standard_D8ps_v6","4" +"Virtual Machines Dpsv6-series Linux","Standard_D96ps_v6","48" +"Virtual Machines Dsv6-series DedicatedHost","dsv6_type1","1" +"Virtual Machines Dsv6-series Linux","Standard_D128s_v6","63.87" +"Virtual Machines Dsv6-series Linux","Standard_D16s_v6","8" +"Virtual Machines Dsv6-series Linux","Standard_D192s_v6","95.81" +"Virtual Machines Dsv6-series Linux","Standard_D2s_v6","1" +"Virtual Machines Dsv6-series Linux","Standard_D32s_v6","16" +"Virtual Machines Dsv6-series Linux","Standard_D48s_v6","24" +"Virtual Machines Dsv6-series Linux","Standard_D4s_v6","2" +"Virtual Machines Dsv6-series Linux","Standard_D64s_v6","31.94" +"Virtual Machines Dsv6-series Linux","Standard_D8s_v6","4" +"Virtual Machines Dsv6-series Linux","Standard_D96s_v6","47.9" +"Virtual Machines ECadsv6-series Linux","Standard_EC16ads_v6","8" +"Virtual Machines ECadsv6-series Linux","Standard_EC2ads_v6","1" +"Virtual Machines ECadsv6-series Linux","Standard_EC32ads_v6","16" +"Virtual Machines ECadsv6-series Linux","Standard_EC48ads_v6","24" +"Virtual Machines ECadsv6-series Linux","Standard_EC4ads_v6","2" +"Virtual Machines ECadsv6-series Linux","Standard_EC64ads_v6","32" +"Virtual Machines ECadsv6-series Linux","Standard_EC8ads_v6","4" +"Virtual Machines ECadsv6-series Linux","Standard_EC96ads_v6","48" +"Virtual Machines ECasv6-series Linux","Standard_EC16as_v6","8" +"Virtual Machines ECasv6-series Linux","Standard_EC2as_v6","1" +"Virtual Machines ECasv6-series Linux","Standard_EC32as_v6","16" +"Virtual Machines ECasv6-series Linux","Standard_EC48as_v6","24" +"Virtual Machines ECasv6-series Linux","Standard_EC4as_v6","2" +"Virtual Machines ECasv6-series Linux","Standard_EC64as_v6","32" +"Virtual Machines ECasv6-series Linux","Standard_EC8as_v6","4" +"Virtual Machines ECasv6-series Linux","Standard_EC96as_v6","48" +"Virtual Machines ECedsv6-series Linux","Standard_EC16eds_v6","8" +"Virtual Machines ECedsv6-series Linux","Standard_EC2eds_v6","1" +"Virtual Machines ECedsv6-series Linux","Standard_EC32eds_v6","16" +"Virtual Machines ECedsv6-series Linux","Standard_EC48eds_v6","24" +"Virtual Machines ECedsv6-series Linux","Standard_EC4eds_v6","2" +"Virtual Machines ECedsv6-series Linux","Standard_EC64eds_v6","32" +"Virtual Machines ECedsv6-series Linux","Standard_EC8eds_v6","4" +"Virtual Machines ECesv6-series Linux","Standard_EC16es_v6","8" +"Virtual Machines ECesv6-series Linux","Standard_EC2es_v6","1" +"Virtual Machines ECesv6-series Linux","Standard_EC32es_v6","16" +"Virtual Machines ECesv6-series Linux","Standard_EC48es_v6","24" +"Virtual Machines ECesv6-series Linux","Standard_EC4es_v6","2" +"Virtual Machines ECesv6-series Linux","Standard_EC64es_v6","32" +"Virtual Machines ECesv6-series Linux","Standard_EC8es_v6","4" +"Virtual Machines Eadsv6-series Linux","Standard_E16ads_v6","8" +"Virtual Machines Eadsv6-series Linux","Standard_E20ads_v6","10" +"Virtual Machines Eadsv6-series Linux","Standard_E2ads_v6","1" +"Virtual Machines Eadsv6-series Linux","Standard_E32ads_v6","16" +"Virtual Machines Eadsv6-series Linux","Standard_E48ads_v6","24" +"Virtual Machines Eadsv6-series Linux","Standard_E4ads_v6","2" +"Virtual Machines Eadsv6-series Linux","Standard_E64ads_v6","32" +"Virtual Machines Eadsv6-series Linux","Standard_E8ads_v6","4" +"Virtual Machines Eadsv6-series Linux","Standard_E96-24ads_v6","48.07" +"Virtual Machines Eadsv6-series Linux","Standard_E96-48ads_v6","48.07" +"Virtual Machines Eadsv6-series Linux","Standard_E96ads_v6","48.07" +"Virtual Machines Eadsv7-series Linux","Standard_E128-32ads_v7","64" +"Virtual Machines Eadsv7-series Linux","Standard_E128-64ads_v7","64" +"Virtual Machines Eadsv7-series Linux","Standard_E128ads_v7","64" +"Virtual Machines Eadsv7-series Linux","Standard_E16-4ads_v7","8" +"Virtual Machines Eadsv7-series Linux","Standard_E16-8ads_v7","8" +"Virtual Machines Eadsv7-series Linux","Standard_E160ads_v7","80" +"Virtual Machines Eadsv7-series Linux","Standard_E16ads_v7","8" +"Virtual Machines Eadsv7-series Linux","Standard_E2ads_v7","1" +"Virtual Machines Eadsv7-series Linux","Standard_E32-16ads_v7","16" +"Virtual Machines Eadsv7-series Linux","Standard_E32-8ads_v7","16" +"Virtual Machines Eadsv7-series Linux","Standard_E32ads_v7","16" +"Virtual Machines Eadsv7-series Linux","Standard_E4-2ads_v7","2" +"Virtual Machines Eadsv7-series Linux","Standard_E48ads_v7","24" +"Virtual Machines Eadsv7-series Linux","Standard_E4ads_v7","2" +"Virtual Machines Eadsv7-series Linux","Standard_E64-16ads_v7","32" +"Virtual Machines Eadsv7-series Linux","Standard_E64-32ads_v7","32" +"Virtual Machines Eadsv7-series Linux","Standard_E64ads_v7","32" +"Virtual Machines Eadsv7-series Linux","Standard_E8-2ads_v7","4" +"Virtual Machines Eadsv7-series Linux","Standard_E8-4ads_v7","4" +"Virtual Machines Eadsv7-series Linux","Standard_E8ads_v7","4" +"Virtual Machines Eadsv7-series Linux","Standard_E96-24ads_v7","48" +"Virtual Machines Eadsv7-series Linux","Standard_E96-48ads_v7","48" +"Virtual Machines Eadsv7-series Linux","Standard_E96ads_v7","48" +"Virtual Machines Easv6-series DedicatedHost","easv6_type1","1" +"Virtual Machines Easv6-series Linux","Standard_E16as_v6","8" +"Virtual Machines Easv6-series Linux","Standard_E20as_v6","10" +"Virtual Machines Easv6-series Linux","Standard_E2as_v6","1" +"Virtual Machines Easv6-series Linux","Standard_E32as_v6","16" +"Virtual Machines Easv6-series Linux","Standard_E48as_v6","24" +"Virtual Machines Easv6-series Linux","Standard_E4as_v6","2" +"Virtual Machines Easv6-series Linux","Standard_E64as_v6","32.05" +"Virtual Machines Easv6-series Linux","Standard_E8as_v6","4" +"Virtual Machines Easv6-series Linux","Standard_E96as_v6","48.08" +"Virtual Machines Easv7-series Linux","Standard_E128-32as_v7","64" +"Virtual Machines Easv7-series Linux","Standard_E128-64as_v7","64" +"Virtual Machines Easv7-series Linux","Standard_E128as_v7","64" +"Virtual Machines Easv7-series Linux","Standard_E16-4as_v7","8" +"Virtual Machines Easv7-series Linux","Standard_E16-8as_v7","8" +"Virtual Machines Easv7-series Linux","Standard_E160as_v7","80" +"Virtual Machines Easv7-series Linux","Standard_E16as_v7","8" +"Virtual Machines Easv7-series Linux","Standard_E2as_v7","1" +"Virtual Machines Easv7-series Linux","Standard_E32-16as_v7","16" +"Virtual Machines Easv7-series Linux","Standard_E32-8as_v7","16" +"Virtual Machines Easv7-series Linux","Standard_E32as_v7","16" +"Virtual Machines Easv7-series Linux","Standard_E4-2as_v7","2" +"Virtual Machines Easv7-series Linux","Standard_E48as_v7","24" +"Virtual Machines Easv7-series Linux","Standard_E4as_v7","2" +"Virtual Machines Easv7-series Linux","Standard_E64-16as_v7","32" +"Virtual Machines Easv7-series Linux","Standard_E64-32as_v7","32" +"Virtual Machines Easv7-series Linux","Standard_E64as_v7","32" +"Virtual Machines Easv7-series Linux","Standard_E8-2as_v7","4" +"Virtual Machines Easv7-series Linux","Standard_E8-4as_v7","4" +"Virtual Machines Easv7-series Linux","Standard_E8as_v7","4" +"Virtual Machines Easv7-series Linux","Standard_E96-24as_v7","48" +"Virtual Machines Easv7-series Linux","Standard_E96-48as_v7","48" +"Virtual Machines Easv7-series Linux","Standard_E96as_v7","48" +"Virtual Machines Edsv6-series Linux","Standard_E128-32ds_v6","63.81" +"Virtual Machines Edsv6-series Linux","Standard_E128-64ds_v6","63.81" +"Virtual Machines Edsv6-series Linux","Standard_E128ds_v6","63.81" +"Virtual Machines Edsv6-series Linux","Standard_E16-4ds_v6","8" +"Virtual Machines Edsv6-series Linux","Standard_E16-8ds_v6","8" +"Virtual Machines Edsv6-series Linux","Standard_E16ds_v6","8" +"Virtual Machines Edsv6-series Linux","Standard_E192ids_v6","105.29" +"Virtual Machines Edsv6-series Linux","Standard_E20ds_v6","10" +"Virtual Machines Edsv6-series Linux","Standard_E2ds_v6","1" +"Virtual Machines Edsv6-series Linux","Standard_E32-16ds_v6","16" +"Virtual Machines Edsv6-series Linux","Standard_E32-8ds_v6","16" +"Virtual Machines Edsv6-series Linux","Standard_E32ds_v6","16" +"Virtual Machines Edsv6-series Linux","Standard_E4-2ds_v6","2" +"Virtual Machines Edsv6-series Linux","Standard_E48ds_v6","23.93" +"Virtual Machines Edsv6-series Linux","Standard_E4ds_v6","2" +"Virtual Machines Edsv6-series Linux","Standard_E64-16ds_v6","31.91" +"Virtual Machines Edsv6-series Linux","Standard_E64-32ds_v6","31.91" +"Virtual Machines Edsv6-series Linux","Standard_E64ds_v6","31.91" +"Virtual Machines Edsv6-series Linux","Standard_E8-2ds_v6","4" +"Virtual Machines Edsv6-series Linux","Standard_E8-4ds_v6","4" +"Virtual Machines Edsv6-series Linux","Standard_E8ds_v6","4" +"Virtual Machines Edsv6-series Linux","Standard_E96-24ds_v6","47.86" +"Virtual Machines Edsv6-series Linux","Standard_E96-48ds_v6","47.86" +"Virtual Machines Edsv6-series Linux","Standard_E96ds_v6","47.86" +"Virtual Machines Endv6-series Linux","Standard_E128nds_v6","64" +"Virtual Machines Endv6-series Linux","Standard_E16nds_v6","8" +"Virtual Machines Endv6-series Linux","Standard_E2nds_v6","1" +"Virtual Machines Endv6-series Linux","Standard_E32nds_v6","16" +"Virtual Machines Endv6-series Linux","Standard_E48nds_v6","24" +"Virtual Machines Endv6-series Linux","Standard_E4nds_v6","2" +"Virtual Machines Endv6-series Linux","Standard_E64nds_v6","32" +"Virtual Machines Endv6-series Linux","Standard_E8nds_v6","4" +"Virtual Machines Endv6-series Linux","Standard_E96nds_v6","48" +"Virtual Machines Env6-series Linux","Standard_E128ns_v6","64" +"Virtual Machines Env6-series Linux","Standard_E16ns_v6","8" +"Virtual Machines Env6-series Linux","Standard_E2ns_v6","1" +"Virtual Machines Env6-series Linux","Standard_E32ns_v6","16" +"Virtual Machines Env6-series Linux","Standard_E48ns_v6","24" +"Virtual Machines Env6-series Linux","Standard_E4ns_v6","2" +"Virtual Machines Env6-series Linux","Standard_E64ns_v6","32" +"Virtual Machines Env6-series Linux","Standard_E8ns_v6","4" +"Virtual Machines Env6-series Linux","Standard_E96ns_v6","48" +"Virtual Machines Epdsv6-series Linux","Standard_E16pds_v6","8" +"Virtual Machines Epdsv6-series Linux","Standard_E2pds_v6","1" +"Virtual Machines Epdsv6-series Linux","Standard_E32pds_v6","16" +"Virtual Machines Epdsv6-series Linux","Standard_E48pds_v6","24" +"Virtual Machines Epdsv6-series Linux","Standard_E4pds_v6","2" +"Virtual Machines Epdsv6-series Linux","Standard_E64pds_v6","32" +"Virtual Machines Epdsv6-series Linux","Standard_E8pds_v6","4" +"Virtual Machines Epdsv6-series Linux","Standard_E96pds_v6","48" +"Virtual Machines Epsv6-series Linux","Standard_E16ps_v6","8" +"Virtual Machines Epsv6-series Linux","Standard_E2ps_v6","1" +"Virtual Machines Epsv6-series Linux","Standard_E32ps_v6","16" +"Virtual Machines Epsv6-series Linux","Standard_E48ps_v6","24" +"Virtual Machines Epsv6-series Linux","Standard_E4ps_v6","2" +"Virtual Machines Epsv6-series Linux","Standard_E64ps_v6","32" +"Virtual Machines Epsv6-series Linux","Standard_E8ps_v6","4" +"Virtual Machines Epsv6-series Linux","Standard_E96ps_v6","48" +"Virtual Machines Esv6-series DedicatedHost","esv6_type1","1" +"Virtual Machines Esv6-series Linux","Standard_E128-32s_v6","64.14" +"Virtual Machines Esv6-series Linux","Standard_E128-64s_v6","64.14" +"Virtual Machines Esv6-series Linux","Standard_E128s_v6","64.14" +"Virtual Machines Esv6-series Linux","Standard_E16-4s_v6","8" +"Virtual Machines Esv6-series Linux","Standard_E16-8s_v6","8" +"Virtual Machines Esv6-series Linux","Standard_E16s_v6","8" +"Virtual Machines Esv6-series Linux","Standard_E192is_v6","105.84" +"Virtual Machines Esv6-series Linux","Standard_E20s_v6","10" +"Virtual Machines Esv6-series Linux","Standard_E2s_v6","1" +"Virtual Machines Esv6-series Linux","Standard_E32-16s_v6","16" +"Virtual Machines Esv6-series Linux","Standard_E32-8s_v6","16" +"Virtual Machines Esv6-series Linux","Standard_E32s_v6","16" +"Virtual Machines Esv6-series Linux","Standard_E4-2s_v6","2" +"Virtual Machines Esv6-series Linux","Standard_E48s_v6","24.05" +"Virtual Machines Esv6-series Linux","Standard_E4s_v6","2" +"Virtual Machines Esv6-series Linux","Standard_E64-16s_v6","32.08" +"Virtual Machines Esv6-series Linux","Standard_E64-32s_v6","32.08" +"Virtual Machines Esv6-series Linux","Standard_E64s_v6","32.08" +"Virtual Machines Esv6-series Linux","Standard_E8-2s_v6","4" +"Virtual Machines Esv6-series Linux","Standard_E8-4s_v6","4" +"Virtual Machines Esv6-series Linux","Standard_E8s_v6","4" +"Virtual Machines Esv6-series Linux","Standard_E96-24s_v6","48.11" +"Virtual Machines Esv6-series Linux","Standard_E96-48s_v6","48.11" +"Virtual Machines Esv6-series Linux","Standard_E96s_v6","48.11" +"Virtual Machines FXmdsv2-series Linux","Standard_FX12-6mds_v2","6" +"Virtual Machines FXmdsv2-series Linux","Standard_FX12mds_v2","6" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16-4mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16-8mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX16mds_v2","8" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24-12mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24-6mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX24mds_v2","12" +"Virtual Machines FXmdsv2-series Linux","Standard_FX2mds_v2","1" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32-16mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32-8mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX32mds_v2","16" +"Virtual Machines FXmdsv2-series Linux","Standard_FX4-2mds_v2","2" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48-12mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48-24mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX48mds_v2","24" +"Virtual Machines FXmdsv2-series Linux","Standard_FX4mds_v2","2" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64-16mds_v2","31.95" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64-32mds_v2","31.95" +"Virtual Machines FXmdsv2-series Linux","Standard_FX64mds_v2","31.95" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8-2mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8-4mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX8mds_v2","4" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96-24mds_v2","47.92" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96-48mds_v2","47.92" +"Virtual Machines FXmdsv2-series Linux","Standard_FX96mds_v2","47.92" +"Virtual Machines FXmsv2-series Linux","Standard_FX12-6ms_v2","6" +"Virtual Machines FXmsv2-series Linux","Standard_FX12ms_v2","6" +"Virtual Machines FXmsv2-series Linux","Standard_FX16-4ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX16-8ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX16ms_v2","8" +"Virtual Machines FXmsv2-series Linux","Standard_FX24-12ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX24-6ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX24ms_v2","12" +"Virtual Machines FXmsv2-series Linux","Standard_FX2ms_v2","1" +"Virtual Machines FXmsv2-series Linux","Standard_FX32-16ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX32-8ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX32ms_v2","16" +"Virtual Machines FXmsv2-series Linux","Standard_FX4-2ms_v2","2" +"Virtual Machines FXmsv2-series Linux","Standard_FX48-12ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX48-24ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX48ms_v2","24" +"Virtual Machines FXmsv2-series Linux","Standard_FX4ms_v2","2" +"Virtual Machines FXmsv2-series Linux","Standard_FX64-16ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX64-32ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX64ms_v2","32" +"Virtual Machines FXmsv2-series Linux","Standard_FX8-2ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX8-4ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX8ms_v2","4" +"Virtual Machines FXmsv2-series Linux","Standard_FX96-24ms_v2","48.07" +"Virtual Machines FXmsv2-series Linux","Standard_FX96-48ms_v2","48.07" +"Virtual Machines FXmsv2-series Linux","Standard_FX96ms_v2","48.07" "Virtual Machines Fadsv7-series Linux","Standard_F16ads_v7","16" "Virtual Machines Fadsv7-series Linux","Standard_F1ads_v7","1" "Virtual Machines Fadsv7-series Linux","Standard_F2ads_v7","2" @@ -1094,13 +1156,13 @@ "Virtual Machines Faldsv7-series Linux","Standard_F64alds_v7","64" "Virtual Machines Faldsv7-series Linux","Standard_F80alds_v7","80" "Virtual Machines Faldsv7-series Linux","Standard_F8alds_v7","8" -"Virtual Machines Falsv6-series Linux","Standard_F16als_v6","16" -"Virtual Machines Falsv6-series Linux","Standard_F2als_v6","2" -"Virtual Machines Falsv6-series Linux","Standard_F32als_v6","32" -"Virtual Machines Falsv6-series Linux","Standard_F48als_v6","48" -"Virtual Machines Falsv6-series Linux","Standard_F4als_v6","4" -"Virtual Machines Falsv6-series Linux","Standard_F64als_v6","64" -"Virtual Machines Falsv6-series Linux","Standard_F8als_v6","8" +"Virtual Machines Falsv6-series Linux","Standard_F16als_v6","8" +"Virtual Machines Falsv6-series Linux","Standard_F2als_v6","1" +"Virtual Machines Falsv6-series Linux","Standard_F32als_v6","16" +"Virtual Machines Falsv6-series Linux","Standard_F48als_v6","24" +"Virtual Machines Falsv6-series Linux","Standard_F4als_v6","2" +"Virtual Machines Falsv6-series Linux","Standard_F64als_v6","32" +"Virtual Machines Falsv6-series Linux","Standard_F8als_v6","4" "Virtual Machines Falsv7-series Linux","Standard_F16als_v7","16" "Virtual Machines Falsv7-series Linux","Standard_F1als_v7","1" "Virtual Machines Falsv7-series Linux","Standard_F2als_v7","2" @@ -1130,13 +1192,13 @@ "Virtual Machines Famdsv7-series Linux","Standard_F8-4amds_v7","8" "Virtual Machines Famdsv7-series Linux","Standard_F80amds_v7","80" "Virtual Machines Famdsv7-series Linux","Standard_F8amds_v7","8" -"Virtual Machines Famsv6-series Linux","Standard_F16ams_v6","16" -"Virtual Machines Famsv6-series Linux","Standard_F2ams_v6","2" -"Virtual Machines Famsv6-series Linux","Standard_F32ams_v6","32" -"Virtual Machines Famsv6-series Linux","Standard_F48ams_v6","48" -"Virtual Machines Famsv6-series Linux","Standard_F4ams_v6","4" -"Virtual Machines Famsv6-series Linux","Standard_F64ams_v6","64" -"Virtual Machines Famsv6-series Linux","Standard_F8ams_v6","8" +"Virtual Machines Famsv6-series Linux","Standard_F16ams_v6","8" +"Virtual Machines Famsv6-series Linux","Standard_F2ams_v6","1" +"Virtual Machines Famsv6-series Linux","Standard_F32ams_v6","16" +"Virtual Machines Famsv6-series Linux","Standard_F48ams_v6","24" +"Virtual Machines Famsv6-series Linux","Standard_F4ams_v6","2" +"Virtual Machines Famsv6-series Linux","Standard_F64ams_v6","32" +"Virtual Machines Famsv6-series Linux","Standard_F8ams_v6","4" "Virtual Machines Famsv7-series Linux","Standard_F16-4ams_v7","16" "Virtual Machines Famsv7-series Linux","Standard_F16-8ams_v7","16" "Virtual Machines Famsv7-series Linux","Standard_F16ams_v7","16" @@ -1157,13 +1219,13 @@ "Virtual Machines Famsv7-series Linux","Standard_F8-4ams_v7","8" "Virtual Machines Famsv7-series Linux","Standard_F80ams_v7","80" "Virtual Machines Famsv7-series Linux","Standard_F8ams_v7","8" -"Virtual Machines Fasv6-series Linux","Standard_F16as_v6","16" -"Virtual Machines Fasv6-series Linux","Standard_F2as_v6","2" -"Virtual Machines Fasv6-series Linux","Standard_F32as_v6","32" -"Virtual Machines Fasv6-series Linux","Standard_F48as_v6","48" -"Virtual Machines Fasv6-series Linux","Standard_F4as_v6","4" -"Virtual Machines Fasv6-series Linux","Standard_F64as_v6","64" -"Virtual Machines Fasv6-series Linux","Standard_F8as_v6","8" +"Virtual Machines Fasv6-series Linux","Standard_F16as_v6","8" +"Virtual Machines Fasv6-series Linux","Standard_F2as_v6","1" +"Virtual Machines Fasv6-series Linux","Standard_F32as_v6","16" +"Virtual Machines Fasv6-series Linux","Standard_F48as_v6","24" +"Virtual Machines Fasv6-series Linux","Standard_F4as_v6","2" +"Virtual Machines Fasv6-series Linux","Standard_F64as_v6","32" +"Virtual Machines Fasv6-series Linux","Standard_F8as_v6","4" "Virtual Machines Fasv7-series Linux","Standard_F16as_v7","16" "Virtual Machines Fasv7-series Linux","Standard_F1as_v7","1" "Virtual Machines Fasv7-series Linux","Standard_F2as_v7","2" @@ -1173,101 +1235,49 @@ "Virtual Machines Fasv7-series Linux","Standard_F64as_v7","64" "Virtual Machines Fasv7-series Linux","Standard_F80as_v7","80" "Virtual Machines Fasv7-series Linux","Standard_F8as_v7","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX12-6mds_v2","12" -"Virtual Machines FXmdsv2-series Linux","Standard_FX12mds_v2","12" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16-4mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16-8mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX16mds_v2","16" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24-12mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24-6mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX24mds_v2","24" -"Virtual Machines FXmdsv2-series Linux","Standard_FX2mds_v2","2" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32-16mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32-8mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX32mds_v2","32" -"Virtual Machines FXmdsv2-series Linux","Standard_FX4-2mds_v2","4" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48-12mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48-24mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX48mds_v2","48" -"Virtual Machines FXmdsv2-series Linux","Standard_FX4mds_v2","4" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64-16mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64-32mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX64mds_v2","63.9" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8-2mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8-4mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX8mds_v2","8" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96-24mds_v2","95.84" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96-48mds_v2","95.84" -"Virtual Machines FXmdsv2-series Linux","Standard_FX96mds_v2","95.84" -"Virtual Machines FXmsv2-series Linux","Standard_FX12-6ms_v2","12" -"Virtual Machines FXmsv2-series Linux","Standard_FX12ms_v2","12" -"Virtual Machines FXmsv2-series Linux","Standard_FX16-4ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX16-8ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX16ms_v2","16" -"Virtual Machines FXmsv2-series Linux","Standard_FX24-12ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX24-6ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX24ms_v2","24" -"Virtual Machines FXmsv2-series Linux","Standard_FX2ms_v2","2" -"Virtual Machines FXmsv2-series Linux","Standard_FX32-16ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX32-8ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX32ms_v2","32" -"Virtual Machines FXmsv2-series Linux","Standard_FX4-2ms_v2","4" -"Virtual Machines FXmsv2-series Linux","Standard_FX48-12ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX48-24ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX48ms_v2","48" -"Virtual Machines FXmsv2-series Linux","Standard_FX4ms_v2","4" -"Virtual Machines FXmsv2-series Linux","Standard_FX64-16ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX64-32ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX64ms_v2","64" -"Virtual Machines FXmsv2-series Linux","Standard_FX8-2ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX8-4ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX8ms_v2","8" -"Virtual Machines FXmsv2-series Linux","Standard_FX96-24ms_v2","96.14" -"Virtual Machines FXmsv2-series Linux","Standard_FX96-48ms_v2","96.14" -"Virtual Machines FXmsv2-series Linux","Standard_FX96ms_v2","96.14" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-144rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-24rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-48rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176-96rs_v4","176" -"Virtual Machines HBrsv4-series Linux","Standard_HB176rs_v4","176" -"Virtual Machines HBrsv5 Linux","Standard_HB368-144rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-192rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-240rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-288rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-336rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-48rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368-96rs_v5","368" -"Virtual Machines HBrsv5 Linux","Standard_HB368rs_v5","368" -"Virtual Machines HXrs Linux","Standard_HX176-144rs","176" -"Virtual Machines HXrs Linux","Standard_HX176-24rs","176" -"Virtual Machines HXrs Linux","Standard_HX176-48rs","176" -"Virtual Machines HXrs Linux","Standard_HX176-96rs","176" -"Virtual Machines HXrs Linux","Standard_HX176rs","176" -"Virtual Machines Laosv4-series Linux","Standard_L12aos_v4","12" -"Virtual Machines Laosv4-series Linux","Standard_L16aos_v4","16" -"Virtual Machines Laosv4-series Linux","Standard_L24aos_v4","24" -"Virtual Machines Laosv4-series Linux","Standard_L2aos_v4","2" -"Virtual Machines Laosv4-series Linux","Standard_L32aos_v4","32" -"Virtual Machines Laosv4-series Linux","Standard_L4aos_v4","4" -"Virtual Machines Laosv4-series Linux","Standard_L8aos_v4","8" -"Virtual Machines Lasv4 Series Linux","Standard_L16as_v4","16" -"Virtual Machines Lasv4 Series Linux","Standard_L2as_v4","2" -"Virtual Machines Lasv4 Series Linux","Standard_L32as_v4","32" -"Virtual Machines Lasv4 Series Linux","Standard_L48as_v4","48" -"Virtual Machines Lasv4 Series Linux","Standard_L4as_v4","4" -"Virtual Machines Lasv4 Series Linux","Standard_L64as_v4","64" -"Virtual Machines Lasv4 Series Linux","Standard_L80as_v4","80" -"Virtual Machines Lasv4 Series Linux","Standard_L8as_v4","8" -"Virtual Machines Lasv4 Series Linux","Standard_L96as_v4","96" -"Virtual Machines Lsv4 Series Linux","Standard_L16s_v4","16" -"Virtual Machines Lsv4 Series Linux","Standard_L2s_v4","2" -"Virtual Machines Lsv4 Series Linux","Standard_L32s_v4","32" -"Virtual Machines Lsv4 Series Linux","Standard_L48s_v4","48" -"Virtual Machines Lsv4 Series Linux","Standard_L4s_v4","4" -"Virtual Machines Lsv4 Series Linux","Standard_L64s_v4","64" -"Virtual Machines Lsv4 Series Linux","Standard_L80s_v4","80" -"Virtual Machines Lsv4 Series Linux","Standard_L8s_v4","8" -"Virtual Machines Lsv4 Series Linux","Standard_L96s_v4","96" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-144rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-24rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-48rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176-96rs_v4","1" +"Virtual Machines HBrsv4-series Linux","Standard_HB176rs_v4","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-144rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-192rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-240rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-288rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-336rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-48rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368-96rs_v5","1" +"Virtual Machines HBrsv5 Linux","Standard_HB368rs_v5","1" +"Virtual Machines HXrs Linux","Standard_HX176-144rs","1" +"Virtual Machines HXrs Linux","Standard_HX176-24rs","1" +"Virtual Machines HXrs Linux","Standard_HX176-48rs","1" +"Virtual Machines HXrs Linux","Standard_HX176-96rs","1" +"Virtual Machines HXrs Linux","Standard_HX176rs","1" +"Virtual Machines Laosv4-series Linux","Standard_L12aos_v4","6" +"Virtual Machines Laosv4-series Linux","Standard_L16aos_v4","8" +"Virtual Machines Laosv4-series Linux","Standard_L24aos_v4","12" +"Virtual Machines Laosv4-series Linux","Standard_L2aos_v4","1" +"Virtual Machines Laosv4-series Linux","Standard_L32aos_v4","16" +"Virtual Machines Laosv4-series Linux","Standard_L4aos_v4","2" +"Virtual Machines Laosv4-series Linux","Standard_L8aos_v4","4" +"Virtual Machines Lasv4 Series Linux","Standard_L16as_v4","8" +"Virtual Machines Lasv4 Series Linux","Standard_L2as_v4","1" +"Virtual Machines Lasv4 Series Linux","Standard_L32as_v4","16" +"Virtual Machines Lasv4 Series Linux","Standard_L48as_v4","24" +"Virtual Machines Lasv4 Series Linux","Standard_L4as_v4","2" +"Virtual Machines Lasv4 Series Linux","Standard_L64as_v4","32" +"Virtual Machines Lasv4 Series Linux","Standard_L80as_v4","40" +"Virtual Machines Lasv4 Series Linux","Standard_L8as_v4","4" +"Virtual Machines Lasv4 Series Linux","Standard_L96as_v4","48" +"Virtual Machines Lsv4 Series Linux","Standard_L16s_v4","8" +"Virtual Machines Lsv4 Series Linux","Standard_L2s_v4","1" +"Virtual Machines Lsv4 Series Linux","Standard_L32s_v4","16" +"Virtual Machines Lsv4 Series Linux","Standard_L48s_v4","24" +"Virtual Machines Lsv4 Series Linux","Standard_L4s_v4","2" +"Virtual Machines Lsv4 Series Linux","Standard_L64s_v4","32" +"Virtual Machines Lsv4 Series Linux","Standard_L80s_v4","40" +"Virtual Machines Lsv4 Series Linux","Standard_L8s_v4","4" +"Virtual Machines Lsv4 Series Linux","Standard_L96s_v4","48" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_3_v3","31.5" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128-64bds_v3","8" "Virtual Machines Mbdsv3 Medium Memory Series Linux","Standard_M128bds_3_v3","31.5" @@ -1327,28 +1337,28 @@ "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M48s_1_v3","4" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_1_v3","6.1" "Virtual Machines Msv3 Medium Memory Series Linux","Standard_M96s_2_v3","8.1" -"Virtual Machines NCadsH100_v5-series Linux","Standard_NC40ads_H100_v5","40" -"Virtual Machines NCadsH100_v5-series Linux","Standard_NC80adis_H100_v5","80" -"Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","40" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC144ds_xl_RTXPRO6000BSE_v6","144" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC288ds_xl_RTXPRO6000BSE_v6","288" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC36ds_xl_RTXPRO6000BSE_v6","36" -"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC72ds_xl_RTXPRO6000BSE_v6","72" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC144lds_xl_RTXPRO6000BSE_v6","144" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC24lds_xl_RTXPRO6000BSE_v6","24" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC288lds_xl_RTXPRO6000BSE_v6","288" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC36lds_xl_RTXPRO6000BSE_v6","36" -"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC72lds_xl_RTXPRO6000BSE_v6","72" -"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96is_MI300X_v5","96" -"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96isr_MI300X_v5","96" -"Virtual Machines NDsr GB200 NDR v6 Series Linux","Standard_ND128isr_NDR_GB200_v6","128" -"Virtual Machines NDsr GB300 v6-Series Linux","Standard_ND128isr_GB300_v6","128" -"Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96isr_H100_v5","106.56" -"Virtual Machines NDsr H200 v5 Series Linux","Standard_ND96isr_H200_v5","96" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG16ads_V620_v1","16" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG32ads_V620_v1","32" -"Virtual Machines NGads_V620_v1 Linux","Standard_NG8ads_V620_v1","8" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV12ads_V710_v5","12" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV24ads_V710_v5","24" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV4ads_V710_v5","4" -"Virtual Machines NVads_V710_v5 Linux","Standard_NV8ads_V710_v5","8" +"Virtual Machines NCCadsH100_v5_series Linux","Standard_NCC40ads_H100_v5","1" +"Virtual Machines NCadsH100_v5-series Linux","Standard_NC40ads_H100_v5","1" +"Virtual Machines NCadsH100_v5-series Linux","Standard_NC80adis_H100_v5","2" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC144ds_xl_RTXPRO6000BSE_v6","4" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC288ds_xl_RTXPRO6000BSE_v6","8" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC36ds_xl_RTXPRO6000BSE_v6","1" +"Virtual Machines NCdsxlRTX6kv6 Linux","Standard_NC72ds_xl_RTXPRO6000BSE_v6","2" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC144lds_xl_RTXPRO6000BSE_v6","6" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC24lds_xl_RTXPRO6000BSE_v6","1" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC288lds_xl_RTXPRO6000BSE_v6","12" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC36lds_xl_RTXPRO6000BSE_v6","1.5" +"Virtual Machines NCldsxlRTX6kv6 Linux","Standard_NC72lds_xl_RTXPRO6000BSE_v6","3" +"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96is_MI300X_v5","1" +"Virtual Machines ND MI300X v5 Series Linux","Standard_ND96isr_MI300X_v5","1" +"Virtual Machines NDsr GB200 NDR v6 Series Linux","Standard_ND128isr_NDR_GB200_v6","1" +"Virtual Machines NDsr GB300 v6-Series Linux","Standard_ND128isr_GB300_v6","1" +"Virtual Machines NDsr H100 v5-Series Linux","Standard_ND96isr_H100_v5","1" +"Virtual Machines NDsr H200 v5 Series Linux","Standard_ND96isr_H200_v5","1" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG16ads_V620_v1","2" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG32ads_V620_v1","4" +"Virtual Machines NGads_V620_v1 Linux","Standard_NG8ads_V620_v1","1" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV12ads_V710_v5","3" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV24ads_V710_v5","6" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV4ads_V710_v5","1" +"Virtual Machines NVads_V710_v5 Linux","Standard_NV8ads_V710_v5","2" diff --git a/src/open-data/README.md b/src/open-data/README.md index c6b3b62e1..1c6180b95 100644 --- a/src/open-data/README.md +++ b/src/open-data/README.md @@ -41,7 +41,9 @@ To update manually:
-The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across a broad set of regions (ISF groups are region-stable, but SKU availability is not). The raw Microsoft ratios are kept as-is (they don't always start at `1` for the smallest SKU) for drop-in parity with the deprecated files; pass `-Normalize` to rescale each group so its smallest SKU is `1`. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). Each run publishes exactly what the API returns, so records Microsoft retires from the catalog disappear from the file on the next update. +The [InstanceSizeFlexibility.csv](./InstanceSizeFlexibility.csv) file maps each ARM SKU to its instance size flexibility (ISF) group and ratio. ISF lets a reservation apply across multiple SKUs in the same flexibility group; the ratio is the relative weight of each SKU within its group. It covers Virtual Machines, Redis Cache, and Dedicated Host, unioned across every physical region the ARM locations API reports (ISF groups are region-stable, but SKU availability is not, and new GPU and specialty SKUs often launch in only a handful of regions). Each group is normalized so its smallest SKU has a ratio of `1`; pass `-Raw` to publish the Catalogs API values verbatim instead. The API leaves ratios unnormalized — only 52 of its 211 groups start at `1`, which [Microsoft's own documentation calls out](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#normalize-isf-ratios) (`BS Series` starts at `0.25`, `Ddsv5 Series` at `2`) alongside a normalization step. Both forms carry identical proportions within a group and differ by a per-group constant, and ratios are only ever meaningful within their group, so normalizing loses nothing. It is also the form the retired `isfratioblob.csv` published and the form the Optimization Engine assumes when it converts quantities into units of a group's smallest SKU. This data is updated weekly by the [Update Instance Size Flexibility](../../.github/workflows/opendata-instance-size-flexibility.yml) workflow, which queries the [Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api). Each run publishes exactly what the API returns, so records Microsoft retires from the catalog disappear from the file on the next update. + +SKUs whose ratio is not a positive number are dropped. The API returns one such row today (`azure_redis_cache_isolated_i100` at `0`); a zero carries no flexibility information and consumers divide by `Ratio`, so publishing it would hand them a division by zero. Ratios are also parsed and written with the invariant culture, so a comma-decimal machine can't publish `"2,1"`. This dataset replaces two deprecated static CSVs that were hosted on `ccmstorageprod.blob.core.windows.net` (`AutofitComboMeterData.csv` and `isfratioblob.csv` / `aka.ms/isf`), which Microsoft is retiring (no updates after 9 May 2026, removed 30 Aug 2026). diff --git a/src/optimization-engine/views/workbooks/reservations-usage.json b/src/optimization-engine/views/workbooks/reservations-usage.json index 51277b3ce..e38e06deb 100644 --- a/src/optimization-engine/views/workbooks/reservations-usage.json +++ b/src/optimization-engine/views/workbooks/reservations-usage.json @@ -536,7 +536,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| distinct MeterID_g, OnDemandUnitPrice\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s;\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UsedQuantity = todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100\r\n | extend UsedQuantity30d = todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100\r\n | extend SKUName_s=tolower(SKUName_s)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, UsedQuantity, UsedQuantity30d, TotalReservedQuantity_s, Term_s, AppliedScopeType_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s, Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), UsedQuantity, UsedQuantity30d, Term_s, AppliedScopeType_s\r\n| join kind=inner ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| join kind=leftouter ( ReservationOnDemandMeters ) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter ( ReservationPricesheet ) on SkuName and Location_s and Term_s\r\n| join kind=leftouter ( OnDemandPriceSheet ) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| extend AvgRIsUsedInSmallestRatio = Ratio * AvgRIsUsedDaily\r\n| summarize TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), AvgRIsUsedDaily=sum(AvgRIsUsedInSmallestRatio), UsedQuantity=sum(UsedQuantity*Ratio), UsedQuantity30d=sum(UsedQuantity30d*Ratio), AvgDiscountPercent=avg(DiscountPercent) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = UsedQuantity/TotalReservedQuantity_s*100, Util30Days_s = UsedQuantity30d/TotalReservedQuantity_s*100\r\n| extend AvgRIUsagePercentInSmallestRatio = round(AvgRIsUsedDaily / TotalReservedQuantity_s * 100, 1)\r\n| extend AvgDiscountPercent=iif(AvgDiscountPercent > 0.0, AvgDiscountPercent, 0.0)\r\n| extend SavingsMargin=round(todouble(Util7Days_s))-100.0+AvgDiscountPercent \r\n| project-away AvgRIUsagePercentInSmallestRatio, AvgRIsUsedDaily\r\n| project-reorder ISFGroup, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UsedQuantity, Util30Days_s, UsedQuantity30d\r\n| order by Util7Days_s asc", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\n// The reserved resource types that have instance size flexibility, matching the types the ISF\r\n// dataset covers. Other types carry no flexibility group, so they belong in the Use ISF = No views.\r\nlet IsfResourceTypes = dynamic(['VirtualMachines', 'RedisCache', 'DedicatedHost']);\r\nlet LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| distinct MeterID_g, OnDemandUnitPrice\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s;\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | where ResourceType in~ (IsfResourceTypes)\r\n | extend UsedQuantity = todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100\r\n | extend UsedQuantity30d = todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100\r\n | extend SKUName_s=tolower(SKUName_s)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, UsedQuantity, UsedQuantity30d, TotalReservedQuantity_s, Term_s, AppliedScopeType_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s, Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), UsedQuantity, UsedQuantity30d, Term_s, AppliedScopeType_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| join kind=leftouter ( ReservationOnDemandMeters ) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter ( ReservationPricesheet ) on SkuName and Location_s and Term_s\r\n| join kind=leftouter ( OnDemandPriceSheet ) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| extend AvgRIsUsedInSmallestRatio = Ratio * AvgRIsUsedDaily\r\n| summarize TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), AvgRIsUsedDaily=sum(AvgRIsUsedInSmallestRatio), UsedQuantity=sum(UsedQuantity*Ratio), UsedQuantity30d=sum(UsedQuantity30d*Ratio), AvgDiscountPercent=avg(DiscountPercent) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = UsedQuantity/TotalReservedQuantity_s*100, Util30Days_s = UsedQuantity30d/TotalReservedQuantity_s*100\r\n| extend AvgRIUsagePercentInSmallestRatio = round(AvgRIsUsedDaily / TotalReservedQuantity_s * 100, 1)\r\n| extend AvgDiscountPercent=iif(AvgDiscountPercent > 0.0, AvgDiscountPercent, 0.0)\r\n| extend SavingsMargin=round(todouble(Util7Days_s))-100.0+AvgDiscountPercent \r\n| project-away AvgRIUsagePercentInSmallestRatio, AvgRIsUsedDaily\r\n| project-reorder ISFGroup, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UsedQuantity, Util30Days_s, UsedQuantity30d\r\n| order by Util7Days_s asc", "size": 0, "showAnalytics": true, "title": "Reservation Usage Details grouped by ISF group (click on a line for more details)", @@ -817,7 +817,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend ConsumedSize = iif(isnotempty(VMSize), VMSize, strcat(MeterSubCategory_s, ' ', MeterName_s))\r\n| extend UsedRIs = todouble(Quantity_s) / 24 * Ratio\r\n| summarize round(sum(UsedRIs),1) by todatetime(Date_s), ConsumedSize", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend ConsumedSize = iif(isnotempty(VMSize), VMSize, strcat(MeterSubCategory_s, ' ', MeterName_s))\r\n| extend UsedRIs = todouble(Quantity_s) / 24 * Ratio\r\n| summarize round(sum(UsedRIs),1) by todatetime(Date_s), ConsumedSize", "size": 0, "aggregation": 3, "showAnalytics": true, @@ -851,7 +851,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by ResourceId, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder ResourceId, Subscription, UsedRIPercentage\r\n| order by ResourceId asc, UsedRIPercentage", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by ResourceId, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder ResourceId, Subscription, UsedRIPercentage\r\n| order by ResourceId asc, UsedRIPercentage", "size": 1, "showAnalytics": true, "title": "Average Daily Reservation Usage by Resource (click on a line in the table above)", @@ -892,7 +892,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=inner ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend Tags_s = iif(Tags_s startswith \"{\", Tags_s, strcat(\"{\", Tags_s, \"}\"))\r\n| extend AggregatorTag = tostring(parse_json(Tags_s)['{Aggregator}'])\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by AggregatorTag, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder AggregatorTag, Subscription, UsedRIPercentage\r\n| order by AggregatorTag asc, UsedRIPercentage", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nlet absoluteRIBought = toscalar(AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}')\r\n and TimeGenerated < todatetime('{LookbackPeriod:endISO}')\r\n and ChargeType_s == 'Usage'\r\n and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| summarize (datetime_diff('Day',max(todatetime(Date_s)),min(todatetime(Date_s)))+1)*{selectedQuantity});\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend VMSize = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| where ResourceLocation_s =~ '{selectedRegion}'\r\n| join kind=leftouter ( ISFGroups ) on $left.VMSize == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, VMSize), Ratio = coalesce(Ratio, 1.0)\r\n| where ISFGroup == '{selectedISFGroup:value}'\r\n| extend Tags_s = iif(Tags_s startswith \"{\", Tags_s, strcat(\"{\", Tags_s, \"}\"))\r\n| extend AggregatorTag = tostring(parse_json(Tags_s)['{Aggregator}'])\r\n| extend UsedRIs = todouble(Quantity_s) * Ratio / 24\r\n| summarize UsedRIPercentage=round(sum(UsedRIs) / absoluteRIBought * 100, 2) by AggregatorTag, SubscriptionId\r\n| join kind=leftouter ( \r\n AzureOptimizationResourceContainersV1_CL \r\n | where TimeGenerated > ago(1d) and ContainerType_s == 'microsoft.resources/subscriptions'\r\n | project Subscription=ContainerName_s, SubscriptionId=SubscriptionGuid_g\r\n) on SubscriptionId\r\n| project-away SubscriptionId*\r\n| project-reorder AggregatorTag, Subscription, UsedRIPercentage\r\n| order by AggregatorTag asc, UsedRIPercentage", "size": 1, "showAnalytics": true, "title": "Average Daily Reservation Usage by Tag (click on a line in the table above)", @@ -1057,7 +1057,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedCost = todouble(CostInBillingCurrency_s)\r\n| join kind=leftouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend SKUName = iif(strlen(SKUName) < 2, 'Canceled RIs', SKUName)\r\n| summarize sum(UnusedCost) by todatetime(Date_s), SKUName", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedCost = todouble(CostInBillingCurrency_s)\r\n| join kind=leftouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n// coalesce is load-bearing here: KQL strings have no null, so an unmatched leftouter yields an empty\r\n// string, and coalesce is the operator that treats empty as missing (isnull(\"\") is false).\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s)\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend SKUName = iif(strlen(SKUName) < 2, 'Canceled RIs', SKUName)\r\n| summarize sum(UnusedCost) by todatetime(Date_s), SKUName", "size": 0, "showAnalytics": true, "title": "Cost of Unused Reservations over time (by SKU)", @@ -1090,7 +1090,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedHours = todouble(Quantity_s)\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend UnusedVMs = iif('{UseISF}' == 'Yes', UnusedHours * Ratio / 24, UnusedHours / 24)\r\n| summarize sum(UnusedVMs) by todatetime(Date_s), SKUName", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend UnusedHours = todouble(Quantity_s)\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, SKUName_s=tolower(SKUName_s), Location_s\r\n) on ReservationId_g\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| extend SKUName = iif('{UseISF}' == 'Yes', strcat(ISFGroup, \" \", Location_s), strcat(SKUName_s, \" \", Location_s))\r\n| extend UnusedVMs = iif('{UseISF}' == 'Yes', UnusedHours * Ratio / 24, UnusedHours / 24)\r\n| summarize sum(UnusedVMs) by todatetime(Date_s), SKUName", "size": 0, "showAnalytics": true, "title": "Unused Reservations over time (by VM count)", @@ -1310,7 +1310,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| summarize TotalUnusedCost = sum(todouble(CostInBillingCurrency_s)) by ReservationId_g\r\n| where round(TotalUnusedCost) > 0\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s=tolower(SKUName_s), Location_s, TotalReservedQuantity_s, Term_s, AppliedScopeType_s, UnusedQuantity, UnusedQuantity30d\r\n) on ReservationId_g\r\n| project-away ReservationId_g1\r\n| join kind=inner ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| summarize TotalUnusedCost=sum(TotalUnusedCost), TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), UnusedQuantity=sum(UnusedQuantity*Ratio), UnusedQuantity30d=sum(UnusedQuantity30d*Ratio) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = (1-UnusedQuantity/TotalReservedQuantity_s)*100, Util30Days_s = (1-UnusedQuantity30d/TotalReservedQuantity_s)*100\r\n| project-reorder ISFGroup, TotalUnusedCost, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UnusedQuantity, Util30Days_s\r\n| order by TotalUnusedCost", + "query": "let ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend ArmSKUName=tolower(ArmSKUName);\r\n// The reserved resource types that have instance size flexibility, matching the types the ISF\r\n// dataset covers. Other types carry no flexibility group, so they belong in the Use ISF = No views.\r\nlet IsfResourceTypes = dynamic(['VirtualMachines', 'RedisCache', 'DedicatedHost']);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'UnusedReservation'\r\n| where ReservationId_g in ({Reservation:value})\r\n| summarize TotalUnusedCost = sum(todouble(CostInBillingCurrency_s)) by ReservationId_g\r\n| where round(TotalUnusedCost) > 0\r\n| join kind=inner (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | extend UnusedQuantity = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util7Days_s) / 100)\r\n | extend UnusedQuantity30d = todouble(TotalReservedQuantity_s) - (todouble(TotalReservedQuantity_s) * todouble(Util30Days_s) / 100)\r\n | where ResourceType in~ (IsfResourceTypes)\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s=tolower(SKUName_s), Location_s, TotalReservedQuantity_s, Term_s, AppliedScopeType_s, UnusedQuantity, UnusedQuantity30d\r\n) on ReservationId_g\r\n| project-away ReservationId_g1\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s == $right.ArmSKUName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s), Ratio = coalesce(Ratio, 1.0)\r\n| summarize TotalUnusedCost=sum(TotalUnusedCost), TotalReservedQuantity_s=sum(todouble(TotalReservedQuantity_s)*Ratio), UnusedQuantity=sum(UnusedQuantity*Ratio), UnusedQuantity30d=sum(UnusedQuantity30d*Ratio) by ISFGroup, Location_s, Term_s, AppliedScopeType_s\r\n| extend Util7Days_s = (1-UnusedQuantity/TotalReservedQuantity_s)*100, Util30Days_s = (1-UnusedQuantity30d/TotalReservedQuantity_s)*100\r\n| project-reorder ISFGroup, TotalUnusedCost, Location_s, Term_s, AppliedScopeType_s, TotalReservedQuantity_s, Util7Days_s, UnusedQuantity, Util30Days_s\r\n| order by TotalUnusedCost", "size": 2, "showAnalytics": true, "title": "Unused Reservations Details (grouped by Instance Size Flexibility group)", @@ -1485,7 +1485,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = materialize(AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s);\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nlet ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend skuName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, Util7Days_s, Util30Days_s, TotalReservedQuantity_s, Term_s, ExpiryDate_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s=tolower(SKUName_s), Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), Util7Days_s, Util30Days_s, Term_s, ExpiryDate_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s==$right.skuName\r\n| join kind=leftouter (ReservationOnDemandMeters) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter (ReservationPricesheet) on SkuName and Location_s and Term_s\r\n| join kind=leftouter (OnDemandPriceSheet) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| project-away ReservationPrice\r\n| join kind=leftouter (ReservationPricesheet) on $left.SKUName_s==$right.SkuName and Location_s and Term_s\r\n| extend HoursUntilExpiry=(todatetime(ExpiryDate_s)-now())/1h\r\n| extend TotalReservedHoursToConsume=todouble(TotalReservedQuantity_s)*HoursUntilExpiry\r\n| extend AmountRemainingToConsume = round(TotalReservedHoursToConsume * ReservationPrice, 2)\r\n| project ReservationId_g, ReservationName_s, TotalReservedQuantity_s=round(todouble(TotalReservedQuantity_s)), SKUName_s, ISFGroup, Location_s, Term_s, ExpiryDate_s, AmountRemainingToConsume, AvgRIsUsedDaily, Util7Days_s=round(todouble(Util7Days_s)), Util30Days_s=round(todouble(Util30Days_s)), DiscountPercent, SavingsMargin=round(todouble(Util7Days_s))-100.0+DiscountPercent \r\n| order by Util7Days_s asc", + "query": "let LinuxOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption' and MeterSubCategory_s !endswith \"Windows\"\r\n| extend MeterSubCategory_s = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Linux'))\r\n| summarize LinuxUnitPrice=max(todouble(UnitPrice_s)) by LinuxMeterId=MeterID_g, MeterName_s, MeterSubCategory_s, MeterRegion_s, LinuxUnitOfMeasure=UnitOfMeasure_s;\r\nlet VMOnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s == 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| extend NonWindowsMeterSubcategory = substring(MeterSubCategory_s, 0, indexof(MeterSubCategory_s, ' Windows'))\r\n| extend WindowsMeterSubCategory = MeterSubCategory_s\r\n| extend NonWindowsMeterSubcategory = substring(NonWindowsMeterSubcategory, 0, indexof(NonWindowsMeterSubcategory, ' Linux'))\r\n| summarize UnitPrice_s=max(todouble(UnitPrice_s)) by MeterID_g, MeterName_s, NonWindowsMeterSubcategory, WindowsMeterSubCategory, MeterRegion_s, UnitOfMeasure_s\r\n| join kind=leftouter ( LinuxOnDemandPriceSheet ) on MeterName_s, MeterRegion_s, $left.NonWindowsMeterSubcategory == $right.MeterSubCategory_s\r\n| extend PricesheetPrice = iif(isnotempty(LinuxUnitPrice), LinuxUnitPrice, UnitPrice_s)\r\n| extend PricesheetUnitOfMeasure = iif(isnotempty(LinuxUnitOfMeasure), LinuxUnitOfMeasure, UnitOfMeasure_s)\r\n| extend UnitHrs = toint(substring(PricesheetUnitOfMeasure, 0, indexof(PricesheetUnitOfMeasure, 'Hour')-1))\r\n| extend OnDemandUnitPrice = PricesheetPrice/UnitHrs\r\n| distinct MeterID_g, OnDemandUnitPrice;\r\nlet OnDemandPriceSheet = AzureOptimizationPricesheetV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| where MeterCategory_s != 'Virtual Machines' and PriceType_s == 'Consumption'\r\n| summarize OnDemandUnitPrice = max(todouble(UnitPrice_s)) by MeterID_g\r\n| union (VMOnDemandPriceSheet)\r\n| summarize OnDemandUnitPrice=min(OnDemandUnitPrice) by MeterID_g;\r\nlet ReservationPricesheet = materialize(AzureOptimizationReservationsPriceV1_CL\r\n| where TimeGenerated > ago(14d)\r\n| extend Term_s = iif(reservationTerm_s == '3 Years', 'P3Y', 'P1Y')\r\n| extend TermDivider = iif(reservationTerm_s == '3 Years', 3, 1)\r\n| extend ReservationPrice = todouble(replace_string(unitPrice_s,',','.'))/TermDivider/12/730\r\n| summarize arg_max(TimeGenerated, ReservationPrice) by Location_s=tolower(armRegionName_s), SkuName=tolower(armSkuName_s), Term_s);\r\nlet ReservationOnDemandMeters = AzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| extend SkuName = tolower(parse_json(AdditionalInfo_s).ServiceType)\r\n| distinct ReservationId_g, MeterId_g, SkuName;\r\nlet ISFGroups = externaldata(ISFGroup:string, ArmSKUName:string, Ratio:double) [@\"https://raw.githubusercontent.com/microsoft/finops-toolkit/dev/src/open-data/InstanceSizeFlexibility.csv\"] with(ignoreFirstRecord=true) | extend skuName=tolower(ArmSKUName);\r\nAzureOptimizationConsumptionV1_CL\r\n| where TimeGenerated > todatetime('{LookbackPeriod:startISO}') and TimeGenerated < todatetime('{LookbackPeriod:endISO}') and ChargeType_s == 'Usage' and isnotempty(ReservationName_s)\r\n| where ReservationId_g in ({Reservation:value})\r\n| extend RINormalizationRatio = tostring(parse_json(AdditionalInfo_s).RINormalizationRatio)\r\n| extend UsedRIs = todouble(Quantity_s) * todouble(RINormalizationRatio) / 24\r\n| summarize UsedRIsDaily=round(sum(UsedRIs),2) by Date_s, ReservationId_g\r\n| summarize AvgRIsUsedDaily=round(avg(UsedRIsDaily),2) by ReservationId_g\r\n| join kind=rightouter (\r\n AzureOptimizationReservationsUsageV1_CL\r\n | where TimeGenerated > ago(1d)\r\n | where ReservationId_g in ({Reservation:value})\r\n | summarize arg_max(TimeGenerated, *) by ReservationId_g\r\n | where ProvisioningState_s in ('Succeeded','Expiring')\r\n | project ReservationId_g, ReservationName_s=DisplayName_s, SKUName_s, Location_s, Util7Days_s, Util30Days_s, TotalReservedQuantity_s, Term_s, ExpiryDate_s\r\n) on ReservationId_g\r\n| project ReservationId_g=ReservationId_g1, ReservationName_s, TotalReservedQuantity_s, SKUName_s=tolower(SKUName_s), Location_s, AvgRIsUsedDaily=iif(isempty(AvgRIsUsedDaily), 0.0, AvgRIsUsedDaily), Util7Days_s, Util30Days_s, Term_s, ExpiryDate_s\r\n| join kind=leftouter ( ISFGroups ) on $left.SKUName_s==$right.skuName\r\n| extend ISFGroup = coalesce(ISFGroup, SKUName_s)\r\n| join kind=leftouter (ReservationOnDemandMeters) on ReservationId_g\r\n| summarize arg_max(MeterId_g, *) by ReservationId_g\r\n| join kind=leftouter (ReservationPricesheet) on SkuName and Location_s and Term_s\r\n| join kind=leftouter (OnDemandPriceSheet) on $left.MeterId_g == $right.MeterID_g\r\n| extend DiscountPercent = (1 - ReservationPrice/OnDemandUnitPrice) * 100\r\n| project-away ReservationPrice\r\n| join kind=leftouter (ReservationPricesheet) on $left.SKUName_s==$right.SkuName and Location_s and Term_s\r\n| extend HoursUntilExpiry=(todatetime(ExpiryDate_s)-now())/1h\r\n| extend TotalReservedHoursToConsume=todouble(TotalReservedQuantity_s)*HoursUntilExpiry\r\n| extend AmountRemainingToConsume = round(TotalReservedHoursToConsume * ReservationPrice, 2)\r\n| project ReservationId_g, ReservationName_s, TotalReservedQuantity_s=round(todouble(TotalReservedQuantity_s)), SKUName_s, ISFGroup, Location_s, Term_s, ExpiryDate_s, AmountRemainingToConsume, AvgRIsUsedDaily, Util7Days_s=round(todouble(Util7Days_s)), Util30Days_s=round(todouble(Util30Days_s)), DiscountPercent, SavingsMargin=round(todouble(Util7Days_s))-100.0+DiscountPercent \r\n| order by Util7Days_s asc", "size": 0, "showAnalytics": true, "timeContextFromParameter": "LookbackPeriod", diff --git a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 index 2d1c444b7..0c23bda67 100644 --- a/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 +++ b/src/powershell/Tests/Unit/Update-InstanceSizeFlexibility.Tests.ps1 @@ -42,7 +42,7 @@ Describe 'Update-InstanceSizeFlexibility' { Mock Get-AzContext { @{ Subscription = @{ Id = '00000000-0000-0000-0000-000000000000' } } } Mock Start-Sleep {} $outFile = Join-Path $TestDrive 'InstanceSizeFlexibility.csv' - if (Test-Path $outFile) { Remove-Item $outFile -Force } # the generator cache-merges an existing file + if (Test-Path $outFile) { Remove-Item $outFile -Force } # the generator replaces the file, so start clean $baseParams = @{ OutputPath = $outFile Location = @('eastus') @@ -152,6 +152,48 @@ Describe 'Update-InstanceSizeFlexibility' { @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_E2s_v5' } + It 'Skips SKUs the API reports with a zero ratio' { + # A zero ratio carries no flexibility information, and the Optimization Engine's + # benefits simulation divides by it. + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @( + (New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1'), + (New-CatalogItem -Sku 'azure_redis_cache_isolated_i100' -Group 'Azure Redis Cache Isolated' -Ratio '0') + ) + } + + Invoke-Generator $baseParams + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_D2' + } + + It 'Parses and writes ratios independently of the current culture' { + # A comma-decimal culture reads "2.1" as 21 (de-DE) or rejects it (fr-CH), and + # Export-Csv writes "2,1" back out, which breaks every consumer of the file. + $originalCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture + try + { + [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::new('de-DE') + Mock Invoke-AzRestMethod { + New-CatalogResponse -Items @( + (New-CatalogItem -Sku 'Standard_A1_v2' -Group 'Av2 Series' -Ratio '2'), + (New-CatalogItem -Sku 'Standard_A2_v2' -Group 'Av2 Series' -Ratio '2.1') + ) + } + + Invoke-Generator $baseParams + + # 2.1 / 2 = 1.05. Culture-aware parsing reads "2.1" as 21 and would write "10,5". + $raw = Get-Content $outFile -Raw + $raw | Should -BeLike '*"Standard_A1_v2","1"*' + $raw | Should -BeLike '*"Standard_A2_v2","1.05"*' + } + finally + { + [System.Threading.Thread]::CurrentThread.CurrentCulture = $originalCulture + } + } + It 'Skips items without ISF group or ratio properties' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( @@ -226,6 +268,103 @@ Describe 'Update-InstanceSizeFlexibility' { } } + Context 'Region enumeration' { + BeforeEach { + function New-LocationsResponse + { + param([object[]]$Locations, [int]$StatusCode = 200) + [PSCustomObject]@{ + StatusCode = $StatusCode + Content = @{ value = $Locations } | ConvertTo-Json -Depth 20 + } + } + } + + It 'Sweeps every physical region returned by the ARM locations API when -Location is omitted' { + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') + { + # regionType is nested under metadata in the real ARM response. + New-LocationsResponse -Locations @( + @{ name = 'eastus'; metadata = @{ regionType = 'Physical' } }, + @{ name = 'switzerlandnorth'; metadata = @{ regionType = 'Physical' } }, + @{ name = 'global'; metadata = @{ regionType = 'Logical' } }, + @{ name = 'nometadata' } + ) + } + else + { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1')) + } + } + + Invoke-Generator @{ OutputPath = $outFile; ReservedResourceType = @('VirtualMachines') } + + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*/locations?*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=eastus*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=switzerlandnorth*' } + # Logical groupings are not valid catalog scopes, and neither is an entry with no metadata. + Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*location=global*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*location=nometadata*' } + } + + It 'Does not enumerate regions when -Location is supplied' { + Mock Invoke-AzRestMethod { New-CatalogResponse -Items @() } + + Invoke-Generator $baseParams + + Should -Invoke Invoke-AzRestMethod -Exactly -Times 0 -ParameterFilter { $Uri -like '*/locations?*' } + } + + It 'Fails rather than sweeping a partial region set when enumeration returns nothing' { + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') { New-LocationsResponse -Locations @(@{ name = 'global'; metadata = @{ regionType = 'Logical' } }) } + else { New-CatalogResponse -Items @() } + } + + { Invoke-Generator @{ OutputPath = $outFile } } | Should -Throw -ExpectedMessage '*no physical regions*' + } + + It 'Fails when the locations API returns an error' { + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') { New-LocationsResponse -Locations @() -StatusCode 403 } + else { New-CatalogResponse -Items @() } + } + + { Invoke-Generator @{ OutputPath = $outFile } } | Should -Throw -ExpectedMessage '*HTTP 403 enumerating regions*' + } + + It 'Retries a transient failure when enumerating regions instead of failing the run' { + # Region enumeration is a hard prerequisite for every catalog call, so a single 429 or + # 5xx here would otherwise fail the whole weekly refresh before it fetched anything. + $script:locationsCallCount = 0 + Mock Invoke-AzRestMethod { + if ($Uri -like '*/locations?*') + { + $script:locationsCallCount++ + if ($script:locationsCallCount -eq 1) + { + New-LocationsResponse -Locations @() -StatusCode 503 + } + else + { + New-LocationsResponse -Locations @(@{ name = 'eastus'; metadata = @{ regionType = 'Physical' } }) + } + } + else + { + New-CatalogResponse -Items @((New-CatalogItem -Sku 'Standard_D2' -Group 'DSeries' -Ratio '1')) + } + } + + Invoke-Generator @{ OutputPath = $outFile; ReservedResourceType = @('VirtualMachines') } + + @(Import-Csv $outFile).ArmSkuName | Should -Be 'Standard_D2' + Should -Invoke Invoke-AzRestMethod -Exactly -Times 2 -ParameterFilter { $Uri -like '*/locations?*' } + Should -Invoke Invoke-AzRestMethod -Exactly -Times 1 -ParameterFilter { $Uri -like '*location=eastus*' } + } + } + Context 'Published dataset' { It 'Has globally unique ArmSkuName values' { $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" @@ -233,6 +372,22 @@ Describe 'Update-InstanceSizeFlexibility' { $duplicates.Name | Should -BeNullOrEmpty } + It 'Has every flexibility group normalized to a smallest ratio of 1' { + $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" + $notNormalized = @( + $csv | Group-Object InstanceSizeFlexibilityGroup | Where-Object { + [Math]::Abs((($_.Group.Ratio | ForEach-Object { [double]$_ } | Measure-Object -Minimum).Minimum) - 1) -gt 0.0001 + } + ) + $notNormalized.Name | Should -BeNullOrEmpty + } + + It 'Has no zero or negative ratios' { + # Consumers multiply and divide by Ratio, so a non-positive value is unusable. + $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" + @($csv | Where-Object { [double]$_.Ratio -le 0 }).ArmSkuName | Should -BeNullOrEmpty + } + It 'Has the documented three-column schema' { $csv = Import-Csv "$PSScriptRoot/../../../open-data/InstanceSizeFlexibility.csv" @($csv[0].PSObject.Properties.Name) | Should -Be @('InstanceSizeFlexibilityGroup', 'ArmSkuName', 'Ratio') @@ -240,7 +395,7 @@ Describe 'Update-InstanceSizeFlexibility' { } Context 'Normalization' { - It 'Rescales each group so the smallest ratio is 1 when -Normalize is set' { + It 'Rescales each group so the smallest ratio is 1 by default' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( (New-CatalogItem -Sku 'Standard_B1s' -Group 'BS Series' -Ratio '0.25'), @@ -249,10 +404,7 @@ Describe 'Update-InstanceSizeFlexibility' { (New-CatalogItem -Sku 'Standard_D4' -Group 'DSeries' -Ratio '2') ) } - $params = $baseParams.Clone() - $params.Normalize = $true - - Invoke-Generator $params + Invoke-Generator $baseParams $rows = @(Import-Csv $outFile) ($rows | Where-Object ArmSkuName -eq 'Standard_B1s').Ratio | Should -Be '1' @@ -261,7 +413,7 @@ Describe 'Update-InstanceSizeFlexibility' { ($rows | Where-Object ArmSkuName -eq 'Standard_D4').Ratio | Should -Be '2' } - It 'Keeps raw ratios by default' { + It 'Keeps the API ratios verbatim when -Raw is set' { Mock Invoke-AzRestMethod { New-CatalogResponse -Items @( (New-CatalogItem -Sku 'Standard_B1s' -Group 'BS Series' -Ratio '0.25'), @@ -269,7 +421,10 @@ Describe 'Update-InstanceSizeFlexibility' { ) } - Invoke-Generator $baseParams + $params = $baseParams.Clone() + $params.Raw = $true + + Invoke-Generator $params $rows = @(Import-Csv $outFile) ($rows | Where-Object ArmSkuName -eq 'Standard_B1s').Ratio | Should -Be '0.25' diff --git a/src/scripts/Update-InstanceSizeFlexibility.ps1 b/src/scripts/Update-InstanceSizeFlexibility.ps1 index f66d3544f..c6406267a 100644 --- a/src/scripts/Update-InstanceSizeFlexibility.ps1 +++ b/src/scripts/Update-InstanceSizeFlexibility.ps1 @@ -31,8 +31,17 @@ .PARAMETER Location One or more Azure regions to query and union ISF ratios from. ISF group/ratio relationships - are region-stable, but not every SKU is available in every region, so the default unions a - broad region set to maximize SKU coverage. + are region-stable, but not every SKU is available in every region, so the results are unioned + across regions to maximize SKU coverage. + + Defaults to every physical region the subscription's cloud exposes, enumerated from the ARM + locations API. A hardcoded list has to be hand-maintained as Azure adds regions, and new GPU + and specialty SKUs routinely launch in a handful of regions first, so any SKU that lands + outside the list is missing from the dataset until someone notices. Pass an explicit list to + narrow the sweep (tests do). + + .PARAMETER LocationApiVersion + ARM locations API version, used only when -Location is not supplied. Default = 2022-12-01. .PARAMETER ReservedResourceType One or more reserved resource types to extract ISF ratios for. Default is VirtualMachines, @@ -45,11 +54,21 @@ .PARAMETER ApiVersion Catalogs API version. Default = 2022-03-01. - .PARAMETER Normalize - Normalize ratios so the smallest SKU in each flexibility group has a ratio of 1. The raw API - ratios don't always start at 1 (e.g. BS Series starts at 0.25). When omitted, the raw Microsoft - ratios are kept for drop-in parity with the deprecated isfratioblob.csv / - AutofitComboMeterData.csv files that downstream tools (Power BI, Optimization Engine) expect. + .PARAMETER Raw + Publish the Catalogs API ratios verbatim instead of normalizing them. + + By default each flexibility group is normalized so its smallest SKU has a ratio of 1. The API + leaves ratios unnormalized -- only 52 of 211 groups start at 1, and Microsoft's own + documentation calls this out (BS Series starts at 0.25, Ddsv5 Series at 2) and publishes a + normalization step alongside it. Both forms carry identical proportions within a group and + differ by a per-group constant. + + Normalized is the form the retired isfratioblob.csv published and the form downstream tools + assume: the Optimization Engine converts quantities into units of a group's smallest SKU, and + a ratio scale that doesn't start at 1 silently inflates those absolute figures. Ratios are only + ever meaningful within their group, so normalizing loses nothing. + + See https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#normalize-isf-ratios .EXAMPLE ./Update-InstanceSizeFlexibility.ps1 @@ -64,14 +83,8 @@ param( [string]$SubscriptionId, - # ISF group/ratio relationships are region-stable, but SKU availability is not, so a broad - # region set is unioned to maximize coverage. - [string[]]$Location = @( - 'eastus', 'eastus2', 'westus', 'westus2', 'westus3', 'centralus', 'southcentralus', 'northcentralus', - 'westeurope', 'northeurope', 'uksouth', 'francecentral', 'germanywestcentral', 'swedencentral', 'norwayeast', - 'southeastasia', 'eastasia', 'japaneast', 'japanwest', 'australiaeast', 'koreacentral', 'centralindia', - 'canadacentral', 'brazilsouth', 'southafricanorth', 'uaenorth' - ), + # Defaults to every physical region the subscription's cloud exposes -- see the parameter help. + [string[]]$Location, # The reserved resource types that expose usable ISF ratios (ReservationsAutofitGroup/Ratio). # BlockBlob is excluded by default -- see the parameter help above. @@ -79,11 +92,71 @@ param( [string]$ApiVersion = '2022-03-01', - [switch]$Normalize + [string]$LocationApiVersion = '2022-12-01', + + [switch]$Raw ) $ErrorActionPreference = 'Stop' +function Invoke-ArmRequest +{ + <# + .SYNOPSIS + Issues a GET against ARM, retrying transient failures with exponential backoff. + + .DESCRIPTION + Retries network exceptions and 429/5xx responses; non-retryable 4xx throws immediately. + Every ARM call in this script goes through here -- a single transient failure on any one + of them fails the whole weekly refresh, and the next scheduled attempt is a week away. + + .PARAMETER Description + What the call is doing, used verbatim in error and progress messages, e.g. 'enumerating + regions' or 'on VirtualMachines/eastus page 3'. + #> + param( + [string]$Uri, + [string]$Description, + [int]$MaxRetries = 5 + ) + + $retries = 0 + + while ($true) + { + try + { + $response = Invoke-AzRestMethod -Uri $Uri -Method GET + } + catch + { + $retries++ + if ($retries -gt $MaxRetries) { throw "Failed after $MaxRetries retries $Description`: $_" } + $wait = [Math]::Pow(2, $retries) * 5 + Write-Host " Error $Description, retrying in ${wait}s (attempt $retries/$MaxRetries)" + Start-Sleep -Seconds $wait + continue + } + + if ($response.StatusCode -eq 429 -or $response.StatusCode -ge 500) + { + $retries++ + if ($retries -gt $MaxRetries) { throw "Failed after $MaxRetries retries $Description (HTTP $($response.StatusCode))" } + $wait = [Math]::Pow(2, $retries) * 5 + Write-Host " HTTP $($response.StatusCode) $Description, retrying in ${wait}s (attempt $retries/$MaxRetries)" + Start-Sleep -Seconds $wait + continue + } + + if ($response.StatusCode -ge 400) + { + throw "HTTP $($response.StatusCode) $Description`: $($response.Content)" + } + + return $response + } +} + # ----------------------------------------------------------------------- # Step 0: Validate the Azure context (the Catalogs API is authenticated) # ----------------------------------------------------------------------- @@ -101,6 +174,31 @@ if (-not $SubscriptionId) { throw "No subscription found in the current Azure context. Pass -SubscriptionId or run Set-AzContext." } +if (-not $Location) +{ + # Physical regions only: the response also carries logical groupings ('global', 'unitedstates', + # 'europe', 'asiapacific'), which are not valid catalog scopes -- 46 of the 109 entries at the + # time of writing. Note regionType is nested under metadata, not at the top level. + # Az.Accounts is the only module the workflow installs, so this uses the REST API rather than + # Get-AzLocation, which lives in Az.Resources. + $locationsUri = "https://management.azure.com/subscriptions/$SubscriptionId/locations?api-version=$LocationApiVersion" + $locationsResponse = Invoke-ArmRequest -Uri $locationsUri -Description 'enumerating regions' + + $Location = @( + ($locationsResponse.Content | ConvertFrom-Json -Depth 20).value | + Where-Object { $_.metadata.regionType -eq 'Physical' } | + Select-Object -ExpandProperty name + ) + + # Sweeping fewer regions than intended silently drops SKUs, so treat an empty result as fatal + # rather than falling back to a partial sweep. + if (-not $Location) + { + throw "Region enumeration returned no physical regions for subscription $SubscriptionId. Pass -Location explicitly to override." + } + Write-Host "Enumerated $($Location.Count) physical region(s) from the ARM locations API" +} + Write-Host "Using subscription $SubscriptionId, $($Location.Count) region(s), types: $($ReservedResourceType -join ', ')" function Invoke-CatalogsApi @@ -122,44 +220,10 @@ function Invoke-CatalogsApi while ($uri) { $page++ - $retries = 0 - $maxRetries = 5 - # Retry transient failures (network exceptions and 429/5xx) on the SAME page, without - # advancing the paging loop, so $page counts and the retry cap stay correct. - $response = $null - while ($true) - { - try - { - $response = Invoke-AzRestMethod -Uri $uri -Method GET - } - catch - { - $retries++ - if ($retries -gt $maxRetries) { throw "Failed after $maxRetries retries on $ResourceType/$Region page $page`: $_" } - $wait = [Math]::Pow(2, $retries) * 5 - Write-Host " Error on $ResourceType/$Region page $page, retrying in ${wait}s (attempt $retries/$maxRetries)" - Start-Sleep -Seconds $wait - continue - } - - if ($response.StatusCode -eq 429 -or $response.StatusCode -ge 500) - { - $retries++ - if ($retries -gt $maxRetries) { throw "Failed after $maxRetries retries on $ResourceType/$Region page $page (HTTP $($response.StatusCode))" } - $wait = [Math]::Pow(2, $retries) * 5 - Write-Host " HTTP $($response.StatusCode) on $ResourceType/$Region page $page, retrying in ${wait}s (attempt $retries/$maxRetries)" - Start-Sleep -Seconds $wait - continue - } - if ($response.StatusCode -ge 400) - { - throw "HTTP $($response.StatusCode) on $ResourceType/$Region page $page`: $($response.Content)" - } - - break - } + # Transient failures are retried on the SAME page, without advancing the paging loop, so + # $page counts and the retry cap stay correct. + $response = Invoke-ArmRequest -Uri $uri -Description "on $ResourceType/$Region page $page" $json = $response.Content | ConvertFrom-Json -Depth 100 @@ -214,12 +278,18 @@ function Get-IsfRecords # 'arm_sku_name_placeholder'); skip them so they don't leak into the public CSV. if ($armSkuName -like '*placeholder*') { continue } - if ($flexGroup -and $ratio -and $armSkuName) + # Parsed with the invariant culture: the API returns "2.1", which a comma-decimal culture + # reads as 21 (de-DE) or rejects outright (fr-CH). A ratio of 0 carries no flexibility + # information and consumers divide by it -- the Optimization Engine's benefits simulation + # does exactly that -- so drop it rather than publish a division by zero. + $parsedRatio = 0.0 + $parsed = [double]::TryParse($ratio, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$parsedRatio) + if ($flexGroup -and $armSkuName -and $parsed -and $parsedRatio -gt 0) { $null = $records.Add([PSCustomObject]@{ InstanceSizeFlexibilityGroup = [string]$flexGroup ArmSkuName = [string]$armSkuName - Ratio = [double]$ratio + Ratio = $parsedRatio }) } } @@ -292,13 +362,18 @@ if ($duplicateSkus) # ----------------------------------------------------------------------- # Step 2: Normalize, sort, and write output # ----------------------------------------------------------------------- -if ($Normalize) +if (-not $Raw) { Write-Host "Normalizing ratios (smallest SKU per group = 1)..." $allRecords = Get-NormalizedRecords -Records $allRecords } -$rows = $allRecords | Sort-Object InstanceSizeFlexibilityGroup, ArmSkuName +# Ratio is formatted invariantly rather than left to Export-Csv, which uses the current culture: +# on a comma-decimal machine it would publish "2,1" and break every consumer of the file. +$rows = $allRecords | + Sort-Object InstanceSizeFlexibilityGroup, ArmSkuName | + Select-Object InstanceSizeFlexibilityGroup, ArmSkuName, + @{ Name = 'Ratio'; Expression = { $_.Ratio.ToString([Globalization.CultureInfo]::InvariantCulture) } } $rows | Export-Csv -Path $OutputPath -UseQuotes Always -NoTypeInformation -Encoding utf8 Write-Host "Wrote $($rows.Count) SKUs to $OutputPath"