Defend ACA vs AKS
Use the decision matrix, POC topology, and docs/ACA-vs-AKS.md.
Azure Container Apps POC — the Referral Service migration to GovCloud
ACA vs AKS · Portal · DAPR · Revisions · Blue/green · Demo runbook
← Back to home · or press → to begin
Platform decision and day-2 operations for .NET on Azure Container Apps — without standing up AKS.
Use the decision matrix, POC topology, and docs/ACA-vs-AKS.md.
Overview, environment, Dapr components, revisions, log stream.
Native sidecar, Service Bus publish, no cluster add-ons.
Traffic weights, revision lifecycle, CLI demo on Referral Service.
Set up BMAD in your IDE, run the agent commands, and walk through a live story cycle — from install to deployable code.
Works with Cursor, Claude Code, and VS Code + GitHub Copilot
A platform proof for enterprise modernization on Azure Government — not full program delivery.
Scope focus: Presentation stays on Angular / COMPASS; SOA Policy Manager unchanged — POC deep-dives Referral API compute and data path.
| Domain | Direction for this POC |
|---|---|
| Presentation |
|
| API edge |
|
| Compute |
|
| Runtime |
|
| Data |
|
| Messaging |
|
| Security / ops |
|
| IaC / CI |
|
Goal: Modular container POC for Azure Government modernization programs
Stack: .NET 10, DAPR, Service Bus, EF Core, SQL, Bicep, ACA revisions
Question answered: ACA vs AKS for .NET microservices with DAPR already committed
BMAD role: Brownfield backfill; Story 1.2 SQL persistence via story cycle
Repo paths: src/ReferralService · infra/main.bicep · _bmad-output/
| Dimension | Azure Container Apps | AKS |
|---|---|---|
| DAPR | ✓ Built-in, one flag | Helm chart lifecycle |
| Service Bus scaling | ✓ Native KEDA rule in Bicep | Install / configure KEDA |
| Blue/green | ✓ Revisions + traffic split | Argo / Flagger / mesh |
| Operations | ✓ No node pools | Cluster + add-on ops |
| When AKS wins | Start on ACA first | GPU pools · strict CNI / Calico policy · advanced mesh |
Use the live Portal and this repo to explain revisions, DAPR, and blue/green — without standing up AKS.
Audience: architects & engineers evaluating ACA for enterprise .NET workloads · Duration: ~60 min hands-on demo or Session 2 supplement
The Overview page is the map of one Container App — not the whole environment.
| Essentials field | What it means for teaching |
|---|---|
| Application Url | External ingress FQDN — hit /health/live and /health/ready in the demo |
| Environment | Shared ACA environment — DAPR components and networking live here (click through) |
| Provisioning state | Resource healthy vs Azure still applying Bicep/ARM changes |
| Revision (running) | Current image + config snapshot receiving traffic — e.g. referral-svc-dev--0000006 |
| Revisions with issues | Failed deploy attempts — image pull, probe failure, bad env — still listed until deactivated |
| Tags | Cost / ownership — tie to Bicep tags in infra/main.bicep |
Portal → Container Apps → your app → OverviewContrast with Environment overview (shared plane)
1. Container App — your .NET container + optional DAPR sidecar (one revision = one deploy unit)
2. ACA Environment — shared runtime; DAPR components (Service Bus pub/sub) attach here
3. Azure services — Service Bus, SQL, Key Vault, ACR, App Insights — wired via Bicep + MI
Walk left-to-right: ingress → app → DAPR sidecar → Service Bus · SQL via MI · secrets from Key Vault
On AKS you think Pods and Deployments; on ACA you think revisions and traffic weights.
az containerapp update or new imageactiveRevisionsMode: Multiple enables traffic splitTeaching line: No cluster objects to explain — revisions + weights replace Deployments + progressive delivery tooling.
| Location | Portal path | Repo path |
|---|---|---|
| 1. App DAPR settings | Container App → Settings → Dapr — enable sidecar, appId, port | infra/modules/containerapp.bicep — dapr.enabled, appId must match component scope |
| 2. DAPR components | ACA Environment → Dapr components — pub/sub, state, bindings | infra/modules/dapr-component.bicep — pubsub-servicebus → Service Bus |
| 3. Application code | Not in Portal — uses DAPR HTTP/gRPC on sidecar | src/ReferralService/Program.cs — publish via DAPR client after POST /referrals |
Common lab error: sidecar log pubsub pubsub-servicebus is not found → appId mismatch or component not on environment.
Five steps — revision traffic weights replace progressive delivery tooling.
--0000006)| ACA | AKS equivalent (for contrast) |
|---|---|
| Revision + traffic % | Second Deployment + Service weights or Flagger |
| Built into platform | Install/configure progressive delivery tooling |
Bicep: activeRevisionsMode | Helm values + ingress controller rules |
# List revisions and traffic az containerapp revision list -n referral-svc-dev -g rg-referral-poc-centralus \ -o table # Deploy green (new image) — creates new revision az containerapp update -n referral-svc-dev -g rg-referral-poc-centralus \ --image <acr>.azurecr.io/referral-svc:<new-tag> # Split traffic 90/10 then 100/0 az containerapp ingress traffic set -n referral-svc-dev -g rg-referral-poc-centralus \ --revision-weight referral-svc-dev--0000006=90 referral-svc-dev--0000007=10 az containerapp ingress traffic set -n referral-svc-dev -g rg-referral-poc-centralus \ --revision-weight referral-svc-dev--0000007=100 # Deactivate old revision az containerapp revision deactivate -n referral-svc-dev -g rg-referral-poc-centralus \ --revision referral-svc-dev--0000006
Run after health probes pass on greenReplace names with your RG and revision IDs
| Segment | Time | Do this |
|---|---|---|
| 1 · Why ACA | 10 min | POC slides ACA vs AKS + docs/ACA-vs-AKS.md — DAPR, KEDA, revisions |
| 2 · Repo walk | 15 min | infra/main.bicep → modules → Program.cs health + DAPR publish |
| 3 · Portal | 15 min | Overview → Environment → Dapr components → Revisions → Log stream |
| 4 · Live API | 10 min | /health/live, /health/ready, POST /referrals (Service Bus) |
| 5 · Blue/green | 10 min | Revision list → traffic split CLI → deactivate old revision |
Maps to Session 2 in docs/bmad-facilitator-runbook.md and POC deck slides (topology, decision matrix).
Facilitator crib sheet — environment-level DAPR is the #1 concept trainees miss.
| When trainees ask… | ACA answer | AKS note (honest) |
|---|---|---|
| “Where is DAPR?” | Toggle + component in Bicep; sidecar injected | Helm chart, upgrades, node compatibility |
| “How do we scale on queue depth?” | KEDA rule on Service Bus (Bicep) | Install KEDA, CRDs, scrape config |
| “How do we do blue/green?” | Revisions + traffic weights (ACA ops section) | Flagger/Argo or duplicate Deployments |
| “What about GovCloud?” | Same ACA model; this POC targets Azure Government | AKS also in Gov; more ops surface |
| “When must we use AKS?” | GPU workloads, strict CNI policy, service mesh at scale — see full matrix in docs/ACA-vs-AKS.md | |
| Check | Action |
|---|---|
| Health endpoints | GET /health/live and /health/ready return 200 before demo |
| DAPR publish | Verify appId = component scope; environment has pubsub-servicebus |
| SQL persistence | Run scripts/grant-sql-mi-access.sql in Portal Query Editor; redeploy restores KV secret |
| Failed revisions | Deactivate old failures so Overview is clean |
| Commercial vs Gov | No Gov sub? Deploy to commercial (e.g. centralus) — same Portal UX |
| KEDA scale rule | May be commented in Bicep until API accepts MI on custom scale rule — mention as roadmap |
./scripts/deploy.shEvidence pack § deploytraining tag for clean story branch
Install, deploy, live Azure POC diagram, troubleshooting, and reading — skip in live sessions unless needed.
Facilitators: jump here from overview (O) · Executives: optional
export SQL_ADMIN_PASSWORD='...' ./scripts/deploy.sh <subscription-id> <resource-group> usgovvirginia # Then: scripts/grant-sql-mi-access.sql
Local dev: in-memory store (no SQL connection string). ACA: Azure SQL via Managed Identity.
Portal resource diagram · RG referral-poc-dev · commercial Azure (GovCloud uses the same Bicep modules)
referral-svc-dev in referral-acaenv-dev · .NET 10 containerreferrals · MI auth (no SQL password in app)See slides: Revisions · Blue/Green · Where is DAPR?docs/ACA-vs-AKS.mdinfra/main.bicep
Where to go next
npx bmad-method install --modules bmm --tools cursor,claude-code,github-copilotNavigate: ← → · Fullscreen F · Overview grid O · Private notes popup S · Theme T