Azure Upgrade
MicrosoftOfficialCreated by Microsoft
- Skill
- Workflow
- Cloud and DevOps
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Azure Upgrade provides a structured, automated approach to upgrading Azure resources and modernizing source code dependencies. It supports complex transitions such as moving Azure Functions from Consumption to Flex Consumption, migrating various Redis cache tiers to Azure Managed Redis, and refactoring legacy Java applications from the deprecated com.microsoft.azure SDKs to the modern com.azure ecosystem. The skill enforces safety through pre-migration assessments, explicit user confirmation for destructive actions, and idempotent automation scripts, ensuring that original workloads remain intact until the new configuration is fully validated.
What it does
- Assesses Azure workloads for upgrade readiness across plans, tiers, and SKUs.
- Automates the migration of Azure Functions from Consumption to Flex Consumption.
- Modernizes legacy Java applications by replacing deprecated com.microsoft.azure SDKs with modern com.azure equivalents.
- Facilitates the migration of Azure Cache for Redis (ACR/ACRE) to Azure Managed Redis (AMR).
- Generates detailed migration status reports and maintains artifact isolation.
- Provides a safe, gated workflow requiring user approval for all resource creation and configuration changes.
When to use it
- When you need to upgrade your Azure Functions hosting plan to a more performant or cost-effective tier.
- When your Java project relies on deprecated Azure SDKs and requires modernization to supported libraries.
- When migrating existing Redis cache instances to the newer Azure Managed Redis service.
- When you need a repeatable, documented process for changing Azure resource SKUs or hosting plans.
Advantages
- Reduces manual effort and risk during complex infrastructure and code migrations.
- Ensures safety by requiring explicit user approval for all destructive or state-changing operations.
- Maintains high availability by keeping original resources running until the new ones are validated.
- Promotes security best practices by encouraging the use of managed identities over connection strings.
- Provides clear, step-by-step guidance for both infrastructure upgrades and source-code refactoring.
Usage examples
- “Upgrade my function app from Consumption to Flex Consumption”
- The agent will identify the current plan, assess compatibility, and guide you through the migration steps to the Flex Consumption plan.
- “Migrate my Java project from com.microsoft.azure to com.azure”
- The agent will inventory legacy dependencies, provide a migration plan, and assist in updating your build files and source code imports.
- “Migrate my Redis cache to AMR”
- The agent will assess your current Redis configuration and execute the migration path to Azure Managed Redis.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/microsoft/azure-upgrade/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip azure-upgrade.zip -d .agents/skills
Documentation by Microsoft
Azure Upgrade
This skill handles assessment and automated upgrades of existing Azure workloads from one Azure service, hosting plan, or SKU to another — all within Azure. This includes plan/tier upgrades (e.g. Consumption → Flex Consumption), cross-service migrations (e.g. App Service → Container Apps), and SKU changes. It also covers Azure SDK for Java source-code modernization (e.g. legacy Java
com.microsoft.azure.*→ moderncom.azure.*). This is NOT for cross-cloud migration — useazure-cloud-migratefor that.
Triggers
| User Intent | Example Prompts |
|---|---|
| Upgrade Azure Functions plan | "Upgrade my function app from Consumption to Flex Consumption" |
| Discover Functions upgrade candidates | "What Consumption Function Apps do I have that can be upgraded to Flex Consumption?" |
| Change hosting tier | "Move my function app to a better plan" |
| Assess upgrade readiness | "Is my function app ready for Flex Consumption?" |
| Automate plan migration | "Automate the steps to upgrade my Functions plan" |
| Modernize legacy Azure Java SDK | "Migrate legacy Azure SDKs for Java", "Upgrade legacy Azure Java SDK", "Migrate my Java project from com.microsoft.azure to com.azure" |
| Migrate Azure Cache for Redis (ACR/OSS) to Azure Managed Redis (AMR) | "Migrate my Redis cache to AMR", "ACR to AMR", "OSS to AMR", "Upgrade my Premium P2 cache to Managed Redis", "Pick an AMR SKU", "Convert my Redis IaC template to AMR" |
| Migrate Azure Cache for Redis Enterprise (ACRE) to Azure Managed Redis (AMR) | "Migrate my Enterprise_E10 cache to AMR", "ACRE to AMR", "Update my ACRE IaC template for AMR", "Migrate EnterpriseFlash to AMR", "Migrate my geo-replicated Enterprise Redis" |
Rules
Follow phases in order. Skip or defer work only when the selected scenario explicitly permits it, and record the reason in the migration status.
Generate an assessment before any upgrade operations
Load the scenario reference and follow its rules
Use
mcp_azure_mcp_get_azure_bestpracticesandmcp_azure_mcp_documentationMCP toolsDestructive actions require
ask_user— global-rulesAlways confirm the target plan/SKU with the user before proceeding
Propose a name for any new resource (default:
<source>-<target-suffix>, e.g.<source>-flexfor Flex Consumption migrations) and announce the proposed name to the user before creating it so they can override without a blocking prompt. Same pattern applies to other newly-created resources (storage accounts, App Insights, etc.) — see the scenario reference for service-specific defaults.Windows Consumption → Flex source-change gate: treat the source app as read-only by default. Immediately before every command that would change its settings, triggers, state, deployment, bindings, or existence, use
ask_userto describe the exact change and obtain explicit approval. Approval is action-specific and cannot be reused for later source changes.Never delete or stop the original app without explicit user confirmation
Keep approval-gated workflows moving: after each completed step, immediately perform the next read-only preflight. If the next action requires approval, invoke
ask_userin the same turn — never stop after merely announcing the next step and wait for the user to re-engage.All automation scripts must be idempotent and resumable
Upgrade Scenarios
| Source | Target | Reference |
|---|---|---|
| Azure Functions Consumption Plan (Linux) | Azure Functions Flex Consumption Plan | workflow.md |
| Azure Functions Consumption Plan (Windows) | Azure Functions Flex Consumption Plan | workflow.md |
Legacy Azure Java SDK (com.microsoft.azure.*) | Modern Azure Java SDK (com.azure.*) | languages/java/README.md |
| Azure Cache for Redis (ACR/OSS) Basic/Standard/Premium | Azure Managed Redis (AMR) | services/redis/redis-to-amr.md |
| Azure Cache for Redis Enterprise (ACRE) / Enterprise Flash | Azure Managed Redis (AMR) | services/redis/redis-to-amr.md |
Functions Consumption-to-Flex routing: For a named app, inspect its Azure platform and load only the matching Linux or Windows workflow. For subscription-wide discovery, evaluate both platforms: use
az functionapp flex-migration listfor Linux and the Windows workflow's manual discovery and compatibility checks for Windows. Label Windows results as candidates until per-app code compatibility is assessed.
SDK upgrade scenarios (e.g. Java legacy → modern) run a source-code modernization flow that is distinct from Azure service/plan/SKU upgrades: follow the scenario reference, not the Steps below.
No matching scenario? Use
mcp_azure_mcp_documentationandmcp_azure_mcp_get_azure_bestpracticestools to research the upgrade path.
MCP Tools
| Tool | Purpose |
|---|---|
mcp_azure_mcp_get_azure_bestpractices | Get Azure best practices for the target service |
mcp_azure_mcp_documentation | Look up Azure documentation for upgrade scenarios |
mcp_azure_mcp_appservice | Query App Service and Functions plan details |
mcp_azure_mcp_applicationinsights | Verify monitoring configuration |
Steps
Identify — Determine the source and target Azure plans/SKUs. Ask user to confirm.
Assess — Analyze existing app for upgrade readiness → load scenario reference (e.g., workflow.md)
Pre-migrate — Collect settings, identities, configs from the existing app
Upgrade — Execute the automated upgrade steps (create new resources, migrate settings, deploy code)
Validate — Use the checks defined by the selected scenario: verify target resource state, applicable HTTP endpoints and non-HTTP triggers, and monitoring. If access restrictions or unavailable test resources prevent execution, record validation as deferred — never relax security automatically or report functional success.
Ask User — Offer performance validation and IaC updates. Offer source cleanup only when the selected scenario confirms production cutover and all cleanup prerequisites are complete.
Hand off to
azure-validatefor deep validation orazure-deployfor CI/CD setup
Track progress in <UPGRADE_DIR>/upgrade-status.md — see Artifact Output Policy for path resolution.
References
Functions
Redis
Redis (ACR or ACRE) to AMR Migration — routes to dedicated amr-migration-skill (ACR/OSS) or acre-to-amr-migration-skill (Enterprise)
Java SDK Migration Templates
Next
After upgrade is validated, hand off to:
azure-validate— for thorough post-upgrade validationazure-deploy— if the user wants to set up CI/CD for the new app
Files
- ATTRIBUTION.mdAdded by AutoGineer971 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md8.7 KiB
- references/global-rules.md4.5 KiB
- references/languages/java/INSTRUCTION.md11.3 KiB
- references/languages/java/README.md3.0 KiB
- references/languages/java/bom-migration/bom-gradle-settings.md6.7 KiB
- references/languages/java/bom-migration/bom-gradle-toml.md2.7 KiB
- references/languages/java/bom-migration/bom-gradle.md5.1 KiB
- references/languages/java/bom-migration/bom-maven.md4.7 KiB
- references/languages/java/bom-migration/bom-migration.md4.2 KiB
- references/languages/java/bom-migration/bom-validation.md1.5 KiB
- references/languages/java/package-specific/com.microsoft.azure.eventprocessorhost.md5.5 KiB
- references/languages/java/package-specific/com.microsoft.azure.management.md9.5 KiB
- references/languages/java/rules/efficiency.md265 B
- references/languages/java/rules/execution-guidelines.md1.0 KiB
- references/languages/java/rules/review-code-changes.md541 B
- references/languages/java/rules/troubleshooting.md2.5 KiB
- references/languages/java/rules/upgrade-strategy.md1.4 KiB
- references/languages/java/rules/upgrade-success-criteria.md686 B
- references/languages/java/scripts/upgrade_bom.pyScript19.6 KiB
- references/languages/java/templates/PLAN_TEMPLATE.md9.4 KiB
- references/languages/java/templates/PROGRESS_TEMPLATE.md9.1 KiB
- references/languages/java/templates/SUMMARY_TEMPLATE.md8.6 KiB
- references/languages/java/workflow/phase-1-precheck.md2.3 KiB
- references/languages/java/workflow/phase-2-plan.md2.9 KiB
- references/languages/java/workflow/phase-3-execute.md2.4 KiB
- references/languages/java/workflow/phase-4-summarize.md1.1 KiB
- references/services/functions/consumption-to-flex/linux/assessment.md4.6 KiB
- references/services/functions/consumption-to-flex/linux/automation.md17.3 KiB
- references/services/functions/consumption-to-flex/linux/workflow.md11.6 KiB
- references/services/functions/consumption-to-flex/windows/assessment.md6.8 KiB
- references/services/functions/consumption-to-flex/windows/automation.md4.1 KiB
- references/services/functions/consumption-to-flex/windows/automation/access-key-copy.md2.5 KiB
- references/services/functions/consumption-to-flex/windows/automation/access-key-strategy.md2.1 KiB
- references/services/functions/consumption-to-flex/windows/automation/app-creation.md16.6 KiB
- references/services/functions/consumption-to-flex/windows/automation/app-settings.md12.0 KiB
- references/services/functions/consumption-to-flex/windows/automation/built-in-authentication.md3.3 KiB
- references/services/functions/consumption-to-flex/windows/automation/cleanup-and-rollback.md3.2 KiB
- references/services/functions/consumption-to-flex/windows/automation/code-deployment.md8.6 KiB
- references/services/functions/consumption-to-flex/windows/automation/configuration-inventory.md7.2 KiB
- references/services/functions/consumption-to-flex/windows/automation/deployment-package.md6.0 KiB
- references/services/functions/consumption-to-flex/windows/automation/discovery-and-assessment.md9.1 KiB
- references/services/functions/consumption-to-flex/windows/automation/networking-and-storage.md3.9 KiB
- references/services/functions/consumption-to-flex/windows/automation/site-and-identity.md5.0 KiB
- references/services/functions/consumption-to-flex/windows/automation/trigger-safety-and-monitoring.md11.8 KiB
- references/services/functions/consumption-to-flex/windows/automation/validation-and-cutover.md9.7 KiB
- references/services/functions/consumption-to-flex/windows/dependency-scan.md13.3 KiB
- references/services/functions/consumption-to-flex/windows/progress-tracking.md5.2 KiB
- references/services/functions/consumption-to-flex/windows/workflow.md27.9 KiB
- references/services/redis/redis-to-amr.md7.5 KiB
- references/workflow-details.md2.1 KiB
references/services/functions/consumption-to-flex/linux/automation.md
Automation: Consumption to Flex Consumption Upgrade
These are the Azure CLI scripts to automate the upgrade from Linux Consumption plan to Flex Consumption plan. All scripts use
bashsyntax compatible with Azure Cloud Shell. For PowerShell, adapt accordingly.Source docs: Linux migration guide
Prerequisites
# Verify required tools
az version --query '"azure-cli"' -o tsv
jq --version
# Install resource-graph extension
az extension add --name resource-graph
# Login and set subscription
az login
az account set --subscription <SUBSCRIPTION_ID>If az or jq is unavailable, stop and provide the relevant installation guidance. If the Azure CLI version is lower than 2.77.0, stop and require an upgrade before running migration commands.
Step 1: Identify Candidate Apps
# List all Linux Consumption apps with eligibility status
az functionapp flex-migration listThis returns two arrays:
eligible_apps— apps that can be migrated to Flex Consumptionineligible_apps— apps with specific reasons why not
The output includes app name, resource group, location, and runtime stack for each app.
Step 2: Assessment Checks
Set variables for your app:
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>2a. Confirm Region Compatibility
# List all regions where Flex Consumption is available
az functionapp list-flexconsumption-locations --query "sort_by(@, &name)[].{Region:name}" -o table2b. Verify Language Stack Compatibility
Supported stacks: dotnet-isolated, node, java, python, powershell, custom.
Not supported: dotnet (in-process) — must migrate to isolated first.
2c. Verify Stack Version Compatibility
# Check supported versions for a specific runtime in a specific region
az functionapp list-flexconsumption-runtimes --location <REGION> --runtime <LANGUAGE_STACK> \
--query '[].{version:version}' -o tsvReplace <REGION> with the app's region and <LANGUAGE_STACK> with one of: dotnet-isolated, java, node, powershell, python.
2d. Check Deployment Slots
# List any deployment slots
az functionapp deployment slot list --name $appName --resource-group $rgName --output tableIf this returns entries, the app has slots. Flex Consumption does NOT support slots — plan accordingly.
2e. Check TLS/SSL Certificates
# List certificates available to the app
az webapp config ssl list --resource-group $rgNameIf this returns output, determine whether the source app actually uses those certificates. Plan to re-add used certificates after migration with the documented site-scoped certificate process, verify the per-app limits, and update certificate-loading code to use the documented Linux file paths.
2f. Check Blob Storage Triggers
# Find blob triggers NOT using EventGrid source
az functionapp function list --name $appName --resource-group $rgName \
--query "[?config.bindings[0].type=='blobTrigger' && config.bindings[0].source!='EventGrid'].{Function:name,TriggerType:config.bindings[0].type,Source:config.bindings[0].source}" \
--output tableIf this returns rows, convert those blob triggers from LogsAndContainerScan to EventGrid before upgrading.
Step 3: Pre-Migration — Collect Settings
3a. Collect App Settings
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
# Inventory setting names only; never display or persist general setting values
az functionapp config appsettings list --name $appName --resource-group $rgName \
--query "[].name" -o tsv3b. Collect Application Configurations
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
echo "Getting commonly used site settings..."
az functionapp config show --name $appName --resource-group $rgName \
--query "{http20Enabled:http20Enabled, httpsOnly:httpsOnly, minTlsVersion:minTlsVersion, \
minTlsCipherSuite:minTlsCipherSuite, clientCertEnabled:clientCertEnabled, \
clientCertMode:clientCertMode, clientCertExclusionPaths:clientCertExclusionPaths}"
echo "Checking for SCM basic publishing credentials policies..."
az resource show --resource-group $rgName --name scm --namespace Microsoft.Web \
--resource-type basicPublishingCredentialsPolicies --parent sites/$appName --query properties
echo "Checking for the maximum scale-out limit configuration..."
az functionapp config appsettings list --name $appName --resource-group $rgName \
--query "[?name=='WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT'].value" -o tsv
echo "Checking for any file share mount configurations..."
az webapp config storage-account list --name $appName --resource-group $rgName
echo "Checking for any custom domains..."
az functionapp config hostname list --webapp-name $appName --resource-group $rgName \
--query "[?contains(name, 'azurewebsites.net')==\`false\`]" --output table
echo "Checking for any CORS settings..."
az functionapp cors show --name $appName --resource-group $rgName3c. Identify Managed Identities and Role Assignments
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
echo "Checking for a system-assigned managed identity..."
systemUserId=$(az functionapp identity show --name $appName --resource-group $rgName \
--query "principalId" -o tsv)
if [[ -n "$systemUserId" ]]; then
echo "System-assigned identity principal ID: $systemUserId"
echo "Checking for role assignments..."
az role assignment list --assignee $systemUserId --all
else
echo "No system-assigned identity found."
fi
echo "Checking for user-assigned managed identities..."
userIdentities=$(az functionapp identity show --name $appName --resource-group $rgName \
--query 'userAssignedIdentities' -o json)
if [[ "$userIdentities" != "{}" && "$userIdentities" != "null" ]]; then
echo "$userIdentities" | jq -c 'to_entries[]' | while read -r identity; do
echo "User-assigned identity: $(echo "$identity" | jq -r '.key' | sed 's|.*/userAssignedIdentities/||')"
echo "Checking for role assignments..."
az role assignment list --assignee $(echo "$identity" | jq -r '.value.principalId') --all --output json
echo
done
else
echo "No user-assigned identities found."
fi3d. Check Built-in Authentication
az webapp auth show --name $appName --resource-group $rgName3e. Review Inbound Access Restrictions
az functionapp config access-restriction show --name $appName --resource-group $rgName3f. Get Deployment Package (if needed)
Ideally your project files are in source control and you can redeploy from there. If not:
Check WEBSITE_RUN_FROM_PACKAGE
UPGRADE_DIR=<UPGRADE_DIR>
(
set -e
trap 'unset runFromPackage' EXIT
echo "Checking run-from-package configuration..."
runFromPackage=$(az functionapp config appsettings list --name $appName --resource-group $rgName \
--query "[?name=='WEBSITE_RUN_FROM_PACKAGE'].value | [0]" -o tsv)
if [[ "$runFromPackage" =~ ^https:// ]]; then
echo "Downloading the remote deployment package..."
curl --fail --location --silent --show-error --output "$UPGRADE_DIR/source-package.zip" "$runFromPackage"
echo "Downloaded the remote deployment package without displaying its URL."
elif [[ -n "$runFromPackage" ]]; then
echo "Linux Consumption requires WEBSITE_RUN_FROM_PACKAGE to be a remote URL; found an unsupported non-URL value." >&2
exit 1
else
echo "No run-from-package URL was detected; use the scm-releases fallback below or redeploy from source control."
fi
)If the remote package was downloaded, skip the storage download below. If no URL was configured, continue with the scm-releases fallback.
Download from scm-releases blob container
Linux Consumption apps store deployment packages in the scm-releases blob container (in squashfs format).
📁 The download below writes to
<UPGRADE_DIR>(default:.azure-upgrade/<source-app-name>/). See Artifact Output Policy. ResolveUPGRADE_DIRonce at session start and create the directory before running.
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
UPGRADE_DIR=<UPGRADE_DIR> # e.g. .azure-upgrade/$appName — see global-rules
(
set -e
trap 'unset AZURE_STORAGE_CONNECTION_STRING' EXIT
echo "Getting the storage account connection string..."
export AZURE_STORAGE_CONNECTION_STRING=$(az functionapp config appsettings list --name $appName --resource-group $rgName \
--query "[?name=='AzureWebJobsStorage'].value | [0]" -o tsv)
if [[ -z "$AZURE_STORAGE_CONNECTION_STRING" ]]; then
echo "AzureWebJobsStorage was not found." >&2
exit 1
fi
echo "Getting the package name..."
packageName=$(az storage blob list --container-name scm-releases --query "[0].name" -o tsv)
if [[ -z "$packageName" ]]; then
echo "No deployment package was found in the scm-releases container." >&2
exit 1
fi
echo "Downloading package: $packageName -> $UPGRADE_DIR/$packageName"
az storage blob download --container-name scm-releases --name "$packageName" \
--file "$UPGRADE_DIR/$packageName" --no-progress --output none
echo "Downloaded package: $packageName"
)💡 If your storage account is restricted to managed identity access only, you may need to grant your Azure account the
Storage Blob Data Readerrole.
Step 4: Create the Flex Consumption App
# Automated migration — creates new app and migrates most configurations
az functionapp flex-migration start \
--source-name <SOURCE_APP_NAME> \
--source-resource-group <SOURCE_RESOURCE_GROUP> \
--name <NEW_APP_NAME> \
--resource-group <RESOURCE_GROUP>Optional flags:
--storage-account <ACCOUNT>— use a different storage account--maximum-instance-count <COUNT>— set max scale-out instances--skip-access-restrictions— skip migrating IP access restrictions--skip-cors— skip migrating CORS settings--skip-hostnames— skip migrating custom domains--skip-managed-identities— skip migrating managed identity configurations--skip-storage-mount— skip migrating storage mount configurations
The command automatically:
Assesses your source app for Flex Consumption compatibility
Creates a new function app in the Flex Consumption plan
Migrates app settings, identity assignments, storage mounts, CORS, custom domains, and access restrictions
Verify Migration Results
# Verify new app exists and is configured
az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--query "{name:name, kind:kind, sku:properties.sku}" --output table
# Review migrated app-setting names without displaying values
az functionapp config appsettings list --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--query "[].name" -o tsv
# Check managed identity
az functionapp identity show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP>
# Check custom domains
az functionapp config hostname list --webapp-name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--output tableConfigure Items Not Auto-Migrated
The flex-migration start command handles most settings, but these may need manual configuration:
Built-in Authentication
# Recreate auth settings if your original app used Easy Auth
az webapp auth update --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--enabled true --action <AUTH_ACTION>Scale and Concurrency (if custom values needed)
# Set maximum scale-out (default: 100, range: 1-1000)
az functionapp scale config set --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--maximum-instance-count <MAX_SCALE_SETTING>⚠️ Reducing below 40 for HTTP apps can cause frequent request failures.
Step 5: Deploy Code
⚠️ Code is NOT automatically migrated. The new app is created with config only — you must deploy code separately.
ask_user: Choose Deployment Method
Present these options to the user:
Your new Flex Consumption app
<NEW_APP_NAME>has been created and configured. Now we need to deploy your function code. How would you like to proceed?
Update CI/CD pipeline — I'll help you update your Azure Pipelines or GitHub Actions workflow to target the new app
Deploy from local project — I'll run
func azure functionapp publish <NEW_APP_NAME>from your project directoryDeploy existing package — I'll deploy the package we downloaded earlier from the original app
Option A: Update CI/CD Pipeline (if user selects option 1)
Update your existing pipeline (Azure Pipelines or GitHub Actions) to target the new app name.
Option B: Deploy from Local Project (if user selects option 2)
Verify that Azure Functions Core Tools v4 is available:
func --versionIf func is unavailable or the reported major version is not 4, stop and provide the Core Tools installation guidance. Do not install or upgrade Core Tools without user approval; offer the pipeline or existing-package deployment options instead.
# From your project directory
func azure functionapp publish <NEW_APP_NAME>Option C: Deploy Existing Package (if user selects option 3)
# Deploy the zip package downloaded in Step 3 (resolves to <UPGRADE_DIR>/<PACKAGE_NAME>
# per the Artifact Output Policy in references/global-rules.md)
az functionapp deployment source config-zip --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--src <UPGRADE_DIR>/<PACKAGE_NAME>After Successful Deployment
Inform the user:
Code deployed! Next steps to consider:
The original app is still running — keep it as rollback for a few days
Update any clients/pipelines to point to the new URL
Enable HTTPS-only and managed identity on the new app for better security
When confident, you can delete the original app
Step 6: Post-Upgrade Validation
Smoke Test (run this first)
# Minimum viability check — confirm the app is reachable at all
DEFAULT_HOST=$(az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
--query "defaultHostName" -o tsv)
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "https://$DEFAULT_HOST")
echo "App responded with HTTP $HTTP_STATUS"
# Expected: 2xx or 401/404 (means the host is up).
# If 503 or connection refused → the app failed to start. Check logs:
# az functionapp log tail --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP>Verify Plan
az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> --query "serverFarmId"Test HTTP Endpoints
# Test an HTTP trigger function
curl -s -o /dev/null -w "%{http_code}" "https://$DEFAULT_HOST/api/<FUNCTION_NAME>"Performance Benchmarks (Application Insights KQL)
requests
| where timestamp > ago(1d)
| summarize percentiles(duration, 50, 95, 99) by bin(timestamp, 1h)
| render timechartCheck for Errors
traces
| where severityLevel == 3
| where cloud_RoleName == "<NEW_APP_NAME>"
| where timestamp > ago(1d)
| project timestamp, message, operation_Name, customDimensions
| order by timestamp descStep 7: Cleanup (Optional)
Do not offer source deletion until all of these conditions are verified:
all applicable production HTTP traffic, clients, DNS, and custom domains use the target;
every applicable production trigger has completed source-first cutover and target validation;
no production-readiness work remains deferred;
the source no longer processes production workloads.
If any condition is incomplete, retain the source for rollback and record cleanup as skipped or deferred.
Only after every condition passes, use ask_user immediately before deletion:
Production cutover is complete and source app
<SOURCE_APP_NAME>is no longer processing production workloads. May I permanently delete it? This is irreversible and removes the rollback app.
Run only after that explicit approval:
az functionapp delete --name <SOURCE_APP_NAME> --resource-group <SOURCE_RESOURCE_GROUP>💡 No rush. The Consumption plan only charges for actual usage, so keeping the old app (with triggers disabled) costs very little. We recommend keeping it for a few days/weeks.
Rollback
If the source app was previously stopped, use ask_user immediately before restarting it:
May I restart source app
<SOURCE_APP_NAME>in resource group<SOURCE_RESOURCE_GROUP>to restore processing?
Run only after that explicit approval:
az functionapp start --name <SOURCE_APP_NAME> --resource-group <SOURCE_RESOURCE_GROUP>Deleting the new Flex app requires a separate confirmation:
az functionapp delete --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP>Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
The author says: python3.10+
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/azure-skills/skills/azure-upgrade · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from .github/plugins/azure-skills/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- microsoft/azure-skills
AutoGineer is not affiliated with or endorsed by Microsoft or Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-upgrade.zip