Azure Deploy Skill
Deploy applications to Azure with intelligent service selection, local preview, and guided deployment workflows.
Quick Start Decision Tree
User wants to deploy → Run detection workflow below
Phase 1: Application Detection
ALWAYS start by scanning the user's project to detect the application type.
Step 1.1: Check for Existing Azure Configuration
Look for these files first (HIGH confidence signals):
| File Found | Recommendation | Action |
|---|---|---|
azure.yaml |
Already configured for azd | Use azd up to deploy |
function.json or host.json |
Azure Functions project | Deploy as Functions |
staticwebapp.config.json |
Static Web Apps project | Deploy as SWA |
If found, skip to the appropriate deployment section.
Step 1.2: Detect Application Framework
Scan for configuration files and dependencies:
Node.js / JavaScript / TypeScript:
package.json exists →
├── next.config.js/mjs/ts → Next.js
│ ├── Has `output: 'export'` → Static Web Apps (SSG)
│ └── Has API routes or no export config → App Service (SSR)
├── nuxt.config.ts/js → Nuxt
│ ├── Has `ssr: false` or `target: 'static'` → Static Web Apps
│ └── Otherwise → App Service (SSR)
├── angular.json → Angular → Static Web Apps
├── vite.config.* → Vite-based (React/Vue/Svelte) → Static Web Apps
├── gatsby-config.js → Gatsby → Static Web Apps
├── astro.config.mjs → Astro → Static Web Apps
├── nest-cli.json → NestJS → App Service
├── Has express/fastify/koa/hapi dependency → App Service
└── No framework, just static build → Static Web Apps
Python:
requirements.txt or pyproject.toml exists →
├── function_app.py exists → Azure Functions (v2 programming model)
├── Has flask dependency → App Service
├── Has django dependency → App Service
├── Has fastapi dependency → App Service
└── Has azure-functions dependency → Azure Functions
.NET:
*.csproj or *.sln exists →
├── <AzureFunctionsVersion> in csproj → Azure Functions
├── Blazor WebAssembly project → Static Web Apps
├── ASP.NET Core web app → App Service
└── .NET API project → App Service
Java:
pom.xml or build.gradle exists →
├── Has azure-functions-* dependency → Azure Functions
├── Has spring-boot dependency → App Service
└── Standard web app → App Service
Static Only:
index.html exists + no package.json/requirements.txt →
└── Pure static site → Static Web Apps
Step 1.3: Detect Multi-Service Architecture
Check for complexity indicators that suggest azd + IaC:
Multi-service triggers:
├── Monorepo structure (frontend/, backend/, api/, packages/, apps/)
├── docker-compose.yml with multiple services
├── Multiple package.json in different subdirectories
├── Database references in config (connection strings, .env files)
├── References to Redis, Service Bus, Event Hubs, Storage queues
├── User mentions "multiple environments", "staging", "production"
└── More than one deployable component detected
If multi-service detected → Recommend azd + Infrastructure as Code See Multi-Service Deployment Guide
Step 1.4: Confidence Assessment
After detection, assess confidence:
| Confidence | Criteria | Action |
|---|---|---|
| HIGH | Azure config file found (azure.yaml, function.json, staticwebapp.config.json) | Proceed with detected service |
| MEDIUM | Framework detected from dependencies | Explain recommendation, ask for confirmation |
| LOW | Ambiguous or no clear signals | Ask clarifying questions |
Clarifying questions for LOW confidence:
- "What type of application is this? (static website, API, full-stack, serverless functions)"
- "Does your app need server-side rendering or is it purely client-side?"
- "Will you need a database, caching, or other Azure services?"
Phase 2: Local Preview (No Azure Auth Required)
Before deploying, help users test locally.
Static Web Apps - Local Preview
# Install SWA CLI (one-time)
npm install -g @azure/static-web-apps-cli
# Start local emulator
swa start
# Or with specific paths
swa start ./dist --api-location ./api
# With a dev server proxy
swa start http://localhost:3000 --api-location ./api
Azure Functions - Local Preview
# Install Azure Functions Core Tools (one-time)
npm install -g azure-functions-core-tools@4
# Start local Functions runtime
func start
# With specific port
func start --port 7071
App Service Apps - Local Preview
Use the framework's built-in dev server:
# Node.js
npm run dev
# or
npm start
# Python Flask
flask run
# Python FastAPI
uvicorn main:app --reload
# .NET
dotnet run
# Java Spring Boot
./mvnw spring-boot:run
See Local Preview Guide for detailed setup instructions.
Phase 3: Prerequisites & Dependency Management
ALWAYS check and install missing dependencies before proceeding.
3.1 Azure Authentication (Auto-Login)
Check login status and automatically login if needed:
# Check if logged in, auto-login if not
if ! az account show &>/dev/null; then
echo "Not logged in to Azure. Starting login..."
az login
fi
# Verify and show current subscription
az account show --query "{name:name, id:id}" -o table
If the user has multiple subscriptions, help them select the correct one:
# List all subscriptions
az account list --query "[].{Name:name, ID:id, Default:isDefault}" -o table
# Set subscription
az account set --subscription "<name-or-id>"
3.2 Dependency Detection & Auto-Install
Run this check first and install any missing tools:
# Check all dependencies at once
check_deps() {
local missing=()
command -v az &>/dev/null || missing+=("azure-cli")
command -v func &>/dev/null || missing+=("azure-functions-core-tools")
command -v swa &>/dev/null || missing+=("@azure/static-web-apps-cli")
command -v azd &>/dev/null || missing+=("azd")
echo "${missing[@]}"
}
3.3 Install Missing Tools
Azure CLI (required for all deployments):
# macOS
brew install azure-cli
# Windows (PowerShell)
winget install Microsoft.AzureCLI
# Linux (Ubuntu/Debian)
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
Azure Functions Core Tools (for Functions projects):
# npm (all platforms)
npm install -g azure-functions-core-tools@4
# macOS
brew tap azure/functions && brew install azure-functions-core-tools@4
# Windows
winget install Microsoft.AzureFunctionsCoreTools
Static Web Apps CLI (for SWA projects):
npm install -g @azure/static-web-apps-cli
Azure Developer CLI (for multi-service/IaC):
# macOS
brew install azd
# Windows
winget install Microsoft.Azd
# Linux
curl -fsSL https://aka.ms/install-azd.sh | bash
3.4 Project Dependencies
Detect and install project-level dependencies:
# Node.js - install if node_modules missing
[ -f "package.json" ] && [ ! -d "node_modules" ] && npm install
# Python - create venv and install if missing
[ -f "requirements.txt" ] && [ ! -d ".venv" ] && python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt
# .NET - restore packages
[ -f "*.csproj" ] && dotnet restore
# Java - install dependencies
[ -f "pom.xml" ] && mvn dependency:resolve
Phase 4: Single-Service Deployment (Azure CLI)
4.1 Static Web Apps Deployment
Create resource and deploy:
# Create resource group (if needed)
az group create --name <resource-group> --location <location>
# Create Static Web App
az staticwebapp create \
--name <app-name> \
--resource-group <resource-group> \
--location <location> \
--sku Free
# Get deployment token
az staticwebapp secrets list \
--name <app-name> \
--resource-group <resource-group> \
--query "properties.apiKey" -o tsv
# Deploy with SWA CLI
swa deploy ./dist \
--deployment-token <token> \
--env production
Plain HTML Site (Single File or No Build Step):
For plain HTML sites without a build process, SWA CLI requires content in a dedicated folder:
# Create output directory and copy files
mkdir -p dist && cp -r *.html *.css *.js *.png *.jpg *.svg dist/ 2>/dev/null || true
# Get deployment token
TOKEN=$(az staticwebapp secrets list \
--name <app-name> \
--resource-group <resource-group> \
--query "properties.apiKey" -o tsv)
# Deploy from dist folder
swa deploy ./dist --deployment-token "$TOKEN" --env production
# Clean up temp folder (optional)
rm -rf dist
Smart defaults:
- SKU:
Freefor dev/test,Standardfor production - Location: SWA has limited regions - use
centralus,eastus2,westus2,westeurope, oreastasia
See Static Web Apps Guide for detailed configuration.
4.2 Azure Functions Deployment
Create and deploy:
# Create resource group
az group create --name <resource-group> --location <location>
# Create storage account (required for Functions)
az storage account create \
--name <storage-name> \
--resource-group <resource-group> \
--location <location> \
--sku Standard_LRS
# Create Function App
az functionapp create \
--name <app-name> \
--resource-group <resource-group> \
--storage-account <storage-name> \
--consumption-plan-location <location> \
--runtime <node|python|dotnet|java> \
--runtime-version <version> \
--functions-version 4
# Deploy with func CLI
func azure functionapp publish <app-name>
Smart defaults:
- Plan: Consumption (pay-per-execution) for most cases
- Runtime version: Latest LTS for the detected language
See Azure Functions Guide for advanced scenarios.
4.3 App Service Deployment
Create and deploy:
# Create resource group
az group create --name <resource-group> --location <location>
# Create App Service plan
az appservice plan create \
--name <plan-name> \
--resource-group <resource-group> \
--location <location> \
--sku B1 \
--is-linux
# Create Web App
az webapp create \
--name <app-name> \
--resource-group <resource-group> \
--plan <plan-name> \
--runtime "<runtime>"
# Deploy code (zip deploy)
az webapp deploy \
--name <app-name> \
--resource-group <resource-group> \
--src-path <path-to-zip> \
--type zip
Runtime values by language:
- Node.js:
"NODE:18-lts","NODE:20-lts" - Python:
"PYTHON:3.11","PYTHON:3.12" - .NET:
"DOTNETCORE:8.0" - Java:
"JAVA:17-java17"
Smart defaults:
- Plan SKU:
B1for dev/test,P1v3for production - Always use Linux (
--is-linux) unless .NET Framework required
See App Service Guide for configuration options.
Phase 5: Multi-Service Deployment (azd + IaC)
When multiple services or infrastructure dependencies are detected, recommend Azure Developer CLI with Infrastructure as Code.
When to Use azd
- Multiple deployable components (frontend + API + functions)
- Needs database, cache, storage, or messaging services
- Requires consistent environments (dev, staging, production)
- Team collaboration with reproducible infrastructure
Initialize azd Project
# Initialize from scratch
azd init
# Or use a template
azd init --template <template-name>
Project Structure
project/
├── azure.yaml # azd configuration
├── infra/
│ ├── main.bicep # Main infrastructure
│ ├── main.parameters.json
│ └── modules/ # Reusable modules
├── src/
│ ├── web/ # Frontend
│ └── api/ # Backend
Deploy with azd
# Provision infrastructure + deploy code
azd up
# Or separately:
azd provision # Create infrastructure
azd deploy # Deploy application code
# Manage environments
azd env new staging
azd env select staging
azd up
See Multi-Service Guide for azure.yaml configuration. See Azure Verified Modules for Bicep module reference.
Troubleshooting Quick Reference
Common Issues
"Not logged in" errors:
az login
az account set --subscription "<name>"
"Resource group not found":
az group create --name <name> --location <location>
SWA deployment fails:
- Check build output directory is correct
- Verify deployment token is valid
- Ensure
staticwebapp.config.jsonis properly formatted
Functions deployment fails:
- Verify
host.jsonexists - Check runtime version matches function app configuration
- Ensure storage account is accessible
App Service deployment fails:
- Verify runtime matches application
- Check startup command if using custom entry point
- Review deployment logs:
az webapp log tail --name <app> --resource-group <rg>
See Troubleshooting Guide for detailed solutions.
Reference Files
Load these guides as needed for detailed information:
- 📦 App Service Guide - Full App Service deployment reference
- ⚡ Azure Functions Guide - Functions deployment and configuration
- 🌐 Static Web Apps Guide - SWA deployment and configuration
- 🖥️ Local Preview Guide - Local development setup
- 🏗️ Multi-Service Guide - azd and IaC patterns
- 📚 Azure Verified Modules - Bicep module reference
- 🔧 Troubleshooting Guide - Common issues and fixes
- 📋 Common Patterns - Shared commands (DRY reference)
Converted and distributed by TomeVault — claim your Tome and manage your conversions.