Issue
The deployment of an Azure Kubernetes Service (AKS) cluster using cost-optimized B-series VMs (Standard_B2s) failed due to subscription restrictions. The error indicated that these VMs were not available in the subscription, despite being the only option within the $85/month budget. This forced a shift to more expensive alternatives (e.g., Standard_G1 at ~$150/month), exceeding the budget by 3× and rendering the original architecture unviable.
Culprit
The subscription had enterprise-level restrictions blocking all B-series VMs (burstable, cost-optimized instances) across regions. This restriction was not accounted for in pre-flight validation, leading to deployment failures. The architecture assumed the availability of B-series VMs based on public documentation, but actual subscription quotas were never verified.
Solution
Option 1: Request Quota Increase (Recommended)
- Submit a quota increase request for B-series VMs in the target region via the Azure Portal.
- Wait for approval (typically 1-3 business days) before resuming deployment.
- Resume deployment once quotas are updated, maintaining the original architecture.
Option 2: Fallback to Serverless Alternatives
Replace AKS with Azure Container Instances (ACI) for serverless execution:
- Reduced CPU/memory usage (e.g., 1 vCPU, 1GB RAM).
- Pay-per-second billing to stay within budget.
- Tradeoff: Loses Kubernetes orchestration but meets cost constraints.
Option 3: Local Development with Cloud Services
Run the MCP server locally while accessing cloud services (e.g., Azure OpenAI) via environment variables:
- Cost: Limited to Azure OpenAI usage (~$30-40/month).
- Tradeoff: Manual local management and no cloud compute.
Preventive Measures
- Pre-flight validation: Added a script to check VM SKU availability before deployment.
- Terraform validation: Implemented a
null_resourceto enforce runtime validation of VM SKUs.
Current Status
87% of resources were deployed ($65/month) while awaiting quota approval:
- Foundation Layer: Virtual networks, Key Vault, and monitoring (22/22 resources).
- Application Layer: ACR, Azure OpenAI, and managed identities (11/16 resources).
- Blocked: AKS cluster (5/38 resources).
The solution ensures budget adherence while maintaining flexibility for future quota adjustments.