Azure Cost Reporting on a CSP Subscription – Without FinOps Hubs, Without Fabric

Welcome back to the terminal garden.

Most Azure cost-reporting guides assume an Enterprise Agreement or a Microsoft Customer Agreement: billing accounts, invoice sections, price sheets, the works. If your Azure runs through an indirect CSP partner – a telco, a distributor, your "Azure Plan" reseller – half of that simply isn't there. No EA billing APIs, no price sheet you can query, and an invoice from the partner that looks nothing like the portal.

That was my starting point. One pay-as-you-go subscription bought through a CSP, and on it a VM, a handful of Power Platform flows, Power BI, and – new and worrying – Azure OpenAI. The question from finance was the classic one: what costs what? The Cost Analysis blade in the portal answers that, sort of, for whoever is clicking around in it right now. It does not give you a report you can send around once a month.

Here is the setup that works. Storage account, Cost Management export, one Power BI template. No FinOps Hubs, no Fabric, no Data Factory.

What you get and what you don't

Before we build anything, one thing to be clear about with the CSP model:

Azure Cost Management shows Microsoft list prices, not what your partner bills you. The partner applies their own margin and any discounts on top. So the numbers you export are perfect for internal allocation ("OpenAI cost us X, the VM cost Y, the trend is Z") and will not reconcile 1:1 with the partner invoice. If you need that, ask the partner for their reconciliation file. Everything below is about the first use case.

Also, the old Cost Management connector for Power BI is in maintenance mode. Don't build anything new on it. Exports to storage are the supported path.

1. Storage account

Portal → Storage accounts → Create.

  • New resource group, e.g. rg-finops
  • Same region as your other resources
  • Standard performance, LRS redundancy – this is a few hundred MB of Parquet, not a data lake
  • Advanced tab → Enable hierarchical namespace. This is the one that matters. Without it it's plain Blob storage and the Power BI template can't read it. Retrofitting is painful, get it right on day one.

Then create a container, e.g. exports.

2. Give yourself data-plane access

The step everyone forgets. Being Owner on the storage account does not let you read the blobs – that's a separate data-plane role.

Storage account → Access Control (IAM) → Add role assignment → Storage Blob Data Reader → your own account. Give it a few minutes to propagate.

3. Resource providers (CSP trap #1)

On a fresh CSP subscription the export wizard just fails, with an error that doesn't tell you why. The reason: Microsoft.CostManagement and Microsoft.CostManagementExports are not registered.

Subscription → Resource providers → search for both → Register. Or:

Register-AzResourceProvider -ProviderNamespace Microsoft.CostManagement
Register-AzResourceProvider -ProviderNamespace Microsoft.CostManagementExports

4. The export

Subscription → Cost Management → Exports → Create.

  • Template: Cost and usage (FOCUS) – the open cost schema, and what the toolkit expects
  • Frequency: Daily export of month-to-date costs
  • Destination: your subscription → rg-finops → the storage account → container exports → directory focus
  • Format: Parquet, compression Snappy
  • Overwrite data: on – otherwise you get one copy per day and your totals silently multiply

Pin the dataset version when the wizard offers it. Schema changes in a later FOCUS version can break your report or, worse, quietly produce wrong sums.

Watch the destination dropdown when you retry after a failed attempt – the portal pre-selected a different storage account from another resource group for me on the second try. Check the name before you hit Create.

Then click Run now once, or you wait until tomorrow.

5. History (CSP trap #2)

You want the last twelve months, not just month-to-date. The obvious move is a second export with frequency One-time. Except: a one-time export is limited to a single month. Twelve clicks through the wizard, twelve exports. No.

The FinOps Toolkit PowerShell module does it in one line:

Install-Module -Name FinOpsToolkit -Scope CurrentUser
Connect-AzAccount $scope = "/subscriptions/<your-subscription-id>"
Start-FinOpsCostExport -Name "focus-daily" -Scope $scope -Backfill 12

-Backfill 12 queues twelve monthly runs against the existing export definition, writing into the same directory in the same format. Check progress in the portal under the export's Run history. Takes a while; grab a coffee.

6. Power BI

Download Cost summary.pbit from the FinOps Toolkit releases on GitHub and open it in Power BI Desktop.

Older docs describe two parameters – Hub storage URL and Export storage URL. Current versions of the template (14.x) show a single Storage URL. Use the Data Lake endpoint, not the blob endpoint:

https://<storageaccount>.dfs.core.windows.net/exports/focus

Authentication: Organizational account, sign in with the user that got Storage Blob Data Reader in step 2. Load. Done.

You now have cost by service, by resource, by resource group, month over month, with the twelve-month history already in place – and none of it required Fabric, a hub deployment, or a single line of DAX.

Things I ran into

  • "Fabric is the right architecture." It is, at scale. The toolkit itself says hubs and Fabric start to pay off somewhere around seven-figure monthly spend. Below that, a storage account and Desktop are entirely sufficient.
  • Multiple files per export. Exports are partitioned into several Parquet files per run. The template handles that; Excel won't. If you want to poke at the raw data, use the toolkit's Power BI, not a spreadsheet.
  • Get-AzConsumptionUsageDetail doesn't work reliably on CSP / Azure Plan. If you script against the API, use Az.CostManagement and Invoke-AzCostManagementQuery, not the old Az.Billing cmdlets.
  • Budget alerts are separate. The export tells you what happened. For "tell me before OpenAI eats the budget" set a Cost Management budget with an action group on the subscription. Two minutes, do it while you're in there.

Wrap-up

The pieces are all first-party and free: a storage account that costs cents, an export that runs itself, an open-source Power BI template. The CSP-specific parts are knowing that the numbers are list prices, registering two resource providers up front, and using the PowerShell backfill instead of fighting the one-time export wizard. Everything else is the same as on an EA – just with fewer menus to get lost in.

Back to Homepage