Martin Rylko
  • Services
  • Blog
  • About
  • Contact
  • Get in Touch
Martin Rylko

Senior Cloud Architect & DevOps Engineer. Specializing in Microsoft Azure, IaC, Cloud Security and AI.

Navigation

  • Services
  • Blog
  • About
  • Contact

Collaboration

Looking for an experienced architect for your Azure project? Get in touch.

rylko@cloudmasters.cz

© 2026 Martin Rylko. All rights reserved.

Built in the cloud. Deployed via Azure Static Web Apps.

Home/Blog/Azure Functions Flex Consumption: When to Replace the Premium Plan in 2026
All articlesČíst česky

Azure Functions Flex Consumption: When to Replace the Premium Plan in 2026

5/30/2026 5 min
#Azure#Functions#Serverless#FinOps

Azure Functions Flex Consumption: When to Replace the Premium Plan in 2026

When Microsoft GA-ed Flex Consumption for Azure Functions in 2024, most enterprise teams did not react – the Premium plan was established, worked, and nobody wanted to change a working thing. In Q2 2026 at Christie's we ran a FinOps audit of serverless workloads and Flex emerged as the unexpected champion: 60% of our Premium Function Apps could move to Flex at half the cost without losing functionality.

This article is the breakdown of when and how to use Flex.

A Quick Comparison of the Three Plans

PropertyConsumptionFlex ConsumptionPremium (EP1+)
Price (idle)EUR 0EUR 0~EUR 120/month
Price (active)Per-GBsPer-second per instanceFixed per plan
VNet integrationNoYesYes
Cold start2–10 s0–1 s (always-ready)0 s
Max execution time10 min60 min60 min
Always-ready instances00–N (configurable)1+ (built into the SKU)
HTTP scale-out limit2001 000Per SKU
Deployment slotsNoLimited (1)Yes
Custom domain + SSLYesYesYes
Zone redundancyNoYesYes (zone redundant)

Three real game changers of Flex over Consumption:

  1. VNet integration – Flex supports private endpoints, Consumption does not. For PE-only architectures (see the June 2026 article) this is the choice between "usable" and "unusable"
  2. Pre-warmed instances – minimum 0, maximum 100. Cold start anxiety disappears
  3. Per-second billing with GB-second – cheaper than Premium per-plan for burst workloads

Real Cost Example: a Christie's REST API

Workload: a REST API for an internal reporting tool. ~200 requests/hour during business hours, 0 outside. p95 latency requirement: 500 ms.

PlanMonthly costComment
Consumption~EUR 25Not viable – the API needs VNet for DB
Premium EP1 (1 instance)~EUR 120Works, but idle 20 hours/day
Premium EP1 zone-redundant~EUR 360High availability, expensive
Flex Consumption (1 always-ready)~EUR 52VNet + no cold start, pay only for real usage
Flex Consumption (0 always-ready)~EUR 18No cold start guarantee

For this API we migrated to Flex with 1 always-ready instance – EUR 68/month savings vs Premium EP1, plus EUR 308 vs EP1 zone-redundant. Scaled across 15 similar APIs: ~EUR 1 000/month savings.

Flex Consumption in Bicep

// Server farm with the Flex SKU
resource flexPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: 'asp-api-flex-prod'
  location: location
  sku: {
    tier: 'FlexConsumption'
    name: 'FC1'
  }
  properties: {
    reserved: true  // Linux
  }
}
 
// Function App
resource flexFunc 'Microsoft.Web/sites@2024-04-01' = {
  name: 'func-api-flex-prod'
  location: location
  kind: 'functionapp,linux'
  identity: { type: 'SystemAssigned' }
  properties: {
    serverFarmId: flexPlan.id
    virtualNetworkSubnetId: functionSubnet.id
    vnetRouteAllEnabled: true
    publicNetworkAccess: 'Disabled'
    functionAppConfig: {
      deployment: {
        storage: {
          type: 'blobContainer'
          value: '${storageAccount.properties.primaryEndpoints.blob}deployments'
          authentication: {
            type: 'SystemAssignedIdentity'
          }
        }
      }
      scaleAndConcurrency: {
        instanceMemoryMB: 2048
        maximumInstanceCount: 100
        alwaysReady: [
          {
            name: 'http'
            instanceCount: 1   // 1 always-ready for HTTP triggers
          }
        ]
      }
      runtime: {
        name: 'dotnet-isolated'
        version: '9.0'
      }
    }
  }
}

Three important parameters versus Premium:

  1. functionAppConfig.deployment.storage – Flex deploys packages into a Blob container via MSI, not the classic WEBSITE_RUN_FROM_PACKAGE SAS URL
  2. scaleAndConcurrency.instanceMemoryMB – you have to pick a memory tier (2048, 4096); per-second billing scales accordingly
  3. alwaysReady – per-trigger configuration (HTTP vs queue); a different count per trigger

Deployment via GitHub Actions

name: Deploy Flex Function
on:
  push:
    branches: [main]
 
permissions:
  id-token: write
  contents: read
 
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v4
 
      - uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '9.0.x'
 
      - name: Build and package
        run: |
          dotnet publish src/Api.csproj -c Release -o output
          cd output
          zip -r ../app.zip .
 
      - uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
 
      - name: Upload to Flex deployment container
        run: |
          az storage blob upload \
            --account-name "${{ vars.STORAGE_NAME }}" \
            --container-name "deployments" \
            --name "app-${{ github.sha }}.zip" \
            --file app.zip \
            --auth-mode login \
            --overwrite
 
      - name: Sync Flex Function App
        run: |
          az functionapp deployment source config-zip \
            --resource-group "${{ vars.RG_NAME }}" \
            --name "${{ vars.FUNC_NAME }}" \
            --src "https://${{ vars.STORAGE_NAME }}.blob.core.windows.net/deployments/app-${{ github.sha }}.zip" \
            --build-remote false

Heads up: Flex has no Kudu for file inspection and no SCM endpoint for the classic Zip Deploy. Deployment flows through Blob storage with MSI authentication. If you have a legacy CI/CD pipeline that relies on az functionapp deployment source config-zip with a SAS URL, you must adjust.

When NOT to Switch From Premium to Flex

Three scenarios where Premium remains the right call:

  1. In-memory state / cache between requests – Flex pre-warm instances do not aggregate state perfectly; periodic shutdown drops memory. Premium with alwaysOn=true has persistent instances
  2. Workloads with 24/7 fixed load – for steady 5+ instance load, Premium 3Y reserved comes out cheaper than Flex per-second
  3. Deployment slots for blue/green – Flex has only 1 slot (production). If you do slot swaps, stay on Premium

Migration Playbook: Premium → Flex in One Sprint

At Christie's we did the migration per Function App like this:

  1. Day 1 – new Flex Function App next to the existing one, deploy the same code, smoke test
  2. Day 2 – point integration tests at Flex, performance comparison (p50, p95, p99 latency)
  3. Day 3 – Front Door / APIM routes 10% of traffic to Flex, monitor for 24h
  4. Day 4 – 50% of traffic, verify cost projection
  5. Day 5 – 100% cutover, keep Premium for 7 days as rollback
  6. Day +7 – delete the Premium plan

The key: deployment via blob storage with MSI requires deployment pipeline tweaks (~2 hours). Everything else is unchanged – same runtime, same code, same app settings.

Limits Worth Calling Out

LimitFlex ConsumptionWorkaround
Max execution time60 minSame as Premium
Concurrent HTTP requests1 000Scaled via instances
Memory per instance512 MB – 4 GBLarger = higher cost
Deployment slots1Use a Front Door staging slot
Connected to App Service EnvironmentNoUse Premium in ASE
Custom container imagesNoManaged runtime only

For 95% of workloads the limits are irrelevant. Custom container support is the biggest miss – if you have a Function with a custom Docker image, Flex is not an option.

Conclusion

Flex Consumption is the most overlooked optimization in an Azure FinOps audit checklist in May 2026. For most Premium Function Apps it delivers identical functionality at 30–50% of the cost. Migration is a one-sprint affair; the deployment pipeline is the only thing that changes.

At Christie's and CostSentry.AI we saved hundreds of EUR per month by flipping 70% of our Premium Function Apps – with no compromise on latency or SLA.

If you are auditing your own serverless stack and want to identify Flex Consumption candidates, check out our cloud architecture services or reach out for a FinOps review.

Tags:#Azure#Functions#Serverless#FinOps
LinkedInX / Twitter

About the author

Martin Rylko

Martin Rylko

Senior Cloud Architect & DevOps Engineer

14+ years in IT – from on-premises datacenters and Hyper-V clustering to cloud infrastructure on Microsoft Azure. I specialize in Landing Zones, IaC automation, Kubernetes and security compliance.

Email LinkedInFull profile

Frequently Asked Questions

How is Flex Consumption different from classic Consumption?▾
Flex Consumption has two key advantages over Consumption: native VNet integration (Consumption has none) and per-second billing per memory instance (Consumption bills with rounding). Plus Flex guarantees instance pre-warming – the first request after idle does not suffer a 5+ second cold start. The price is slightly higher than Consumption but substantially lower than Premium.
When should I pick Flex Consumption over the Premium plan?▾
Flex for most web APIs and event-driven workers that need VNet but do not run 24/7. Premium for workloads with at least one always-on instance (for warm cache, in-memory state) or with predictable steady load where Premium 3-year reservations come out cheaper. From my practice at Christie's, 70% of functions are Flex candidates; only long-running workers and high-frequency triggers stay on Premium.
How does Flex Consumption handle cold starts?▾
Via configurable instance pre-warming. You set always-ready instances (from 0 to N) that have the code loaded and wait for invocation. Price: ~30% of the standard per-second rate, but no startup overhead. For production APIs with p99 latency requirements I recommend 1–2 always-ready instances. For an event-driven worker with no latency SLA, 0 is enough and Flex scales on demand.
Does Flex Consumption work with Bicep and Deployment Stacks?▾
Yes, fully. The resource type is Microsoft.Web/sites with kind=functionapp,linux and the server farm SKU FC1. All standard Function App parameters work – app settings, deployment slots (limited for Flex), VNet integration. Stack adoption for an existing Premium Function App requires recreation because you cannot change the plan SKU via update. Migration path: a new Function App with Flex, swap via Front Door, delete the old one.

You might also like

Azure Private Endpoints Everywhere: Refactoring a Serverless Pipeline From APIM to PE-Only

A practical refactor of a serverless email pipeline from APIM-fronted architecture to a private-endpoint-only end state. Shared PE subnet, Function Apps Premium, Service Bus, and Log Analytics with no public surface.

Read

Azure Cosmos DB Cost Optimization: 8 Levers to Cut Your RU/s Bill

A practical guide to reducing Azure Cosmos DB costs. Provisioned vs Serverless, autoscale tuning, indexing policy, TTL, and multi-region trade-offs with real numbers from running CostSentry.AI.

Read

Microsoft Build 2026: Foundry, FOCUS 1.3, and Agent Cost Trace

My Microsoft Build 2026 recap from a cloud architect's perspective. The Foundry rebrand, FOCUS 1.3 GA, Agent Cost Trace for AI workloads, and three practical takeaways for enterprise customers.

Read