Azure Context (Subscription & Location)
Detect and confirm Azure subscription and location before generating artifacts. Run region capacity check for customer selected location
Step 1: Check for Existing AZD Environment
If the project already uses AZD, check for an existing environment with values already set:
azd env listIf an environment is selected (marked with *), check its values:
azd env get-valuesIf AZURE_SUBSCRIPTION_ID and AZURE_LOCATION are already set, use ask_user to confirm reuse:
Question: "I found an existing AZD environment with these settings. Would you like to continue with them?"
Environment: {env-name}
Subscription: {subscription-name} ({subscription-id})
Location: {location}
Choices: [
"Yes, use these settings (Recommended)",
"No, let me choose different settings"
]If user confirms → skip to Record in Plan. Otherwise → continue to Step 2.
Step 2: Detect Defaults
Check for user-configured defaults:
azd config get defaultsReturns JSON with any configured defaults:
{
"subscription": "25fd0362-aa79-488b-b37b-d6e892009fdf",
"location": "eastus2"
}Use these as recommended values if present.
If no defaults, fall back to az CLI:
az account show --query "{name:name, id:id}" -o jsonStep 3: Confirm Subscription with User
Use ask_user with the actual subscription name and ID:
✅ Correct:
Question: "Which Azure subscription would you like to deploy to?"
Choices: [
"Use current: jongdevdiv (25fd0362-aa79-488b-b37b-d6e892009fdf) (Recommended)",
"Let me specify a different subscription"
]❌ Wrong (never do this):
Choices: [
"Use default subscription", // ← Does not show actual name
"Let me specify"
]If user wants a different subscription:
az account list --output tableStep 4: Confirm Location with User
- Consult Region Availability for services with limited availability
- Present only regions that support ALL selected services
- Use
ask_user: - After customer selected region, do provisioning limit check, consult Resource Limits and Quotas. For this also invoke azure-quotas
Question: "Which Azure region would you like to deploy to?"
Based on your architecture ({list services}), these regions support all services:
Choices: [
"eastus2 (Recommended)",
"westus2",
"westeurope"
]⚠️ Do NOT include regions that don't support all services — deployment will fail.
Step 5: Check Resource Provisioning Limits
List resource types and quantities that will be deployed from the planned architecture (e.g., 2x Standard D4s v3 VMs, 1x VNet, 3x Storage Accounts)
Determine limits for each resource type using the user-selected subscription and region:
- Reference ./resources-limits-quotas.md for documented limits
- Use azure-quotas skill to check current quotas and usage for the selected subscription and region
- If
az quota listreturnsBadRequesterror, the resource provider doesn't support quota API
For resources that don't support quota API (e.g., Microsoft.DocumentDB, or when you get
BadRequestfromaz quota list):- Invoke azure-resource-lookup skill to count existing deployments of that resource type in the selected subscription and region
- Use the count to calculate:
Total After Deployment = Current Count + Planned Deployment - Reference Azure service limits documentation for the limit value
- Document in provisioning checklist as "Fetched from: azure-resource-lookup + Official docs"
Validate deployment capacity:
- Compare planned deployment quantities against available quota (limit - current usage)
- If insufficient capacity is found, notify the customer and return to Step 4 to select a different region
- Use azure-quotas skill to compare capacity across multiple regions and recommend alternatives
Record in Plan
After confirmation, record in .azure/deployment-plan.md:
## Azure Context
- **Subscription**: jongdevdiv (25fd0362-aa79-488b-b37b-d6e892009fdf)
- **Location**: eastus2Step 6: Apply to AZD Environment
⛔ CRITICAL for Aspire and azd projects: After user confirms subscription and location, you MUST set these values in the azd environment immediately after running
azd initorazd env new. Always use--no-promptwith these commands to prevent interactive prompts from blocking execution.DO NOT wait until validation or deployment. The Azure CLI and azd maintain separate configuration contexts.
For Aspire projects using azd init --from-code:
# 1. Run azd init
azd init --from-code -e <environment-name> --no-prompt
# 2. IMMEDIATELY set the user-confirmed subscription
azd env set AZURE_SUBSCRIPTION_ID <subscription-id>
# 3. Set the location
azd env set AZURE_LOCATION <location>
# 4. Verify
azd env get-valuesFor non-Aspire projects using azd env new:
# 1. Create environment
azd env new <environment-name> --no-prompt
# 2. IMMEDIATELY set the user-confirmed subscription
azd env set AZURE_SUBSCRIPTION_ID <subscription-id>
# 3. Set the location
azd env set AZURE_LOCATION <location>
# 4. Verify
azd env get-valuesWhy this is critical:
az account showreturns the Azure CLI's default subscriptionazdmaintains its own configuration with potentially different defaults- If you don't set
AZURE_SUBSCRIPTION_IDexplicitly, azd will use its own default - This can result in deploying to the wrong subscription despite user confirmation