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/workflow.md
Windows Consumption Plan to Flex Consumption Plan Upgrade
Source: Azure Functions Consumption Plan (Y1/Dynamic) on Windows Target: Azure Functions Flex Consumption Plan (FC1/FlexConsumption) Platform: Windows → Linux (Flex Consumption is Linux-based) Docs: Windows migration guide
⚠️ This is a Windows-to-Linux migration, not just a plan change. Flex Consumption is Linux-based. Apps with Windows-specific dependencies, in-process .NET, .NET Framework targeting, or Windows-RID deployment packages must be prepared before migration. See Known Limitations and Migration Blockers.
Before You Begin
Before running any discovery or Azure command, read the ordered ### Phase headings in this workflow and the ordered workflow-unit table in automation.md. Present a concise user-facing summary in that order, combining implementation units under their corresponding phases. Do not maintain or infer a separate hard-coded step list.
State that the source app remains read-only during assessment and replication. Every source-changing cutover, rollback, or cleanup action requires a separate, immediate approval. After presenting the plan, confirm the source app and Flex Consumption target plan with the user before continuing.
Why Upgrade?
Faster cold starts — always-ready instances mean functions respond more quickly
Better scaling — per-function scaling and concurrency controls
Virtual network support — connect to private networks and use private endpoints
Active investment — Flex Consumption is where new features land first
What to Expect
Your code may need changes — unlike the Linux Consumption → Flex migration, this is a Windows-to-Linux OS change. Apps with Windows-only NuGet packages, P/Invoke, COM interop, .NET Framework dependencies, Windows-RID deployment packages, or Windows-specific PowerShell modules require preparation.
Create a new Flex app alongside the existing one — test thoroughly on the new app before cutting over. This 2-app approach lets you discover Linux compatibility issues safely before committing.
The new app runs in the same resource group with access to the same dependencies.
Deployment model changes — Windows Consumption stores code on Azure Files (SMB); Flex uses immutable blob packages via One Deploy. Existing MSDeploy, FTP, and Kudu git push pipelines will not work after migration.
You control the timing — the original Windows app stays running until you are confident in the migrated app.
Source-App Safety
The source app is read-only throughout assessment and replication. Before any cutover, rollback, or cleanup command that changes the source app's settings, triggers, state, deployment, bindings, or existence, the skill must use ask_user to describe the exact action and obtain explicit approval. Approval is specific to that action and cannot be reused for later source changes.
Platform Notes
Recommended plan: Flex Consumption is the recommended serverless hosting plan for Azure Functions. Do not assume or state a Windows Consumption retirement date unless current Microsoft documentation publishes one.
OS change: Flex Consumption is Linux-based. Windows-compiled binaries, Windows-only NuGet packages, COM interop, P/Invoke to Windows APIs, and Windows PowerShell modules will not run without modification.
Deployment model: Windows Consumption uses Azure Files (SMB share via
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING/WEBSITE_CONTENTSHARE); Flex uses blob-based One Deploy (immutable zip packages in Azure Blob Storage).az functionapp flex-migrationdoes not support Windows — all migration steps use raw CLI commands (see automation.md).Elastic Premium alternative: Apps with hard Windows dependencies that cannot be removed can migrate to Elastic Premium on Windows instead of Flex Consumption. This is more expensive but changes the hosting plan without requiring an OS migration.
Prerequisites
Azure CLI v2.77.0+
resource-graphextension:az extension add --name resource-graphjqtool for JSON processingOwner or Contributor role in the resource group
Permissions to create and manage function apps, storage accounts, App Insights resources, and managed identity role assignments
Compatibility Requirements
Supported Language Stacks
| Stack ID | Language | Supported? |
|---|---|---|
dotnet-isolated (.NET 8+) | .NET isolated worker, .NET 8+ | ✅ Yes — if no Windows-only dependencies and not published with a Windows RID |
dotnet-isolated (.NET Framework) | .NET isolated worker targeting net4x | ❌ No — .NET Framework runtime not present on Linux; must retarget to .NET 8+ |
dotnet | .NET in-process model | ❌ No — not supported on Flex; must migrate to isolated worker model first |
node | JavaScript/TypeScript | ✅ Yes |
java | Java | ✅ Yes |
python | Python | ✅ Yes |
powershell | PowerShell | ⚠️ Review — Windows-only modules (WMI, registry, COM interop) will not work on Linux |
go | Go (Preview) | ✅ Yes — if the handler and native dependencies are built for Linux |
custom | Custom handlers | ⚠️ Review — handler binary must be Linux-compatible |
Known Limitations and Migration Blockers
Flex Consumption Platform Limits (shared with Linux migration)
| Feature | Status | Action Required |
|---|---|---|
| Deployment slots | ❌ Not supported | Consolidate to production slot or rearchitect to separate apps |
| TLS/SSL certificates | ⚠️ Site-scoped certificates in preview | Re-add used certificates after migration, verify the per-app limits, and update code to use Linux certificate file paths |
| Blob trigger (polling) | ❌ EventGrid source only | Convert LogsAndContainerScan → EventGrid; create event subscription |
Disable setting for function names containing - | ❌ Not supported on Linux | Isolate the target dependency, rename/repackage the function, use a source-first deployment cutover, or explicitly accept active-trigger risk |
| Azure Government | ❌ Not available | Cannot migrate yet |
| MSDeploy / FTP / Kudu git deploy | ❌ Not supported | Switch to az functionapp deploy or func azure functionapp publish |
| PowerShell managed dependencies | ❌ Not supported | Package all required modules in the app-root Modules folder before deployment; verify Linux compatibility. requirements.psd1 alone doesn't install modules on Flex Consumption. See PowerShell dependency management. |
Windows-to-Linux Specific Blockers
| Issue | How to Detect | Action Required |
|---|---|---|
| .NET in-process model | FUNCTIONS_WORKER_RUNTIME=dotnet app setting | Migrate to isolated worker model — requires code changes (different NuGet packages, Program.cs startup) |
.NET Framework targeting (net4x) | .csproj target framework | Retarget to .NET 8+ — may require replacing Framework-only APIs and NuGet packages |
| Windows-only NuGet packages (GDI+, COM, P/Invoke) | Assembly/package scan (heuristic) | Replace with cross-platform alternatives, or migrate to Elastic Premium on Windows |
| Windows RID deployment package | runtimes/win-x64/ present without linux-x64 in package | Republish without a RID (framework-dependent) or with -r linux-x64 |
| Path separator / case sensitivity | Code review | Replace \ path construction with Path.Combine(); fix case-sensitive file references |
| PowerShell Windows-only modules (WMI, registry, COM) | requirements.psd1 module imports | Replace with cross-platform alternatives or remove |
| Windows certificate store access | Code review | Migrate to file-based certificate loading |
| Unsupported language runtime version | Site config | Upgrade to a supported version |
| App region not supported by Flex | Region vs. Flex availability list | Wait for regional availability, or relocate the app |
💡 Elastic Premium escape hatch: Apps with hard Windows dependencies that cannot be removed can migrate to Elastic Premium on Windows as an alternative. This changes the hosting plan without requiring an OS migration.
New App Name
The new Flex Consumption app needs a globally unique name. The skill defaults to <source>-flex — e.g. if your source app is test-app, the new app will be test-app-flex. This is short, self-documenting, and signals the SKU change.
Two modes are supported. State your preference in your initial migration request:
| Mode | How to invoke | Resulting name |
|---|---|---|
| Default suffix (default) | Just say "migrate my function app" | <source>-flex |
| Custom name | "migrate my function app as <name>" or "… named <name>" | The name you provide |
⚠️ Skill instruction: Before executing Step 4b in automation.md, announce the proposed name to the user, e.g. "I'll create the new Flex app as
test-app-flexin resource grouptest-app_group(regionwestus2). Say so if you'd prefer a different name." This gives the user a chance to course-correct without a blocking prompt.
💡 Constraints (from the underlying MS Learn create flow): globally unique in Azure (becomes
<APP_NAME>.azurewebsites.net), 2–60 characters, alphanumerics + hyphens, must start with a letter, no consecutive hyphens. If the default<source>-flexwould exceed 60 chars or collides with an existing app, fall back to a shortened suffix (e.g.<source>-fc) and announce that to the user.
Storage Account Options
The new Flex Consumption app needs a storage account bound at creation time. The skill defaults to reusing the source app's existing storage account — the same default as az functionapp flex-migration on Linux. This is the lowest-friction option because there is no new storage resource to manage. Flex configures deployment storage on the target rather than reusing the source app's Windows content-share settings.
Three modes are supported. State your preference in your initial migration request — the skill will detect it and set the binding accordingly. Think of these as CLI-style flags:
| Mode | How to invoke | When to use |
|---|---|---|
| Reuse source storage (default) | Just say "migrate my function app" | Most migrations. No isolation needed between source and target. |
| Create new storage | "migrate my function app with a new storage account" or "… and create a new storage account" | You want isolated storage for blast-radius, compliance, or test/prod separation. |
| Use a specific existing account | "migrate my function app using storage account <name>" | You already have a target account provisioned (e.g. via IaC or central platform team). |
⚠️ Skill instruction: Before executing Step 4a/4b in automation.md, announce the storage choice to the user, e.g. "I'll reuse your existing storage account
foofor the new Flex app. Say so if you'd prefer a new isolated account or a different existing one." This gives the user a chance to course-correct without a blocking prompt.
Upgrade Phases
Initialize and maintain <UPGRADE_DIR>/upgrade-status.md using Migration Progress. Derive its workflow snapshot from the current scenario and automation headings, and show the current phase, substep, description, and state in chat at every transition; do not use a percentage.
Phase 1: Assessment
Run all checks from assessment.md. Since az functionapp flex-migration does not support Windows, eligibility is determined manually — use Step 1 and Step 2 in automation.md to identify candidate apps and run compatibility checks.
Source code dependency scan (Step 2g / dependency-scan.md) — recommended for every Windows → Flex migration. Prefer a local source directory or checked-out repository; use the deployed package only when source is unavailable. The scan checks for Win32/COM/WMI/registry/cert-store usage, Windows-only packages, Windows-RID targeting, and shell-outs to Windows tools. Skippable — when skipped, the user owns the risk. Findings populate §11 of the assessment report and advisorily affect §1
Upgrade Readiness.
Phase 2: Pre-migration (Collect Everything)
Collect all settings and configurations from the existing app before creating the new one. See Step-by-step scripts in automation.md:
Collect app settings
Collect application configurations (CORS, custom domains, HTTP version, TLS, client certs, etc.)
Inventory TLS/SSL certificates that must be re-added with the site-scoped certificate process
Identify managed identities and RBAC role assignments
Identify built-in authentication settings
Review inbound access restrictions
Get the code deployment package (if source code not in version control)
Phase 3: Create Flex Consumption App
Execute Steps 4a–4l from automation.md. Each sub-step handles a discrete part of the migration:
4a — (optional) Create a new storage account — only run if the user explicitly asked for new or different storage; see Storage Account Options
4b — Run the storage authentication preflight; use connection-string creation only when Shared Key access is permitted. Otherwise block for user-provisioned, verified identity-first creation — App Creation
4b.opt — Convert a permitted connection-string target to identity-based storage if the source was identity-based or the user requested it; not a workaround for prohibited Shared Key access
4c — Review app-setting names, then ask whether to copy filtered source settings or defer them until target-specific dependencies are configured
4d — Apply site configurations (HTTP/2, TLS, HTTPS-only, client certs, SCM basic auth)
4e — Migrate system-assigned managed identity and role assignments
4f — Migrate user-assigned managed identities
4f.auth — If the source uses built-in authentication, configure and validate each provider before code deployment or defer the migration
4g — Migrate CORS settings
4h — Migrate custom domains
4i — Migrate access restrictions
4j — Skip disablement when settings and every trigger dependency are proven isolated from production and no autonomous function can affect production; otherwise separate hyphenated non-HTTP function names, which Linux cannot disable through app settings, and obtain the applicable safety decisions — decision guidance
4k — Verify the Application Insights configuration created with the target app; preserve AAD ingestion only when the source used it
4l — Inventory access-key names and choose target-generated keys or opt in to preserving source host and HTTP-function key values
💡 Use Microsoft Entra ID + managed identities instead of connection strings when creating the new app.
Identity-First Configuration (Functions)
Enterprise subscriptions commonly enforce policies blocking local auth. Configure identity-based access:
Storage accounts: Step 4b checks Shared Key access and policy before creation. Where keys are prohibited, managed identity and effective roles are required for both runtime and deployment storage; block until identity-first provisioning is verified. Runtime identity settings alone don't configure deployment identity. 4b.opt is a post-create conversion only where connection-string creation was permitted. Step 4c preserves target storage settings rather than copying source
AzureWebJobsStorage*settings.Application Insights: Preserve
Authorization=AADwhen the source already uses it; otherwise treat conversion as optional post-migration hardeningWhen using User Assigned Managed Identity, pass
managedIdentityClientIdexplicitly
Phase 4: Verify and Configure the New App
Steps 4a–4i migrate application configuration; Step 4f.auth handles built-in authentication; Steps 4j–4k establish trigger safety and verify monitoring; Step 4l records the access-key strategy. Verify the results and manually configure anything not covered by those steps (see automation.md):
Verify the chosen app-setting mode, identities, and custom domains
Re-add used TLS/SSL certificates with the site-scoped certificate process and update code that used the Windows certificate store
Configure the source app's custom scale limit, if one was set
Verify Application Insights monitoring
Phase 5: Deploy Code
⚠️ Code is NOT automatically migrated. The new app is created with config only — you must deploy code separately.
⚠️ If Step 4b storage authentication preflight or identity-first provisioning remains blocked, do not deploy code. Required storage identities, role assignments, and access validation cannot be deferred.
⚠️ If source app settings were deferred in Step 4c, deployment is blocked until the user confirms all required application-specific target settings are configured. The skill may inspect names, but never setting values.
⚠️ If built-in authentication was deferred in Step 4f.auth, deployment is blocked. The source authentication boundary must be recreated and verified before application code is placed on the target.
Use ask_user to present these options:
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
After user selects an option, execute the corresponding deployment method from automation.md — Step 5.
After deployment synchronizes all functions, execute Step 5a. When preservation was selected, copy and verify source host and HTTP-function keys before any HTTP validation. System and master keys remain target-generated.
✅ If Step 4j disablement was approved and no risky hyphenated non-HTTP function was approved for active deployment, only HTTP endpoints will be live after deployment and per-function cutover happens in Phase 6.
✅ If Step 4j was skipped because the target is fully isolated, deploy without per-function disable settings and validate only against those isolated dependencies.
⚠️ If the user declined disablement, warn again and obtain explicit approval immediately before deployment because non-HTTP functions may begin processing or running schedules as soon as deployment completes.
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
If target-generated access keys were selected, update key-dependent clients and workflows before directing them to the new URL
Enable HTTPS-only and managed identity on the new app for better security
Source deletion is available only after all applicable production traffic and triggers are cut over and validated
Phase 6: Post-Upgrade Validation
Smoke test — Get the app's default hostname via
az functionapp show --query defaultHostName -o tsv, then hit that URL and confirm it returns a non-error response (HTTP 2xx/4xx, not connection refused or 503). If an intentional access restriction returns403 Ip Forbidden, verify deployment and function synchronization through ARM and record functional smoke testing as deferred until it can run from an already allowed client; do not relax access rules automatically.Verify the app is running on Flex Consumption (
az functionapp show --query sku)Test HTTP trigger endpoints (e.g.
curl https://<DEFAULT_HOST>/api/<FUNCTION_NAME>)Per-function validation and cutover for event-driven triggers — either validate the target against isolated test resources without changing the source, or use a production cutover transaction. For production, obtain function-specific approval first, disable and verify the source, then enable the target; the same approval must explicitly authorize rollback if target validation fails. Never enable a production-connected target while source-disable approval is pending. See Per-Function Cutover for the full procedure.
Capture and compare performance benchmarks
Set up monitoring dashboards
Refine scale/concurrency settings
Update IaC (Bicep/Terraform) to reflect new plan
Phase 7: Cleanup (Optional)
Keep the original app for a few days/weeks as rollback
Consumption plan charges only for actual usage — low cost to keep idle
A validation-only success is not eligible for source deletion
The skill may offer deletion only when the recorded outcome is
production cutover complete, no production-readiness work remains deferred, and the source no longer processes production workloadsImmediately before deletion, use
ask_useras specified in automation.md — Step 7
Trigger Migration Risks
✅ Recommended safety net: When the user approves Step 4j, non-HTTP functions are disabled before deployment. Phase 6 then uses isolated target resources or a source-first, pre-approved production transaction so the target is never enabled while source-disable approval is pending. If the user declines Step 4j, record that dual processing or duplicate schedules may begin immediately after deployment. Apply the relevant mitigations below before enabling or deploying each function.
| Trigger Type | Risk | Mitigation |
|---|---|---|
| Azure Blob storage | High | Create separate container for event-based trigger in new app |
| Azure Cosmos DB | High | Create dedicated lease container for new app; set StartFromBeginning: false |
| Azure Event Grid | Medium | Recreate event subscriptions; ensure idempotent functions |
| Azure Event Hubs | Medium | Create new consumer group for new app |
| Azure Service Bus | High | Create new topic/queue; update senders; drain original before shutdown |
| Azure Storage Queue | High | Create new queue; update senders; drain original before shutdown |
| HTTP | Low | Update clients to target new app URL |
| Timer | Low | Offset schedules during cutover to avoid simultaneous execution |
IaC Key Differences
| Property | Consumption | Flex Consumption |
|---|---|---|
| SKU | Y1 (Dynamic) | FC1 (FlexConsumption) |
| Plan required | Optional (auto-created) | Required (must be explicit) |
| OS | Windows | Linux |
| Configuration | App settings | functionAppConfig section |
| Storage | WEBSITE_CONTENTSHARE setting | deployment.storage in functionAppConfig |
If the source app is managed through Bicep, ARM, or Terraform:
Define the Flex app and plan as new resources; a Consumption app cannot be converted to Flex Consumption in place.
Update the deployment definitions to use the new resource names and the Flex configuration above.
Reconcile resources created during migration instead of allowing IaC to recreate or overwrite them. For Terraform, import the new resources when appropriate.
Review the proposed changes with
az deployment group what-iforterraform planbefore applying them.Update CI/CD pipelines to deploy to the new Flex app.
Do not mix ongoing manual configuration with resource-based deployments. If the app is not managed through IaC, skip this section.
Deprecated Settings (Do NOT Migrate)
These app settings must be filtered out before applying to the new Flex app (Step 4c). The skill handles this automatically — Step 4c streams source settings through jq, deleting these keys in memory before PATCHing the new app's ARM endpoint.
Azure Files content settings (always present on Windows Consumption — never migrate)
Every Windows Consumption app has these because the platform requires them for the Azure Files SMB share. Flex uses blob-based deployment instead — these have no equivalent.
These platform content settings are distinct from explicit Azure Files mount metadata returned by az webapp config storage-account list. Windows Consumption doesn't support explicit storage mounts, so catalog any returned metadata but don't migrate it.
WEBSITE_CONTENTAZUREFILECONNECTIONSTRINGWEBSITE_CONTENTSHAREWEBSITE_CONTENTOVERVNETWEBSITE_SKIP_CONTENTSHARE_VALIDATION
Deployment settings (Flex uses deployment.storage in functionAppConfig, not app settings)
Windows Consumption has three historical aliases for run-from-package — all must be removed:
WEBSITE_RUN_FROM_PACKAGEWEBSITE_RUN_FROM_ZIP(legacy alias — same semantics asWEBSITE_RUN_FROM_PACKAGE)WEBSITE_USE_ZIP(original name — same semantics)
Runtime / scale settings (configured via functionAppConfig in Flex, not app settings)
FUNCTIONS_EXTENSION_VERSIONFUNCTIONS_WORKER_RUNTIMEFUNCTIONS_WORKER_RUNTIME_VERSIONFUNCTIONS_MAX_HTTP_CONCURRENCYFUNCTIONS_WORKER_PROCESS_COUNTFUNCTIONS_WORKER_DYNAMIC_CONCURRENCY_ENABLEDWEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
Other unsupported settings
WEBSITE_USE_PLACEHOLDER_DOTNETISOLATEDWEBSITE_LOAD_CERTIFICATES(unused in Flex; use the site-scoped certificate process and make certificates accessible to app code)AzureWebJobsDashboard(legacy v1 setting — not used by the v4 runtime)WEBSITE_MOUNT_ENABLEDENABLE_ORYX_BUILDSCM_DO_BUILD_DURING_DEPLOYMENTWEBSITE_DNS_SERVERWEBSITE_NODE_DEFAULT_VERSIONWEBSITE_VNET_ROUTE_ALL
Application Insights (preserved from Step 4b and verified by Step 4k)
APPLICATIONINSIGHTS_CONNECTION_STRING— Step 4c preserves the target-specific value normally created byaz functionapp create; Step 4k verifies it without displaying the value.APPLICATIONINSIGHTS_AUTHENTICATION_STRING=Authorization=AADis preserved only when the source already used AAD ingestion.
Storage (replaced by Step 4b / 4b.opt)
Every setting whose name starts with AzureWebJobsStorage is dropped by the 4c filter. Preserve the target binding verified by Step 4b or configured by Step 4b.opt:
AzureWebJobsStorage— discard the source connection string. Step 4b creates a fresh target connection string only when Shared Key authentication is permitted; identity-first targets must not receive one.All
AzureWebJobsStorage__*variants — discard source settings so they can't silently point the target runtime at the wrong account. Preserve verified target identity settings or re-derive them through 4b.opt where conversion is permitted.
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.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-upgrade.zip