An enterprise-ready landing zone accelerator for Azure API Management that deploys a complete API platform with centralized monitoring, multi-team workspace isolation, a self-service developer portal, and API inventory governance β all orchestrated through modular Bicep templates and the Azure Developer CLI (azd).
π‘ Why This Accelerator? Standing up a production-grade APIM environment typically requires coordinating dozens of Azure resources across monitoring, networking, identity, and governance. This accelerator codifies Microsoft best practices into a single
azd updeployment, reducing weeks of manual setup to under an hour.
- Overview
- Architecture
- Features
- Requirements
- Quick Start
- Configuration
- Usage
- Project Structure
- Deployment
- Environments
- Troubleshooting
- Contributing
- License
Overview
The APIM Accelerator is a production-ready landing zone that provisions a complete Azure API Management platform in a single command. It targets platform engineers and API teams who need a governed, observable, and multi-tenant API gateway without weeks of manual Azure resource configuration.
π‘ Why This Matters: Organizations adopting API-first strategies need a consistent, repeatable platform foundation. This accelerator eliminates configuration drift and enforces best practices across environments, letting teams focus on APIs instead of infrastructure plumbing.
π How It Works: A subscription-scoped Bicep orchestrator deploys resources in strict dependency order β shared monitoring first, then core APIM with workspaces and developer portal, then API Center for governance β ensuring each layer receives validated outputs from the previous one.
Overview
The accelerator follows a layered landing zone pattern with clear separation between shared infrastructure, core platform services, and API governance capabilities. This architecture ensures independent lifecycle management for each layer while maintaining centralized observability.
π‘ Why This Matters: A layered architecture prevents blast-radius issues during updates β changes to monitoring do not impact the API gateway, and governance policies evolve independently of platform configuration.
---
title: "APIM Accelerator β Landing Zone Architecture"
config:
theme: base
look: classic
layout: dagre
themeVariables:
fontSize: '16px'
flowchart:
htmlLabels: true
---
flowchart TB
accTitle: APIM Accelerator Landing Zone Architecture
accDescr: Shows deployment orchestration flowing into three layers - shared infrastructure, core platform, and API governance - within a single resource group
%% βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
%% AZURE / FLUENT ARCHITECTURE PATTERN v1.1
%% (Semantic + Structural + Font + Accessibility Governance)
%% βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
%% PHASE 1 - STRUCTURAL: Direction explicit, flat topology, nesting β€ 3
%% PHASE 2 - SEMANTIC: Colors justified, max 5 semantic classes, neutral-first
%% PHASE 3 - FONT: Dark text on light backgrounds, contrast β₯ 4.5:1
%% PHASE 4 - ACCESSIBILITY: accTitle/accDescr present, icons on all nodes
%% PHASE 5 - STANDARD: Governance block present, classDefs centralized
%% βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
%% STANDARD COLOR SCHEME v2.1
%% COLOR SCHEME DOCUMENTATION
%% Level 1 (Main Groups): fill:#F3F2F1, stroke:#605E5C, stroke-width:3px
%% Level 2 (Nested): semantic fill per function, stroke-width:2px
%% Semantic: core=#DEECF9, success=#DFF6DD, warning=#FFF4CE, neutral=#FAFAFA
%% Palette: danger=#FDE7E9, data=#E1DFDD, external=#F3F2F1
subgraph Orchestration["π Deployment Orchestration"]
AZD["π οΈ Azure Developer CLI<br/>(azd up)"]:::core
HOOK["π Pre-Provision Hook<br/>Purge soft-deleted APIM"]:::warning
end
subgraph RG["π¦ Resource Group<br/>apim-accelerator-{env}-{region}-rg"]
subgraph Shared["π Shared Infrastructure"]
LAW["π Log Analytics<br/>Workspace"]:::neutral
AI["π Application<br/>Insights"]:::neutral
SA["ποΈ Storage Account<br/>Diagnostic Logs"]:::neutral
end
subgraph Core["βοΈ Core Platform"]
APIM["π API Management<br/>Premium SKU"]:::core
WS["π’ Workspaces<br/>Multi-team Isolation"]:::core
DP["π Developer Portal<br/>Azure AD Auth"]:::core
end
subgraph Inventory["π API Governance"]
AC["ποΈ API Center<br/>Catalog & Compliance"]:::success
RBAC["π RBAC<br/>Role Assignments"]:::success
end
end
AZD -->|"runs"| HOOK -->|"provisions"| RG
LAW -->|"feeds"| AI
SA -->|"stores"| AI
AI -->|"monitors"| APIM
LAW -->|"logs"| APIM
SA -->|"diagnostics"| APIM
APIM -->|"isolates"| WS
APIM -->|"exposes"| DP
APIM -->|"registers"| AC
AC -->|"enforces"| RBAC
%% Subgraph styling (5 subgraphs = 5 style directives)
style Orchestration fill:#F3F2F1,stroke:#605E5C,stroke-width:3px,color:#323130
style RG fill:#F3F2F1,stroke:#605E5C,stroke-width:3px,color:#323130
style Shared fill:#FAFAFA,stroke:#8A8886,stroke-width:2px,color:#323130
style Core fill:#DEECF9,stroke:#0078D4,stroke-width:2px,color:#004578
style Inventory fill:#DFF6DD,stroke:#107C10,stroke-width:2px,color:#0B6A0B
%% Centralized semantic classDefs (Phase 5 compliant β 7 canonical)
classDef core fill:#DEECF9,stroke:#0078D4,stroke-width:2px,color:#004578
classDef success fill:#DFF6DD,stroke:#107C10,stroke-width:2px,color:#0B6A0B
classDef warning fill:#FFF4CE,stroke:#FFB900,stroke-width:2px,color:#986F0B
classDef danger fill:#FDE7E9,stroke:#E81123,stroke-width:2px,color:#A4262C
classDef neutral fill:#FAFAFA,stroke:#8A8886,stroke-width:2px,color:#323130
classDef data fill:#E1DFDD,stroke:#8378DE,stroke-width:2px,color:#5B5FC7
classDef external fill:#F3F2F1,stroke:#605E5C,stroke-width:2px,color:#323130
Component Roles:
| Component | Purpose |
|---|---|
| π Log Analytics Workspace | Centralized logging, KQL queries, and diagnostic data |
| π Application Insights | APM telemetry, distributed tracing, and performance monitoring |
| ποΈ Storage Account | Long-term diagnostic log retention and compliance archival |
| π API Management | Gateway, policies, rate limiting, caching, and API lifecycle |
| π’ Workspaces | Logical isolation for teams to manage APIs independently |
| π Developer Portal | Self-service API discovery, testing, and subscription management |
| ποΈ API Center | Centralized API catalog, governance, and compliance management |
Overview
The accelerator provides production-ready capabilities out of the box, following Azure Well-Architected Framework principles for reliability, security, and operational excellence.
π‘ Why This Matters: Each feature addresses a specific operational gap β from eliminating manual resource provisioning to enforcing consistent governance across API teams β so platform engineers can deliver a self-service API platform with confidence.
π How It Works: Modular Bicep templates are composed by a subscription-scoped orchestrator that deploys resources in dependency order β shared monitoring first, then core APIM, then API governance β with each layer receiving outputs from the previous one.
| Feature | Description | Status |
|---|---|---|
| π§© Modular Bicep IaC | Composable templates with typed parameters and shared constants | β Stable |
| π One-Command Deploy | Full provisioning via azd up with pre-provision hooks |
β Stable |
| π Multi-Environment | Support for dev, test, staging, prod, and uat environments |
β Stable |
| π Observability Stack | Log Analytics + Application Insights + Storage diagnostics | β Stable |
| π’ Multi-Team Workspaces | Isolated APIM workspaces for independent API lifecycle management | β Stable |
| π Developer Portal | Azure ADβintegrated portal with CORS, sign-in, and sign-up | β Stable |
| π API Governance | API Center integration with automated discovery from APIM | β Stable |
| π Managed Identity | System-assigned and user-assigned identity support across all resources | β Stable |
| βοΈ RBAC Automation | Deterministic role assignments for API Center operations | β Stable |
| π οΈ Type-Safe Config | Custom Bicep type definitions for validated, consistent configuration | β Stable |
Overview
The accelerator depends on a small set of Azure and CLI tooling prerequisites. All tools are free, cross-platform, and can be installed in minutes. Meeting these requirements ensures a smooth single-command deployment experience.
β οΈ Why These Requirements: The accelerator uses subscription-scoped Bicep deployments with RBAC assignments. Without the correct CLI versions and permissions, provisioning will fail at the resource group or role assignment stage.
| Requirement | Minimum Version | Purpose |
|---|---|---|
| βοΈ Azure Subscription | β | Target for resource deployment |
| π οΈ Azure CLI | 2.60+ | Azure resource management |
| π Azure Developer CLI (azd) | 1.5+ | Deployment orchestration |
| π¦ Bicep CLI | 0.25+ | Infrastructure-as-Code compilation |
β οΈ Permissions: You need Owner or Contributor + User Access Administrator at the subscription level to create resource groups and assign RBAC roles.
git clone https://github.com/Evilazaro/APIM-Accelerator.git
cd APIM-Acceleratoraz login
azd auth loginazd up
# Expected: Provisioning completes with "SUCCESS: Your application was provisioned in Azure"You will be prompted for:
- Environment name β a label for this deployment (e.g.,
dev,prod) - Azure location β the target region (e.g.,
eastus,westeurope)
π‘ What happens:
azd upruns the pre-provision hook to purge soft-deleted APIM instances, then deploys shared monitoring, core APIM (Premium SKU), and API Center in dependency order.
az apim show \
--name apim-accelerator-dev-eastus \
--resource-group apim-accelerator-dev-eastus-rg \
--query "{name:name, sku:sku.name, state:provisioningState}" \
-o tableExpected Output:
Name Sku State
---------------------------- -------- -----------
apim-accelerator-dev-eastus Premium Succeeded
Overview
All environment-specific settings are centralized in a single YAML file, giving operators full control over SKU tiers, identity, and workspace topology without modifying Bicep templates. Resource names are auto-generated when left empty, following a consistent naming convention.
π How It Works: The
infra/main.biceporchestrator readsinfra/settings.yamlat deployment time via theloadYamlContent()Bicep function, making every setting available as a typed parameter across all modules.
solutionName: "apim-accelerator"
core:
apiManagement:
name: "" # Auto-generated if empty
publisherEmail: "admin@contoso.com"
publisherName: "Contoso"
sku:
name: "Premium" # Developer | Basic | Standard | Premium
capacity: 1 # Scale units (Premium: 1β10)
identity:
type: "SystemAssigned" # SystemAssigned | UserAssigned
userAssignedIdentities: []
workspaces:
- name: "workspace1" # Premium SKU only| Setting | Path | Description |
|---|---|---|
| βοΈ SKU Tier | core.apiManagement.sku.name |
APIM pricing tier β Premium required for workspaces and VNet |
| π Scale Units | core.apiManagement.sku.capacity |
Number of gateway units (affects throughput and cost) |
| π¬ Publisher Email | core.apiManagement.publisherEmail |
Required by Azure for APIM service notifications |
| π Identity Type | core.apiManagement.identity.type |
Managed identity for secure Azure service integration |
| π·οΈ Tags | shared.tags.* |
Governance tags applied to all resources (cost center, owner, etc.) |
Overview
Once deployed, the accelerator provides a fully operational API Management platform. Teams interact with the platform through the Azure portal, the developer portal, or CLI commands for day-to-day API operations.
π‘ Why This Matters: Understanding the primary interaction patterns helps teams onboard faster and adopt self-service API publishing workflows from day one.
After deployment, the developer portal is available at:
https://{apim-name}.developer.azure-api.net
Sign in with Azure AD credentials to discover, test, and subscribe to published APIs.
Import an API specification into the deployed APIM instance:
az apim api import \
--resource-group apim-accelerator-dev-eastus-rg \
--service-name apim-accelerator-dev-eastus \
--path "/petstore" \
--specification-format OpenApi \
--specification-url "https://petstore3.swagger.io/api/v3/openapi.json" \
--display-name "Petstore API"
# Expected: API "Petstore API" created with path "/petstore"az apim api list \
--resource-group apim-accelerator-dev-eastus-rg \
--service-name apim-accelerator-dev-eastus \
--query "[].{Name:displayName, Path:path}" \
-o tableExpected Output:
Name Path
-------------- ----------
Petstore API /petstore
βββ azure.yaml # azd project configuration
βββ infra/
β βββ main.bicep # Subscription-scoped orchestrator
β βββ main.parameters.json # Parameter file for azd
β βββ settings.yaml # Environment configuration
β βββ azd-hooks/
β βββ pre-provision.sh # Purge soft-deleted APIM instances
βββ src/
βββ core/
β βββ main.bicep # Core platform orchestrator
β βββ apim.bicep # APIM service + diagnostics + RBAC
β βββ workspaces.bicep # Multi-team workspace isolation
β βββ developer-portal.bicep # Azure AD portal configuration
βββ inventory/
β βββ main.bicep # API Center + governance + RBAC
βββ shared/
βββ main.bicep # Shared infra orchestrator
βββ common-types.bicep # Reusable Bicep type definitions
βββ constants.bicep # Shared constants and utilities
βββ monitoring/
β βββ main.bicep # Monitoring orchestrator
β βββ insights/
β β βββ main.bicep # Application Insights
β βββ operational/
β βββ main.bicep # Log Analytics + Storage
βββ networking/
βββ main.bicep # Networking (placeholder)
Overview
The accelerator supports two deployment methods: the recommended Azure Developer CLI (azd) workflow and direct Azure CLI for advanced scenarios. Both methods use the same Bicep templates and produce identical infrastructure.
π How It Works: The
infra/main.biceporchestrator runs at subscription scope, creating the resource group first, then deploying modules in strict dependency order using Bicep module outputs to chain configuration across layers.
# Provision infrastructure only
azd provision
# Full provision + deploy
azd up
# Tear down all resources
azd downaz deployment sub create \
--location eastus \
--template-file infra/main.bicep \
--parameters envName=dev location=eastusThe orchestrator deploys resources in strict dependency order:
- π¦ Resource Group β Container for all landing zone resources
- π Shared Monitoring β Log Analytics, Application Insights, Storage Account
- βοΈ Core APIM Platform β API Management service, workspaces, developer portal
- ποΈ API Inventory β API Center with APIM integration and RBAC
β οΈ Deployment Time: Initial APIM provisioning (especially Premium SKU) can take 30β60 minutes. Subsequent deployments are incremental and significantly faster.
Overview
The accelerator supports five environment tiers mapped to different SKU recommendations. Select the tier that matches your workload stage to balance cost and capability.
| Environment | Use Case | Recommended SKU |
|---|---|---|
π§ͺ dev |
Development and experimentation | Developer |
π§ͺ test |
Automated testing and CI | Basic / Standard |
π staging |
Pre-production validation | Standard / Premium |
β
uat |
User acceptance testing | Standard / Premium |
π prod |
Production workloads | Premium |
Overview
Common issues and their resolutions are listed below. Most problems stem from soft-deleted resource conflicts, SKU limitations, or insufficient permissions.
| Issue | Cause | Resolution |
|---|---|---|
| β Name conflict on APIM deploy | Soft-deleted APIM with same name exists | Re-run azd up β the pre-provision hook purges soft-deleted instances |
| β Workspace creation fails | Non-Premium SKU selected | Set sku.name to Premium in infra/settings.yaml |
| π Developer portal auth error | Missing Azure AD app registration | Register an app in Azure AD and provide clientId/clientSecret |
| π Role assignment denied | Insufficient subscription permissions | Ensure you have Owner or Contributor + User Access Administrator |
| β±οΈ Deployment timeout | Premium SKU initial provisioning | Wait up to 60 minutes; check status with az apim show |
Overview
Contributions are welcome and valued. Whether you are fixing a bug, improving documentation, or adding a new feature, every contribution strengthens the accelerator for the community.
π‘ Contribution Impact: This accelerator is used by platform teams across organizations. Your improvements directly reduce setup time and increase reliability for every downstream deployment.
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
This project is licensed under the MIT License β see the LICENSE file for details.