Azure Onboarding Process (Manual)

Manually create Entra app credentials, billing roles, FOCUS export to Blob, and enter the values in Wiv — without the Cloud Shell script or keyless wizard.

Written By Dotan Cohen

Last updated About 16 hours ago

Use this path when your security team prefers to create Azure resources by hand (for example hardened storage policies) instead of running the Cloud Shell script or the in-app keyless wizard.

Note: Prefer automated setup? Use Azure Onboarding Process (federated workload, no client secret) or the Cloud Shell script (client-secret wiv_account).

Warning: This guide is for blob-only FOCUS cost export. Wiv does not require Synapse for new integrations. Wiv authenticates to Blob with Entra ID (OAuth) and Storage Blob Data Reader — not Storage Keys.

What you create

Piece

Detail

App registration

Service principal + client secret

Billing role

Enrollment Reader (EA) or Billing account reader (MCA / partner)

Subscription roles

Reader, Monitoring Reader, Cost Management Reader (each subscription in scope)

Storage account

Shared key disabled, HTTPS only, no anonymous public blobs

FOCUS export

Daily Parquet/Snappy at billing-account scope, system-assigned managed identity

Blob RBAC

Storage Blob Data Reader for the app on the export storage

Prerequisites

  • Billing account visible to your login (EA, MCA, or CSP partner MCA)

  • Rights to create app registrations, role assignments, storage, and Cost Management exports

  • A host subscription for the resource group and storage account

1. Create the app registration

  1. Open Azure Portal.

  2. Go to Microsoft Entra IDApp registrationsNew registration.

  3. Name the app (for example wiv_account).

  4. Choose Accounts in this organizational directory only (single tenant) unless you have a reason not to.

  5. Click Register.

  6. Copy Application (client) ID and Directory (tenant) ID.

  7. Open Certificates & secretsNew client secret. Save the Value immediately (shown once).

2. Grant billing and subscription roles

Billing account

  • EA — Grant the app Enrollment Reader on the billing account.

  • MCA / CSP partner — Grant Billing account reader on the billing account (all profiles).

Warning: EA only: Under Cost Management + BillingPolicies, enable Account owners can view charges. Without this, the app can have the role and still be denied cost data.

On each subscription you want Wiv to see, assign Reader, Monitoring Reader, and Cost Management Reader. For a PoC, grant these only on the subscriptions you choose.

3. Create storage for the FOCUS export

In a host subscription of your choice:

  1. Create a resource group (for example rg-wiv).

  2. Create a StorageV2 account with allowSharedKeyAccess=false, HTTPS only, and allowBlobPublicAccess=false.

  3. Create a blob container (default name Wiv expects: billing-exports).

Note: publicNetworkAccess can stay Enabled so Wiv can reach the account over HTTPS with OAuth. That is not the same as anonymous public blobs.

4. Create the FOCUS cost export

At billing-account scope (preferred):

Setting

Value

Export type

FocusCost (FOCUS)

Format

Parquet

Compression

Snappy

Schedule

Daily

Destination

Your storage account + container

Root folder

Default: billing-data

Export name

Default: WivFocusDailyExport

Identity

System-assigned managed identity (required when shared keys are disabled)

Grant the export identity write access if needed, then grant your app Storage Blob Data Reader on the storage account. Run Run now and wait for part_*.snappy.parquet under the export path.

5. Values to enter in Wiv

In Wiv: IntegrationsAzureNew Azure Integration (manual / client-secret form).

Field

Source

Tenant ID

Directory (tenant) ID

App ID

Application (client) ID

Client secret

Secret value from step 1

Billing account name

Billing account resource name

Billing storage account

Storage account name

Host subscription ID

Subscription where storage lives

Defaults if unchanged: container billing-exports, root folder billing-data, export name WivFocusDailyExport.

{
  "auth_method": "client_secret",
  "tenant_id": "<tenant>",
  "app_id": "<app id>",
  "client_secret": "<secret>",
  "billing_account_name": "<billing account name>",
  "billing_query_backend": "blob",
  "billing_storage_account": "<storage account>",
  "billing_container": "billing-exports",
  "billing_root_folder": "billing-data",
  "billing_export_name": "WivFocusDailyExport",
  "subscription_id": "<host subscription id>"
}

Note: If you use the Cloud Shell script instead, it prints this JSON at the end for you to paste or share.

6. Optional Microsoft Graph permissions

Only if your Wiv workflows need directory reads: add Microsoft Graph application permissions User.Read.All and Group.Read.All (or Directory.Read.All) and grant admin consent.

Troubleshooting

Symptom

Action

Export create fails (shared key)

Add system-assigned identity on the export

No cost data in Wiv

Run Run now; wait for Parquet under the export path

403 on cost / billing

Confirm Enrollment Reader / Billing account reader; enable EA view-charges policy

Blob read fails

Grant Storage Blob Data Reader; check firewall / public network access

AADSTS700016 in workflows

Re-create app or fix tenant ID on the integration

Important notes

  • Store the client secret in a secret manager and rotate before expiry.

  • Role and billing grants can take several minutes to propagate.

  • Do not delete the app registration while the Wiv integration is active.