Skip to main content

ADR-007: Azure Container Apps Deployment

Status

Accepted - July 2025

Context

BookWorm requires a cloud deployment platform that supports containerized microservices with auto-scaling and service discovery. The deployment needs:

  • Container orchestration for .NET microservices
  • Auto-scaling based on demand
  • Service-to-service communication
  • Cost-effective serverless model
  • Simple deployment workflow

Decision

Use Azure Container Apps as the deployment platform, deployed via Azure Developer CLI (azd) with .NET Aspire orchestration.

Implementation

Azure Developer CLI Setup

BookWorm uses azd for streamlined Azure deployment:

  • Configuration: Single azure.yaml file defines the deployment
  • Aspire Integration: Automatic Bicep generation from Aspire AppHost
  • Service Discovery: Built-in service resolution within Container Apps environment
  • Resource Provisioning: Azure resources auto-provisioned with proper tagging

Container Apps Environment

All services deploy to a shared Container Apps environment with:

  • Auto-scaling: Scale to zero when idle, scale up on demand
  • Internal Communication: Service-to-service communication via service discovery
  • Health Checks: Automatic health monitoring and restart
  • Observability: Integrated with Azure Monitor and Log Analytics

Service Configuration

Each microservice deploys as a separate Container App:

  • Catalog/Chat: Public ingress for external access
  • Other Services: Internal-only for service-to-service communication
  • Azure Resources: PostgreSQL, Redis, SignalR, Storage provisioned as Azure services
  • Keycloak: Containerized identity provider with custom realm

Benefits

  • Serverless: Pay only for actual usage, scale to zero
  • Managed: No cluster management overhead
  • Simple Deployment: Single azd up command deploys everything
  • Azure Native: Full integration with Azure services and monitoring
  • Cost Effective: Optimized pricing for variable workloads

Alternatives Considered

  • Azure Kubernetes Service: Too complex for current scale
  • Azure App Service: Limited container orchestration
  • Azure Functions: Not suitable for long-running services
  • Self-managed VMs: High operational overhead

Consequences

Positive

  • Simplified deployment and operations
  • Automatic scaling and high availability
  • Integrated monitoring and observability
  • Cost optimization through serverless model

Challenges

  • Azure platform dependency
  • Limited customization compared to Kubernetes
  • Regional availability constraints