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://mp-staging.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/windows/automation/validation-and-cutover.md
Validation and Cutover
Step 6: Post-Upgrade Validation
Enter Step 6 only after Step 5a is complete or skipped because target-generated keys were selected. If key preservation was selected but any host or HTTP-function key failed verification, stop.
Confirm the source app is still healthy
Before touching the new app, verify the source is still serving traffic and processing events as expected. The cutover that follows assumes the source remains the system of record until each trigger is flipped over individually.
az functionapp show --name <SOURCE_APP_NAME> --resource-group <SOURCE_RESOURCE_GROUP> --query "{name:name, state:state, hostNames:hostNames[0]}" -o tableExpected: state is Running. If anything looks off (state is Stopped, hostname is null, etc.), pause the cutover and investigate before proceeding — the cleanup steps later in this phase assume the source app is healthy.
Smoke Test (run this first)
Get the new app's default hostname:
az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> --query defaultHostName -o tsv⚠️ Flex propagation: On a freshly-created Flex Consumption app,
defaultHostNamefromaz functionapp showcan briefly return null while the platform finishes provisioning. If the command above returns empty, fall back to:az functionapp list --resource-group <RESOURCE_GROUP> --query "[?name=='<NEW_APP_NAME>'].defaultHostName | [0]" -o tsvThe list endpoint populates the field as soon as the app exists.
Confirm the host is reachable (substitute <HOSTNAME> with the value above):
curl -s -o /dev/null -w "%{http_code}\n" "https://<HOSTNAME>"Expected: a 2xx, 401, or 404 (the host is up). If the response is 403 Ip Forbidden and the target has an intentional deny-by-default policy, record the HTTP smoke test as deferred until it can run from an already allowed client. Confirm the app and functions through the ARM commands from Step 5; do not add or relax access rules automatically.
If you get 503 or a connection refusal, the app failed to start — check logs:
az functionapp log tail --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP>💡 On PowerShell 7+,
curlresolves to the realcurl.exe(the legacyInvoke-WebRequestalias was removed in 7.x). Confirm withGet-Command curlif unsure.
Verify Plan
az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> --query serverFarmIdTest HTTP Endpoints
Test an individual HTTP trigger (substitute <HOSTNAME> and <FUNCTION_NAME>):
curl -s -o /dev/null -w "%{http_code}\n" "https://<HOSTNAME>/api/<FUNCTION_NAME>"For a function that requires a function or host key, use the selected target key in the x-functions-key header without printing or persisting it. If target-generated keys were selected, don't treat HTTP cutover as complete until every key-dependent client or workflow has been updated and validated.
Validate Built-in Authentication
Step 4f.auth must be complete or skipped because source Easy Auth was disabled before entering Step 6. If it is deferred or blocked, do not deploy code or run target HTTP checks.
If Step 4f.auth was completed, test an endpoint that requires authentication and confirm its anonymous behavior matches the verified target configuration: 401/403 for rejection or the expected provider redirect. Then complete one authenticated request using a test identity and confirm the expected authorization result without recording tokens.
Per-Function Cutover (event-driven triggers)
For non-hyphenated functions effectively disabled and verified after Step 5, handle them one at a time. Never enable a production-connected target function before approval to disable its source counterpart; otherwise both apps can process the same event source while approval is pending. If Step 4j disablement was declined, report that controlled cutover protection was not established and validate for concurrent processing before any source change.
Do not use the target app-setting disable/enable transaction below for a function whose name contains -; Linux does not support disabling that name through AzureWebJobs.<FUNCTION_NAME>.Disabled. Use isolated target dependencies or the source-first deployment cutover recorded in Step 4j. If a hyphenated function was deployed active with explicit approval, validate for concurrent processing and do not claim controlled per-function cutover.
⚠️ Per-trigger mitigations apply first: Even with this controlled per-function cutover, the Trigger Migration Risks table lists per-trigger-type prerequisites — new consumer group for Event Hubs, dedicated lease container for Cosmos DB, new event subscription for blob/EventGrid, etc. Apply the relevant mitigation before flipping the disable flag for the corresponding function.
For Blob/Event Grid triggers, check that the target's current networking configuration still permits the agreed inbound delivery path before enabling the target. Do not generate test events, create test blobs, or provision test resources for these triggers. Configuration checks, a healthy HTTP endpoint, and a successfully created event subscription do not prove runtime delivery. Use existing execution telemetry or user-provided validation evidence; otherwise report runtime delivery as unverified and leave trigger validation incomplete. Do not relax network restrictions automatically.
For each event-driven function, choose one of these paths:
Path A: Isolated Target Validation
Point the target binding at an isolated test queue, consumer group, lease container, event subscription, or equivalent resource. For a non-hyphenated function, enable and validate the target, then disable it again until production cutover is approved. A hyphenated function is already active after deployment; validate it only against isolated dependencies and do not restore its production binding until the transaction below is approved.
Hyphenated-Function Production Cutover
For a hyphenated function already validated against isolated dependencies, use ask_user for a transaction that:
Stops the entire target app and verifies it is stopped.
Disables the corresponding function on the Windows source and verifies
isDisabled=true.Replaces the target's isolated binding configuration with the production configuration.
Starts the target app and validates one normal execution cycle.
On failure, stops the target, restores its isolated binding configuration, re-enables and verifies the source function, and reports the failure.
Explain that stopping the Flex app affects every target function and that events may backlog during this transaction. Approval applies only to the named function, binding changes, and this cutover attempt.
Path B: Production Cutover
Use this path only for target function names that do not contain -.
Use
ask_userbefore enabling the target or changing the source. Request approval for the complete function-specific transaction, including conditional rollback:May I cut over
<FUNCTION_NAME>by disabling it on source app<SOURCE_APP_NAME>, verifying the source is disabled, and then enabling it on target app<NEW_APP_NAME>? This may briefly pause processing and allow events to backlog. If target activation or validation fails, I will disable the target and restore the source function. This approval applies only to this function and this cutover attempt.Do not continue unless the user approves. If approval is declined, leave the source enabled and target disabled. Approval for one function does not cover another function or a later retry.
Disable the source function and suppress command output because app-setting responses can contain secrets:
az functionapp config appsettings set --name <SOURCE_APP_NAME> --resource-group <SOURCE_RESOURCE_GROUP> --settings "AzureWebJobs.<FUNCTION_NAME>.Disabled=true" --output noneVerify the source reports the function as disabled before enabling the target:
az functionapp function list --name <SOURCE_APP_NAME> --resource-group <SOURCE_RESOURCE_GROUP> --query "[?config.name=='<FUNCTION_NAME>'].{name:config.name,disabled:isDisabled}" -o tableEnable the target:
az functionapp config appsettings set --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> --settings "AzureWebJobs.<FUNCTION_NAME>.Disabled=false" --output noneVerify target processing after one full execution cycle or controlled test event:
requests | where cloud_RoleName == "<NEW_APP_NAME>" | where operation_Name == "<FUNCTION_NAME>" | where timestamp > ago(15m) | summarize count(), avg(duration), countif(success == false) by bin(timestamp, 1m)If target activation or validation fails, use the rollback authorized in step 1: disable and verify the target first, then re-enable and verify the source. Report the failure and obtain new approval before another cutover attempt.
⚠️ Pause versus duplication: Source-first cutover can briefly delay processing or miss a timer occurrence, but queued/event-stream work normally remains available as backlog. This is safer than enabling both production-connected functions concurrently, which can cause duplicate or competing processing.
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 descRequirements 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.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-upgrade.zip