Skip to main content

FAQs

Azure RBAC role assignments typically take 2-5 minutes to propagate. In some cases, it may take up to 10 minutes. If verification fails immediately after completing the setup, wait a few minutes and try again.
FOCUS (FinOps Open Cost and Usage Specification) is an open-source standard for cloud cost data. nOps creates a daily FOCUS export in your Azure subscription that writes billing data to a storage account. This provides structured, normalized cost data for analysis and optimization.
Assigning roles at the management group scope ensures that nOps has consistent visibility across all subscriptions within that management group. This avoids the need to grant permissions on each subscription individually, and any new subscriptions added to the group automatically inherit the roles.
FOCUS cost exports run daily. Cost data is typically available within 24-48 hours of the export run. After the initial setup, historical data for the current month is included in the first export.
The setup creates three resources in your specified subscription:
  • A Resource Group (nops-focus-exports-rg) in East US
  • A Storage Account (nopsfocus<tenant-prefix>) for FOCUS cost data
  • A FOCUS cost export (nops-clara-focus-export) that runs daily
The setup also registers three resource providers on the subscription: Microsoft.Storage, Microsoft.CostManagement, and Microsoft.CostManagementExports. These are required for storage account creation and FOCUS export functionality.These resources incur minimal cost (storage fees for the exported data only).
No. The setup creates a dedicated storage account for nOps FOCUS exports to ensure proper isolation and access control. The nOps service principal is granted the Owner role only on this specific storage account.
If your organization has Azure Policies that enforce storage account firewalls, the nOps FOCUS export storage account needs the nOps ingestion IPs whitelisted.
  1. Navigate to the storage account > Security + networking > Networking
  2. Under Firewall, add the nOps IP addresses: 44.246.45.84, 52.11.53.164, and 52.39.155.200
  3. Ensure “Allow Azure services on the trusted services list” is checked
  4. Click Save
The Terraform setup method detects firewall restrictions automatically and prompts you to add the IPs.

Overview

Savings Analysis is the first tier of Azure onboarding. It gives nOps read-only access to your Azure environment for:
  • Cost visibility across all subscriptions
  • Resource inventory (VMs, disks, networks)
  • Optimization recommendations (rightsizing, idle resources)
  • Daily FOCUS cost exports for cost tracking
Supported Billing Account Types: nOps supports Enterprise Agreement (EA) and Microsoft Customer Agreement (MCA) billing accounts only. If you have a Pay-As-You-Go (MOSP) subscription, please contact your Microsoft account representative to upgrade to an EA or MCA billing account before proceeding.
Savings Analysis does not allow purchasing reservations or savings plans. To enable automated commitment purchasing, complete this setup first, then follow the Commitment Management Setup guide.
Prerequisites — Before proceeding, ensure you have completed the Azure Integration Prerequisites including:
  • Understanding your billing account type (EA or MCA)
  • Locating your Management Group ID
  • Having a subscription available for FOCUS exports
  • EA only: Your EA Enrollment Number — find it in Cost Management + Billing in the Azure Portal
  • MCA only: A Billing Account Owner on the MCA billing account must complete the billing role assignment in Step B below. This is a billing-scope role, separate from Entra ID and Azure RBAC
  • Having Global Administrator or Privileged Role Administrator access
The nOps Azure Savings Analysis wizard guides you through a 5-step process:
  1. Get Started — Name your integration and select your billing type
  2. Admin Consent — Grant nOps access to your Azure tenant
  3. Configure — Provide your Management Group ID and subscription
  4. Run Setup — Execute the RBAC and FOCUS export setup
  5. Verify — Validate that all permissions are correctly configured

1. Get Started

Before you start: confirm your account is eligible. Run the nOps onboarding qualifier — a read-only script that classifies each billing account (EA / MCA / Reseller / CSP) and gives a PASS / FAIL verdict. CSP / partner-billed accounts are not supported, so this avoids starting a setup that cannot complete.
1

Open Cloud Provider Integrations

Log in to nOps and go to Settings > Cloud Provider Integrations. Scroll down to the Add a provider section and click the Microsoft Azure card.
2

Enter an Integration Name

Provide a friendly name for this integration (e.g., “Production Azure Environment”). This name helps you identify the integration in the nOps dashboard.
3

Select Your Billing Account Type

Choose between EA (Enterprise Agreement) or MCA (Microsoft Customer Agreement). This determines how the setup configures billing access.If you are unsure which type you have, see Understanding Billing Account Types.
4

Enter Your EA Enrollment Number (EA only)

If you selected EA, enter your EA Enrollment Number in this step. It is required to continue. You can change it later in Configure.Find it in Azure Portal > Cost Management + Billing — select your EA account and copy the numeric enrollment ID shown at the top. MCA users skip this step.
5

Click Continue

nOps creates an integration record and generates the admin consent URL for the next step.

Admin consent creates a service principal for nOps in your Azure AD tenant. This is required before any roles can be assigned.
1

Click Grant Admin Consent

In the nOps wizard, click the Grant Admin Consent button. You will be redirected to Microsoft’s login page.
2

Sign In with an Admin Account

Sign in with an Azure AD account that has the Global Administrator or Privileged Role Administrator role.
3

Review and Accept Permissions

Review the permissions requested by nOps and click Accept. This creates the nOps service principal in your tenant.
4

Return to nOps

After accepting, you are automatically redirected back to the nOps wizard. Your Azure Tenant ID is now displayed, confirming that consent was granted successfully.
Admin consent creates a service principal for nOps in your Azure AD tenant. Here’s what happens during this process:
  1. You click the Grant Admin Consent button in the nOps wizard
  2. You are redirected to Microsoft’s login page
  3. You sign in with an Azure AD account that has Global Administrator or Privileged Role Administrator role
  4. You review and accept the permissions requested by nOps
  5. Microsoft creates a service principal for the nOps application in your Azure tenant
  6. You are redirected back to the nOps wizard to continue setup
What is a service principal? A service principal is an identity created in your Azure AD tenant that represents the nOps application. It has no credentials of its own — nOps authenticates using its multi-tenant application registration, and Azure AD validates the request against the service principal in your tenant.
Do not remove the service principal from your Azure AD tenant after granting consent. If removed, nOps will lose access and you will need to re-grant admin consent from the wizard.

3. Configure Your Azure Environment

After consent is granted, provide the configuration details for your integration.
1

Enter Your Management Group ID

Enter the Management Group ID that defines the scope of nOps visibility. Use your Tenant ID to cover all subscriptions (root management group), or a specific management group ID for a subset.Find this in Azure Portal > Management Groups.
2

Enter a Subscription ID for FOCUS Exports

Choose the subscription with the most spend. nOps will create a storage account and configure FOCUS cost exports in this subscription.Find your subscription IDs in Azure Portal > Subscriptions.
3

Confirm or Edit EA Enrollment Number (EA only)

If you selected Enterprise Agreement as your billing type, confirm or edit your EA Enrollment Number (the numeric ID you entered in Get Started). This is required to generate the setup script.Find it in Azure Portal > Cost Management + Billing — select your EA account and copy the enrollment number shown at the top. MCA users skip this step.
4

Click Continue

nOps saves your configuration and generates the setup script for the next step.
Choose the subscription with the most spend for FOCUS exports. No dedicated subscription is required for the Savings Analysis tier. The setup creates lightweight resources with minimal cost.

4. Run the Setup

The nOps wizard generates a customized setup that assigns RBAC roles, creates the storage account, and configures FOCUS cost exports. You can complete the setup through the Azure Portal (recommended) or Terraform.

What the Setup Does

The setup assigns the RBAC roles documented in Prerequisites - RBAC Roles and creates the following resources: Storage Account Setup Roles Assigned
  • Tenant Provider scope: Reservations Reader, Savings Plan Reader
  • Billing Account scope: EnrollmentReader (EA only) or Billing Account Reader (MCA only)
  • Management Group scope: Reader, Cost Management Contributor, Monitoring Reader
  • Storage Account scope: Owner, Storage Blob Data Reader
The Owner role is granted exclusively on the storage account created by nOps for FOCUS exports (nopsfocus<tenant-prefix>) — it does not grant Owner access to any other resources in your environment.
For complete role definitions and purposes, see Prerequisites - Understanding RBAC Roles for nOps.

Running the Setup

Recommended for most users. Complete the setup through the Azure Portal UI with visual confirmation at each step.
The nOps wizard walks you through these same steps (labeled A through E). Follow along in the wizard or use the instructions below.
A. Assign Tenant-Level Reader RolesThese roles are assigned at the tenant provider scope so nOps can read your existing reservations and savings plans. You must be a Global Administrator with elevated access to assign them.
Prerequisite: You must enable “Access management for Azure resources” in Microsoft Entra ID before you can assign tenant-level roles. Go to Microsoft Entra ID → Properties, toggle “Access management for Azure resources” to Yes, click Save, then sign out and sign back in to pick up the new permissions.
1

Assign Reservations Reader

  1. Go to Reservations in the Azure Portal.
  2. Click the Role Assignment button in the top toolbar.
  3. Click Add, select the Reservations Reader role.
  4. Search for “nOps.io”, select it, then click Save.
2

Assign Savings Plan Reader

  1. Go to Reservations → Savings Plans in the Azure Portal.
  2. Click Role Assignment in the top toolbar.
  3. Click AddAdd role assignment.
  4. Search for Savings Plan Reader, assign to “nOps.io”.
B. Assign Billing Account RoleFollow only the path that matches your billing type. EA: EnrollmentReader (CLI required). MCA: Billing Account Reader (Portal).
Azure does not support assigning EA billing roles (such as EnrollmentReader) to service principals through the Azure Portal. These roles can only be assigned programmatically via the REST API. Use the script below in Azure Cloud Shell (Bash, not PowerShell) or a local terminal with the Azure CLI installed.
1

Sign in to Azure CLI

Open Azure Cloud Shell (Bash) or run az login in your local terminal.
2

Run the EnrollmentReader assignment script

Copy and run the following script. Replace <enrollment-number> and <tenant-id> with your values (the nOps wizard pre-fills these in its generated script):
The nOps wizard generates a ready-to-run script with all values pre-filled (App Client ID, enrollment number, and tenant ID). Copy it directly from the wizard for the easiest experience.
Fallback: If az ad sp show fails, you can find the service principal manually: az ad sp list --filter "startswith(displayName, 'nops')" --query "[].{name:displayName, objectId:id}" -o table and use the objectId value.
A 200 OK response confirms the role was assigned. Repeat for each billing account if you have more than one.
C. Assign RBAC Roles at Management Group ScopeRepeat the following steps for each role: Reader, Cost Management Contributor, and Monitoring Reader.
1

Navigate to Management Groups

Go to Management Groups in the Azure Portal. Select the target management group (or the Tenant Root Group to cover all subscriptions).
2

Open Access Control

Click Access control (IAM) in the left menu, then click Add > Add role assignment.
3

Select the Role

On the Role tab, search for and select the role (e.g., Reader), then click Next.
4

Assign to the nOps Service Principal

  1. On the Members tab, set “Assign access to” to “User, group, or service principal” (not “Managed identity”).
  2. Click ”+ Select members”.
  3. Search for “nOps.io” by name and select it.
  4. Select the nOps.io enterprise application and click Select.
  5. Click Review + assign.
5

Repeat for Remaining Roles

Repeat the role assignment process for each of these roles:
  • Reader — View all resources across subscriptions
  • Cost Management Contributor — Query cost data and manage exports
  • Monitoring Reader — View monitoring metrics and diagnostics
Each time: Add > Add role assignment > select the role > search for “nOps.io” > Review + assign.
D. Create FOCUS Cost Export
Register Resource Providers First — Before creating the export, ensure these resource providers are registered on the subscription where the storage account will be created.Via Portal: Go to Subscriptions → Resource providers and click Register on each: Microsoft.Storage, Microsoft.CostManagement, Microsoft.CostManagementExports.Via CLI: Run in Azure Cloud Shell (Bash):
Most subscriptions already have these registered. If a provider already shows “Registered”, no action is needed.
Follow only the path that matches your billing type (EA or MCA).Path A — Enterprise Agreement (EA)
1

Navigate to Exports

Go to Cost Management > Exports in the Azure Portal.
2

Set the Scope to Your EA Enrollment Billing Account

At the top, click Change scope if needed. Select your EA enrollment billing account (use the same EA Enrollment Number you entered in the nOps wizard — e.g., 12345678).
3

Create a New Export

  1. Click + Create.
  2. Basics tab: Select the “Cost and usage (FOCUS)” template.
  3. Datasets tab: Set export prefix to nops-clara and frequency to Daily (set automatically by the FOCUS template).
  4. Destination tab:
    • Storage type: Azure blob storage
    • Subscription: Select the subscription you configured in the nOps wizard
    • Storage account: Click Create new
      • Resource group: create new — nops-focus-exports-rg
      • Name: nopsfocus + first 15 hex characters of your tenant ID (no hyphens)
    • Container: focus-exports
    • Directory: nops-clara
    • Format: Parquet
    • Compression type: Snappy
    • File partitioning: checked
    • Overwrite data: checked
  5. Click Review + create, then Create.
4

Trigger the First Export and Backfill

  1. After creation, click the export name, then click Run now to trigger the first export.
  2. Click Export selected dates to backfill the previous 3 months:
    • Run 1: Start date = first day of three months ago, End date = last day of three months ago
    • Run 2: Start date = first day of two months ago, End date = last day of two months ago
    • Run 3: Start date = first day of previous month, End date = last day of previous month
Data will be available within a few hours.
Path B — Microsoft Customer Agreement (MCA)
Billing profile auto-detection: When you reach this step for an MCA account, nOps automatically detects your billing profiles. If your account has multiple billing profiles, the wizard displays a selector so you can choose the primary billing profile — the export scope is then set correctly for that profile. If your account has only one billing profile, no action is needed; nOps uses it automatically.
1

Navigate to Exports

Go to Cost Management > Exports in the Azure Portal.
2

Set the Scope to Your MCA Billing Profile

At the top, click Change scope if needed. Select your Microsoft Customer Agreement billing profile (not the billing account — MCA cost data lives at the profile level).
If you selected a billing profile in the nOps wizard, use that same billing profile here. If you have multiple billing profiles, repeat this step for each one, pointing all exports to the same storage account (nopsfocus<tenant-prefix>).
3

Create a New Export

  1. Click + Create.
  2. Basics tab: Select the “Cost and usage (FOCUS)” template.
  3. Datasets tab: Set export prefix to nops-clara and frequency to Daily (set automatically by the FOCUS template).
  4. Destination tab:
    • Storage type: Azure blob storage
    • Subscription: Select the subscription you configured in the nOps wizard
    • Storage account: Click Create new
      • Resource group: create new — nops-focus-exports-rg
      • Name: nopsfocus + first 15 hex characters of your tenant ID (no hyphens)
    • Container: focus-exports
    • Directory: nops-clara
    • Format: Parquet
    • Compression type: Snappy
    • File partitioning: checked
    • Overwrite data: checked
  5. Click Review + create, then Create.
4

Trigger the First Export and Backfill

  1. After creation, click the export name, then click Run now to trigger the first export.
  2. Click Export selected dates to backfill the previous 3 months:
    • Run 1: Start date = first day of three months ago, End date = last day of three months ago
    • Run 2: Start date = first day of two months ago, End date = last day of two months ago
    • Run 3: Start date = first day of previous month, End date = last day of previous month
Data will be available within a few hours.
Multiple Billing Profiles: If you have multiple billing profiles with spend, repeat this step for each one and point every export at the same storage account.
The nOps wizard displays the exact storage account name, resource group, container, and folder path you need. Copy these values from the wizard to ensure they match the platform’s validation.
E. Assign Roles on the Storage Account
1

Navigate to the Storage Account

Search for “Storage accounts” in the Azure Portal top search bar, then select the storage account you created (e.g., nopsfocus<tenant-prefix>).
2

Assign Owner Role

  1. Go to Access control (IAM)AddAdd role assignment.
  2. On the Role tab, click the “Privileged administrator roles” tab (Owner is not under “Job function roles”).
  3. Select Owner, click Next.
  4. On the Members tab, set “Assign access to” to “User, group, or service principal”.
  5. Click ”+ Select members”, search for “nOps.io”, select and confirm.
  6. On the Conditions tab, select “Allow user to assign all roles except privileged administrator roles Owner, UAA, RBAC (Recommended)”.
  7. Click Review + assign.
3

Assign Storage Blob Data Reader

  1. Go back to Access control (IAM)AddAdd role assignment.
  2. On the Role tab, search for Storage Blob Data Reader and select it.
  3. On the Members tab, choose “User, group, or service principal” → search for “nOps.io”.
  4. Click Review + assign (no Conditions tab for this role).
4

Multiple billing profiles (MCA only)

If you created FOCUS exports for multiple MCA billing profiles, ensure that Owner and Storage Blob Data Reader are assigned to the nOps service principal on each storage account used. If all profiles share the same storage account, you only need to assign the roles once.
5

Configure Firewall (if applicable)

If your organization restricts storage account network access (via Azure Policy or manual configuration):
  1. Go to the storage account > Security + networking > Networking
  2. Under Firewall, add the nOps IP addresses: 44.246.45.84, 52.11.53.164, and 52.39.155.200
  3. Ensure “Allow Azure services on the trusted services list” is checked
  4. Click Save
Skip this step if your storage account allows public network access (the default). The nOps data ingestion service reads FOCUS export data from outside Azure, so if a firewall is enabled, the nOps IP must be whitelisted.
Verification troubleshooting: Both the Owner and Storage Blob Data Reader roles must be assigned directly on the storage account resource (not inherited from a higher scope such as the subscription or management group). Azure role assignments can take 2-5 minutes to propagate. If verification fails immediately after assigning roles, wait a few minutes and try again.
Multiple Billing Profiles (MCA): If you created separate FOCUS exports for multiple billing profiles, all exports should point to the same storage account — no additional role assignments are needed.
Return to nOpsOnce you have completed all the steps above (A through E), return to the nOps wizard and click “I’ve Completed the Manual Setup” to proceed to the verification step.
Configuration Preview — When using the Terraform method, you can expand the configuration preview in the nOps wizard to inspect exactly what will be applied before copying it.

4a. Minimum Permissions Setup

For security-sensitive customers (e.g., least-privilege security reviews). If your organization’s security review rejects the standard 8-role assignment, nOps offers an alternate path that grants only the three roles strictly required for Savings Analysis. Enable it by ticking “Use minimum permissions (security-sensitive)” on the Get Started step of the wizard.

What changes in this flow

  • The setup script section is replaced with five portal-driven steps — there is no Bicep or Terraform deployment to run.
  • You create the storage account and FOCUS export yourself in the Azure Portal; nOps never needs Owner-level access on those resources.
  • nOps backend verification uses a data-plane blob probe instead of listKeys, and probes Monitoring Reader via the Azure Monitor metrics:getBatch API.
  • Backfills must be triggered manually from the Azure Portal (the wizard’s automated backfill button is disabled in this mode).

Roles granted

No tenant-root elevation, no Owner, no Cost Management Contributor, no billing-scoped roles.

Five portal steps the wizard walks you through

1

Assign Reader at the Management Group

Navigate to Management Groups > your management group > Access control (IAM) > Add role assignment. Select Reader, then assign it to the nOps enterprise application.
2

Assign Monitoring Reader at the Management Group

Repeat the same flow on the same management group, this time selecting Monitoring Reader.
3

Create the storage account

Create a Standard / locally-redundant (LRS) general-purpose v2 storage account on the subscription where the FOCUS export will land. Use these values:
  • Subscription: the subscription that hosts (or will host) the FOCUS export
  • Resource group: create new — nops-focus-exports-rg
  • Storage account name: nopsfocus<tenant-prefix> (the wizard displays the exact name to copy)
  • Region: any region (East US recommended for the lowest export latency)
  • Performance: Standard
  • Redundancy: Locally-redundant storage (LRS)
After the account is created, open it and go to Data storage → Containers, then click + Container and create a private blob container called focus-exports.
4

Create the FOCUS export

In Cost Management > Exports, create a new export:
  • Template: Cost and usage (FOCUS)
  • Format: Parquet, Compression: Snappy
  • Recurrence: Daily
  • Storage account: the one you just created
  • Container: focus-exports, Directory: nops-clara
  • Scope (EA): Billing Account (enrollment)
  • Scope (MCA): Billing Profile (not the billing account — MCA cost data lives at the profile level)
  • Backfill: after creating the export, click Export selected dates and run for the previous 3 months
MCA with multiple billing profiles: If you have multiple billing profiles with spend, repeat this step for each one and point every export at the same storage account. An export at billing-account scope will write valid Parquet files with zero data rows for MCA.
5

Assign Storage Blob Data Reader on the storage account

Navigate to the storage account you created > Access control (IAM) > Add role assignment. Select Storage Blob Data Reader, then assign it to the nOps enterprise application.

Network access

If your organization enforces a storage firewall, allowlist the nOps egress IPs (44.246.45.84, 52.11.53.164, 52.39.155.200) on the storage account and enable “Allow Azure services on the trusted services list”. Otherwise, leave network access set to Enabled from all networks so the FOCUS export writer and the nOps reader can reach the account.

When to use this flow

  • ESO-style least-privilege security reviews
  • Customers who reject Cost Management Contributor or Owner-on-storage
  • Tenants where Global Admin “Access management for Azure resources” elevation is not permitted
The minimum-permissions integration can be upgraded to Commitment Management later — at that point additional write-level roles are required and documented separately.

5. Verify Connection

After completing the setup, verify that all permissions are correctly configured.
1

Wait for Role Propagation

After completing the setup, the nOps wizard displays a cooldown timer. Azure role assignments typically take 2-5 minutes to propagate. Wait for the timer to complete before verifying.
The cooldown is shorter (1 minute) for Azure Portal manual setup since you spent time completing the steps. For the Terraform method, it’s 3 minutes since the configuration applies quickly.
2

Click Verify Permissions

Click the Verify Permissions button. nOps checks:
  • Subscription Access — Can the service principal list and access subscriptions under the management group?
  • Cost Management Access — Can the service principal query cost data?
  • Individual Role Checks — Is each required role (Reader, Cost Management Contributor, Monitoring Reader, Owner) properly assigned?
3

Review Results

The wizard displays per-role validation results with pass/fail indicators. If all checks pass, you will see a “Script Executed!” confirmation with the number of connected subscriptions.
Verification Failed? — If some permissions are not yet detected:
  1. Wait a few more minutes for Azure role propagation
  2. Ensure the setup completed without errors (check Terraform output or verify all Portal steps were completed)
  3. Verify your account has sufficient permissions (Owner or User Access Administrator at the management group scope)
  4. Click Verify Permissions to re-check

Next Steps

Once the Savings Analysis integration is verified, nOps begins ingesting your cost data and generating optimization recommendations. To enable automated purchasing and management of Azure Reservations and Savings Plans, you can upgrade your integration to the Commitment Management tier:

Azure Commitment Management Setup

Configure nOps to manage Azure Reservations and Savings Plans on your behalf, including automated purchasing and optimization.