Skip to content
Back to Blog
1 min read

Azure Functions Premium Plan: Enterprise Serverless

Cold starts on Consumption plan kill credibility. I’ve watched a perfectly good HTTP-triggered function get blamed for “the API being slow” because the first request after idle took eight seconds. The fix isn’t always to abandon serverless—Premium plan exists for exactly this. Pre-warmed instances, VNet integration, no 10-minute timeout. You pay for the floor, but you stop apologising for cold starts.

Premium vs Consumption

FeatureConsumptionPremium
Cold startsYesNo (pre-warmed)
Max timeout10 minUnlimited
VNet integrationNoYes
Min instances01+ (configurable)
ScalingEvent-drivenEvent-driven
BillingPer executionPer vCPU-second

Creating Premium Plan

# Create premium plan
az functionapp plan create \
    --name my-premium-plan \
    --resource-group myRG \
    --location eastus \
    --sku EP1 \
    --min-instances 1 \
    --max-burst 10

# Create function app on premium
az functionapp create \
    --name my-premium-func \
    --resource-group myRG \
    --plan my-premium-plan \
    --storage-account mystorageaccount \
    --runtime dotnet

SKU Options

SKUvCPUMemoryPrice
EP113.5 GB$0.173/hr
EP227 GB$0.346/hr
EP3414 GB$0.692/hr

Pre-Warmed Instances

# Set minimum instances (always warm)
az functionapp config set \
    --name my-premium-func \
    --resource-group myRG \
    --min-instances 2

# View current instance count
az functionapp show \
    --name my-premium-func \
    --resource-group myRG \
    --query "siteConfig.preWarmedInstanceCount"

VNet Integration

# Integrate with VNet
az functionapp vnet-integration add \
    --name my-premium-func \
    --resource-group myRG \
    --vnet myVNet \
    --subnet functions-subnet

Private Endpoints

# Create private endpoint
az network private-endpoint create \
    --name func-private-endpoint \
    --resource-group myRG \
    --vnet-name myVNet \
    --subnet private-endpoints \
    --private-connection-resource-id $(az functionapp show --name my-premium-func -g myRG --query id -o tsv) \
    --group-id sites \
    --connection-name func-connection

Scale Configuration

// host.json
{
    "extensions": {
        "http": {
            "maxConcurrentRequests": 200
        }
    },
    "functionTimeout": "00:30:00"  // 30 minutes
}

Long-Running Functions

// Unlimited execution time with Premium
[FunctionName("LongRunningProcess")]
public static async Task<IActionResult> Run(
    [HttpTrigger] HttpRequest req,
    ILogger log)
{
    // Process for hours if needed
    await ProcessLargeDataset();  // No timeout
    return new OkResult();
}

Accessing Private Resources

// Connect to SQL in private VNet
[FunctionName("QueryPrivateSQL")]
public static async Task<IActionResult> Run(
    [HttpTrigger] HttpRequest req)
{
    // Connection goes through VNet integration
    var connectionString = "Server=private-sql.database.windows.net;...";
    using var connection = new SqlConnection(connectionString);
    await connection.OpenAsync();
    // Query data...
}

Monitoring Instances

// App Insights query - check instance distribution
FunctionAppLogs
| where TimeGenerated > ago(1h)
| summarize count() by RoleInstance
| render piechart

Cost Optimization

# Scale to zero during off-hours (loses pre-warming)
az functionapp config set \
    --name my-premium-func \
    --resource-group myRG \
    --min-instances 0

# Use slots for dev/test on same plan
az functionapp deployment slot create \
    --name my-premium-func \
    --resource-group myRG \
    --slot staging

Premium plan: production-grade serverless without compromises.\n\n## Takeaways\n\nAdd a concise, personal takeaway and recommended next steps here.\n

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.