This deployment option uses Azure Container Apps for a fully serverless, production-ready deployment of Azure IPAM.
The ARM template cannot create App Registrations (Microsoft Graph API limitation). You must create one manually:
- Go to Azure Portal → Microsoft Entra ID → App registrations
- Click New registration
- Configure:
- Name:
Azure-IPAM-Frontend - Supported account types:
Accounts in this organizational directory only - Redirect URI: Leave blank for now (will add after deployment)
- Name:
- Click Register
- Copy the Application (client) ID - you'll need this for deployment
- In your App Registration, go to API permissions
- Add these permissions:
User.Read(Microsoft Graph - Delegated)
- Click Grant admin consent if required
- Go to Authentication
- Under Implicit grant and hybrid flows, check:
- ✅ ID tokens
Click the button below to deploy Azure IPAM:
| Parameter | Description | Default |
|---|---|---|
location |
Azure region for deployment | Resource group location |
appName |
Base name for all resources (3-20 chars) | azure-ipam |
frontendClientId |
Your App Registration Client ID | Required |
createCustomRole |
Create IPAM Reader custom role | true |
repoUrl |
GitHub repository URL | https://github.com/benarch/Azure-IPAM.git |
repoBranch |
Branch to deploy from | main |
After deployment completes:
- Go to your App Registration in Entra ID
- Click Authentication → Add a platform → Single-page application
- Add the Frontend URL from deployment outputs:
https://ca-azure-ipam-fe.<hash>.<region>.azurecontainerapps.io - Click Save
If you need to scan additional subscriptions:
# Get the Managed Identity Principal ID from deployment outputs
MANAGED_IDENTITY_PRINCIPAL_ID="<from-outputs>"
# Assign at subscription level
az role assignment create \
--assignee $MANAGED_IDENTITY_PRINCIPAL_ID \
--role "IPAM Reader - <suffix>" \
--scope "/subscriptions/<target-subscription-id>"# Login to Azure
az login
# Create resource group
az group create --name rg-azure-ipam --location eastus
# Deploy the template
az deployment group create \
--resource-group rg-azure-ipam \
--template-file azuredeploy.json \
--parameters frontendClientId="<your-client-id>"
# Get deployment outputs
az deployment group show \
--resource-group rg-azure-ipam \
--name azuredeploy \
--query properties.outputs| Resource | Description |
|---|---|
| User-Assigned Managed Identity | Used by API for Azure authentication |
| Azure Container Registry | Stores container images |
| Log Analytics Workspace | Collects logs and metrics |
| Container Apps Environment | Hosts the container apps |
| API Container App | Azure Functions backend (port 7071) |
| Frontend Container App | React dashboard (port 8080) |
| IPAM Reader Role | Custom role for read-only access |
| Role Assignments | ACR Pull, IPAM Reader |
┌─────────────────────────────────────────────────────────────┐
│ Azure Container Apps │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────────────┐ │
│ │ Frontend │ │ API │ │
│ │ (React + Vite) │───────▶│ (Azure Functions) │ │
│ │ Port 8080 │ │ Port 7071 │ │
│ └─────────────────┘ └───────────┬─────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ Managed Identity │ │
│ │ (IPAM Reader Role) │ │
│ └───────────┬───────────┘ │
│ │ │
└─────────────────────────────────────────┼───────────────────┘
│
▼
┌───────────────────────┐
│ Azure Resources │
│ (VNets, Subnets, │
│ Public IPs, etc.) │
└───────────────────────┘
Check the deployment script logs:
az deployment-scripts show-log \
--resource-group rg-azure-ipam \
--name buildContainerImagesThe API is configured with CORS allowing all origins. For production, restrict to your frontend domain.
- Verify the App Registration Client ID is correct
- Ensure the redirect URI matches exactly
- Check that ID tokens are enabled
Estimated costs (consumption-based):
- Container Apps: ~$0.000016/vCPU-second, ~$0.000002/GiB-second
- Container Registry (Basic): ~$5/month
- Log Analytics: ~$2.76/GB ingested
For light usage, expect ~$10-20/month.
To remove all resources:
az group delete --name rg-azure-ipam --yes --no-waitNote: Custom role definitions at subscription level must be deleted separately:
az role definition delete --name "IPAM Reader - <suffix>"