azure-deployment-operations
Standardized production deployment configurations for Azure services, covering SWA, containerized apps, and custom domains.
Install
mkdir -p .claude/skills/azure-deployment-operations && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/10541" && unzip -o skill.zip -d .claude/skills/azure-deployment-operations && rm skill.zipInstalls to .claude/skills/azure-deployment-operations
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Production deployment patterns for Azure Static Web Apps, Container Apps, App Service, and infrastructureKey capabilities
- →Deploy Azure Static Web Apps
- →Configure Container Apps health probes
- →Manage App Service staging slots
- →Implement rate limiting strategies
- →Execute infrastructure inventory
How it works
Uses Azure CLI commands and Bicep templates to manage resources and deployment pipelines. It enforces specific flags like --env production for SWA and staging slots for App Service.
Inputs & outputs
When to use azure-deployment-operations
- →Deploying to Azure SWA
- →Configuring Container Apps
- →Setting up production environments
About this skill
Azure Deployment Operations
Battle-tested patterns for deploying and operating Azure services in production.
Scope: Inheritable skill. Covers SWA, Container Apps, App Service, security posture, rate limiting, production checklists, and multi-subscription management.
Azure Static Web Apps (SWA)
Environment Deployment
SWA defaults to preview environments. Always specify production explicitly:
# Anti-pattern: deploys to preview environment
swa deploy
# Correct: explicitly target production
swa deploy --env production
Rule: Every SWA deployment command in CI/CD and scripts MUST include --env production unless creating a preview intentionally.
Custom Domain Registration
Custom domains require a two-step process:
| Step | Action | Validates |
|---|---|---|
| 1. CNAME record | Point domain to SWA default hostname | DNS ownership |
| 2. Hostname registration | az staticwebapp hostname set | Azure binding |
Common error: Adding CNAME but forgetting hostname registration. Both steps are required.
SWA Configuration
{
"navigationFallback": {
"rewrite": "/index.html",
"exclude": ["/api/*", "/assets/*"]
},
"routes": [
{ "route": "/api/*", "allowedRoles": ["authenticated"] }
],
"globalHeaders": {
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "DENY"
}
}
Azure Container Apps
Health Probe Configuration
Container Apps health probes have specific threshold ranges:
| Parameter | Min | Max | Recommended |
|---|---|---|---|
failureThreshold | 1 | 48 | 3-5 for liveness, 10-30 for startup |
periodSeconds | 1 | 240 | 10 for liveness, 5 for startup |
initialDelaySeconds | 0 | 60 | 0 for liveness (use startup probe instead) |
timeoutSeconds | 1 | 240 | 5 |
Pattern: Use a startup probe with high failure threshold (30) for slow-starting apps instead of a high initialDelaySeconds on the liveness probe.
Container Apps Deployment
# Update with new image
az containerapp update \
--name myapp \
--resource-group myrg \
--image myregistry.azurecr.io/myapp:v1.2.3
# Scale configuration
az containerapp update \
--name myapp \
--resource-group myrg \
--min-replicas 1 \
--max-replicas 10
Azure App Service
11-Step Deployment Pipeline
Typical App Service deployment takes ~7 minutes:
| Step | Duration | Action |
|---|---|---|
| 1 | 5s | Authenticate to Azure |
| 2 | 10s | Validate resource group exists |
| 3 | 30s | Build application |
| 4 | 15s | Run tests |
| 5 | 20s | Package artifacts |
| 6 | 10s | Upload to staging slot |
| 7 | 60s | Warm up staging slot |
| 8 | 5s | Run smoke tests on staging |
| 9 | 30s | Swap staging → production |
| 10 | 10s | Validate production health |
| 11 | 5s | Tag release in source control |
Rule: Always use staging slots for zero-downtime deployment. Direct-to-production deployments cause cold-start downtime.
Production Readiness Checklist
| Category | Requirement | Why |
|---|---|---|
| Compute | P1v3 or higher | Burstable tiers have CPU throttling |
| Networking | VNet integration | Isolate from public internet |
| Data | Private endpoints for storage/DB | No public connection strings |
| Identity | Managed identity (no connection strings) | Eliminates secret rotation |
| Monitoring | Application Insights enabled | Observability |
| Scaling | Auto-scale rules configured | Handle load spikes |
| Backup | Automated backup policy | Disaster recovery |
| SSL | Custom domain + managed certificate | Trust and security |
Security Posture Assessment
Pass/Fail Matrix
Use a matrix to track security controls across all resources:
| Control | App Service | SQL DB | Storage | Key Vault |
|---|---|---|---|---|
| Managed Identity | ✅ | ✅ | ✅ | ✅ |
| Private Endpoint | ✅ | ✅ | ❌ | ✅ |
| Diagnostic Logs | ✅ | ❌ | ✅ | ✅ |
| RBAC (no keys) | ✅ | ✅ | ❌ | ✅ |
| Encryption at Rest | ✅ | ✅ | ✅ | ✅ |
Rule: Any ❌ in the matrix is a tracked remediation item with a priority (P0-P3) and SLA.
Rate Limiting
Spread vs. Burst
For API calls and deployment operations:
| Strategy | Pattern | Use When |
|---|---|---|
| Spread | 10 calls/sec evenly spaced | Sustained throughput |
| Burst | 100 calls then wait | Quick batch operations |
Rule: Prefer spread over burst for production workloads. Azure APIs throttle based on request rate, and burst patterns hit throttle limits earlier than spread patterns with the same total throughput.
Retry Pattern
async function withRetry<T>(
fn: () => Promise<T>,
maxRetries = 3,
baseDelay = 1000
): Promise<T> {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
return await fn();
} catch (err: any) {
if (attempt === maxRetries) throw err;
if (err.statusCode === 429) {
// Use Retry-After header if available
const delay = err.headers?.['retry-after']
? parseInt(err.headers['retry-after']) * 1000
: baseDelay * Math.pow(2, attempt);
await new Promise(r => setTimeout(r, delay));
} else {
throw err; // Don't retry non-throttle errors
}
}
}
throw new Error('Unreachable');
}
Multi-Subscription Management
Folder Organization
For organizations with multiple Azure subscriptions:
azure/
├── production/
│ ├── main.bicep
│ └── parameters.prod.json
├── staging/
│ ├── main.bicep
│ └── parameters.staging.json
├── development/
│ └── parameters.dev.json
└── shared/
├── modules/ # Shared Bicep modules
└── policies/ # Azure Policy definitions
Resource Inventory
Before any infrastructure changes, document what exists:
# List all resources in subscription
az resource list --subscription "My Subscription" \
--output table \
--query "[].{Name:name, Type:type, RG:resourceGroup, Location:location}"
# Export to JSON for diff tracking
az resource list --subscription "My Subscription" -o json > inventory.json
Subscription Documentation Template
Each subscription should have a living document with:
| Section | Content |
|---|---|
| Purpose | What this subscription is for |
| Owner | Team/person responsible |
| Budget | Monthly spend limit and alerts |
| Resources | Link to inventory command output |
| Access | RBAC assignments and justification |
| Networking | VNet topology, peering, DNS zones |
Known Gotchas
Mail.Send on Corporate Tenants
Microsoft 365 corporate tenants often block Mail.Send permission for third-party apps. If your app needs to send email:
- Check tenant admin consent policies first
- Consider
SendMailvia Graph with delegated (not application) permissions - Have a fallback (SMTP, SendGrid) for blocked tenants
- Document the limitation clearly for users
Azure CLI Context
# Always verify which subscription is active
az account show --query "{Name:name, Id:id}" -o table
# Set explicitly before operations
az account set --subscription "Target Subscription"
Rule: Never assume the correct subscription is active. Always verify or set explicitly in scripts.
Infrastructure as Code
Bicep Best Practices for Deployment
| Practice | Why |
|---|---|
| Use modules for reusable components | DRY principle |
| Parameters file per environment | Environment isolation |
@secure() decorator for secrets | Prevents logging |
existing keyword for references | No accidental recreation |
| What-if before deploy | Catch unintended changes |
# Always preview changes before deploying
az deployment group what-if \
--resource-group myrg \
--template-file main.bicep \
--parameters @parameters.prod.json
When not to use it
- →Direct-to-production deployments
- →Assuming active subscription context
Prerequisites
Limitations
- →Requires explicit subscription setting
- →SWA preview environment default behavior
How it compares
Provides specific production-hardened patterns and rules rather than generic deployment scripts.
Compared to similar skills
azure-deployment-operations side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| azure-deployment-operations (this skill) | 0 | 4mo | Review | Intermediate |
| ado-create-wif | 0 | 3mo | Review | Intermediate |
| azure-functions | 10 | 5mo | Review | Intermediate |
| azure-deployment-preflight | 7 | 6mo | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by fabioc-aloha
View all by fabioc-aloha →You might also like
ado-create-wif
alexander-kastil
Automate creation of Azure DevOps workload identity federation service connections. Use this when users need to create or delete Azure service connections with workload identity federation.
azure-functions
aj-geddes
Create serverless functions on Azure with triggers, bindings, authentication, and monitoring. Use for event-driven computing without managing infrastructure.
azure-deployment-preflight
github
Performs comprehensive preflight validation of Bicep deployments to Azure, including template syntax validation, what-if analysis, and permission checks. Use this skill before any deployment to Azure to preview changes, identify potential issues, and ensure the deployment will succeed. Activate when users mention deploying to Azure, validating Bicep files, checking deployment permissions, previewing infrastructure changes, running what-if, or preparing for azd provision.
skypilot-multi-cloud-orchestration
davila7
Multi-cloud orchestration for ML workloads with automatic cost optimization. Use when you need to run training or batch jobs across multiple clouds, leverage spot instances with auto-recovery, or optimize GPU costs across providers.
aspire
davidortinau
**WORKFLOW SKILL** - Orchestrates Aspire applications using the Aspire CLI and MCP tools for running, debugging, deploying, and managing distributed apps. USE FOR: aspire run, aspire stop, aspire deploy, start aspire app, aspire describe, list aspire integrations, debug aspire issues, view aspire lo
azure-observability-baseline
Insightpulseai
Wire Azure-native monitoring for Odoo on ACA with Application Insights, Log Analytics, and alert rules