1. App Service Plan Tiers as Architecture Decisions
Each tier unlocks capabilities that matter to architects. Choosing the wrong tier isn't just a cost issue — it blocks features you'll need later (slots, VNet integration, scale-out limits).
🔑 Tier Unlock Table
| Feature | Free/Shared | Basic | Standard | Premium v3 | Isolated v2 |
|---|---|---|---|---|---|
| Custom domains | Shared only | ✅ | ✅ | ✅ | ✅ |
| Deployment slots | — | — | 5 | 20 | 20 |
| Autoscale | — | — | ✅ | ✅ | ✅ |
| VNet integration | — | — | — | Regional | Full (injected) |
| Max instances | — | 3 | 10 | 30 | 100 |
| Zone redundancy | — | — | — | ✅ | ✅ |
| SLA | None | 99.95% | 99.95% | 99.95% | 99.95% |
| Per-app scaling | — | — | — | ✅ | ✅ |
2. VNet Integration Options
Two fundamentally different networking models exist for App Service. Choose based on isolation requirements, not just connectivity needs.
🔑 Decision Rule
Start with Premium v3 + Private Endpoints. Only escalate to ASE when you need: (1) dedicated/isolated compute for compliance, (2) > 30 instance scale, or (3) custom internal DNS naming for the app itself. Most "we need ASE" conversations end with "Premium v3 + Private Endpoint + Service Endpoints is sufficient."
3. When ASE Is Justified
Auditors for PCI-DSS Level 1 or certain government frameworks require proof that no other tenant's code runs on the same physical hardware. ASE provides single-tenant stamps — you own the entire compute cluster. Premium v3 runs on shared stamps with logical isolation (separate VMs, but shared underlying infrastructure).
ASE gives you a private DNS zone (e.g., payments.internal.contoso.net) that resolves only within your VNet. Without ASE, you use Private Endpoints and private DNS zones — similar result, but ASE bakes it in natively without managing separate PE resources per app.
Need 50+ App Service instances for a single app or 100+ across plans? ASE supports up to 100 instances per plan with Isolated v2 SKUs (I1v2 through I6v2 with up to 64 vCPU / 128 GiB RAM per instance). Combined with per-app scaling, this handles extreme multi-tenant SaaS patterns.
📝 Exam Tip
AZ-305 loves "compliance requires network isolation" scenarios. If the question says "no shared infrastructure" or "dedicated hardware" — the answer is ASE (Isolated tier), not Premium + VNet integration. If it just says "private connectivity to backend databases" — Premium + VNet integration or Private Endpoints suffice.
4. Deployment Slots: Blue-Green Pattern
Slots are live app instances with their own hostnames running on the same plan. The swap operation routes traffic atomically — no cold starts, no downtime.
🔑 Slot Settings: Sticky vs Swapped
- Sticky (slot settings) — stay with the slot, NOT the app code: connection strings marked "slot setting", app settings marked sticky, auth configs, CORS, handler mappings. Use for environment-specific values (e.g., staging DB connection string stays in staging).
- Swapped — travel with the app code: app settings NOT marked sticky, runtime version, web sockets on/off, managed identity associations. These are your "application configuration."
Warm-Up
Before a swap completes, Azure sends HTTP requests to the staging slot's root (or a custom applicationInitialization path). The swap only finishes when the slot returns HTTP 200. This prevents cold-start latency hitting production users.
<!-- web.config applicationInitialization -->
<applicationInitialization>
<add initializationPage="/health" />
<add initializationPage="/api/warmup" />
</applicationInitialization>
Auto-Swap
Configure a slot to auto-swap to production after deployment succeeds. Useful for CI/CD pipelines targeting a staging slot — code lands in staging, warms up, then auto-swaps to production with zero manual intervention.
Traffic Routing (Canary)
Route a percentage of traffic to a non-production slot for canary testing. E.g., send 10% of users to the staging slot to validate before a full swap. Configured per-slot in the Azure portal or via az webapp traffic-routing set.
5. Scaling Architecture
🔑 Scale-Up vs Scale-Out
| Dimension | Scale-Up (vertical) | Scale-Out (horizontal) |
|---|---|---|
| What changes | Instance size (SKU) | Number of instances |
| Downtime | Brief restart during SKU change | None — new instances added behind LB |
| Limit | Largest SKU in tier | Tier-dependent (10/30/100) |
| Use when | Single-threaded app needs more CPU/RAM | Stateless app needs more throughput |
Autoscale (Standard+) uses rules based on metrics or schedules:
- Metric-based: CPU%, memory%, HTTP queue length, custom metrics from Application Insights
- Schedule-based: Scale to 10 instances weekdays 8am-6pm, 2 instances nights/weekends
- Cool-down: Default 5 minutes between scale actions — prevents flapping
Architecture tip: Always set a minimum instance count ≥ 2 for production. A single instance has no HA — if the underlying node fails, your app is down until a new instance starts.
By default, all apps in a plan run on ALL instances. Per-app scaling (Premium v3+) lets you limit how many instances each app uses. This prevents a noisy-neighbor app from consuming all plan capacity.
Example: A plan with 10 instances hosts 3 apps. App A uses max 5 instances, App B uses max 3, App C uses max 4. The platform distributes across the pool intelligently.
6. Real-World: PCI Compliance — Premium v3 vs ASE
💼 Scenario
A SaaS payment-processing company needs to host their card-data-handling APIs in Azure. Their PCI QSA (Qualified Security Assessor) requires:
- No shared compute infrastructure with other tenants
- All traffic to/from the app must traverse private networks only
- Custom internal DNS for service-to-service communication
- Ability to scale to 50+ instances during peak processing
❌ Why Premium v3 + VNet Integration Falls Short
- Compute is on shared multi-tenant stamps — QSA won't accept "logical isolation"
- Inbound traffic requires Private Endpoints (additional complexity) — not natively private
- Max 30 instances per plan — below the 50+ requirement
✅ Solution: ASE v2 (ILB mode)
- Dedicated stamp — single-tenant hardware satisfies QSA's "no shared infrastructure" requirement
- ILB ASE — no public IP at all; inbound via internal load balancer inside VNet
- Custom DNS zone —
payments.internal.contoso.netresolves only within the VNet - 100 instance ceiling — room for 50+ instances with headroom
- Cost tradeoff — ~$8,000/month stamp fee + per-instance cost. Justified for PCI Level 1 workloads handling millions in card transactions.
Deployment Strategy
Blue-green with slots: deploy to staging slot → run automated PCI compliance scans against staging URL → auto-swap to production after scan passes. Sticky settings hold staging-specific logging levels (verbose) and test connection strings.
Summary
- Tier = capability gate: Standard unlocks slots; Premium unlocks VNet integration; Isolated unlocks dedicated hardware.
- VNet integration ≠ ASE: Regional VNet integration (Premium) gives outbound private connectivity. ASE gives full network injection (inbound + outbound).
- ASE justification: Physical isolation compliance, >30 instances, native internal DNS.
- Slots = zero-downtime deployments: Swap is atomic. Sticky settings stay with slots. Always warm up before swap.
- Scale-out > Scale-up for stateless apps. Always min 2 instances in production. Use per-app scaling to prevent noisy neighbors.