Azure / Azure/azure-cli

az webapp create ignores siteConfigPropertiesDictionary from the selected App Service stack

Open
#33,835 6 comments 0 reactions 2 assignees Claimed by @seligj95 View on GitHub
act-identity-squad act-observability-squad app-service-general Auto-Assign bug Service Attention Web Apps
Dominant language
Python
Stars
4.6k
Forks
3.5k
Avg merge
3d 2h
Merged PRs (30d)
60

Description

# Describe the bug

`az webapp create --runtime` resolves the selected runtime but does not apply the stack-specific site configuration supplied by the App Service stacks API in `siteConfigPropertiesDictionary`.

The current observable failure is Windows Node 24. Its stack metadata includes:

```json
{
"siteConfigPropertiesDictionary": {
"use32BitWorkerProcess": false
}
}
```

Node 24 is 64-bit only, but an app created with `--runtime "NODE:24LTS"` has `use32BitWorkerProcess: true`. A Node 24 probe then fails with HTTP 500. Changing only this property to `false` allows the same probe to run successfully as Node 24 x64.

This should not be fixed with a Node 24-specific or Windows-only condition. The stacks API is the source of truth for runtime-specific site configuration on both Windows and Linux. Upcoming runtimes, including .NET 11 on Windows, will also require `use32BitWorkerProcess: false`, while Linux stacks may use the dictionary for other platform-appropriate settings. Every consumer of the stacks API should honor these properties generically so that adding or changing a stack does not require another Azure CLI release or runtime-specific branch.

## Related command

```text
az webapp create
```

Related inspection and workaround commands:

```text
az webapp list-runtimes
az webapp config show
az webapp config set --use-32bit-worker-process false
```

## Errors

The create command succeeds, but the resulting app is configured incorrectly:

```json
{
"nodeVersion": "",
"use32BitWorkerProcess": true,
"windowsFxVersion": null
}
```

After deploying a no-dependency Node probe:

```text
GET https://.azurewebsites.net/
HTTP 500

```

The identical probe on an otherwise identical app where only `use32BitWorkerProcess` is set to `false` returns:

```json
{
"nodeVersion": "v24.18.0",
"architecture": "x64",
"platform": "win32"
}
```

## Issue script & Debug output

The following reproduces the configuration defect on a currently selected subscription. App names must be globally unique.

```powershell
$location = "eastus2"
$resourceGroup = "node24-cli-repro"
$planName = "node24-cli-repro-plan"
$appName = "node24-cli-repro-"

az group create `
--name $resourceGroup `
--location $location

az appservice plan create `
--resource-group $resourceGroup `
--name $planName `
--location $location `
--sku P0v3 `
--is-linux false

az webapp list-runtimes `
--os-type windows `
--query "[?config=='NODE|24LTS']"

az webapp create `
--resource-group $resourceGroup `
--plan $planName `
--name $appName `
--runtime "NODE:24LTS" `
--debug

az webapp config show `
--resource-group $resourceGroup `
--name $appName `
--query "{nodeVersion:nodeVersion, windowsFxVersion:windowsFxVersion, use32BitWorkerProcess:use32BitWorkerProcess}"
```

Runtime discovery correctly returns Node 24:

```json
[
{
"config": "NODE|24LTS",
"os": "Windows",
"runtime": "Node",
"version": "24.0 LTS"
}
]
```

Relevant sanitized `--debug` output:

```text
Will set appsetting {'name': 'WEBSITE_NODE_DEFAULT_VERSION', 'value': '~24'}

PUT .../providers/Microsoft.Web/sites/?api-version=2025-05-01
Request body:
{
"properties": {
"siteConfig": {
"appSettings": [
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~24"
}
],
"alwaysOn": true
},
"serverFarmId": ""
}
}

PUT .../providers/Microsoft.Web/sites//config/metadata?api-version=2025-05-01
Request body:
{
"properties": {
"CURRENT_STACK": "node"
}
}
```

Neither request applies `use32BitWorkerProcess: false`. The resulting value is `true`:

```json
{
"nodeVersion": "",
"use32BitWorkerProcess": true,
"windowsFxVersion": null
}
```

The workaround is:

```powershell
az webapp config set `
--resource-group $resourceGroup `
--name $appName `
--use-32bit-worker-process false
```

## Expected behavior

When `--runtime` selects a Windows or Linux stack whose stacks API entry contains `siteConfigPropertiesDictionary`, `az webapp create` should merge those properties into the `siteConfig` sent to ARM.

For Windows Node 24, the initial create payload should therefore include:

```json
{
"properties": {
"siteConfig": {
"use32BitWorkerProcess": false
}
}
}
```

The implementation should be generalized:

1. Resolve the selected runtime's OS-specific stacks API entry.
2. Apply the valid `siteConfigPropertiesDictionary` entries to the create payload using the SiteConfig schema.
3. Do not hard-code an operating system, runtime name, or version such as Windows, `NODE|24LTS`, or .NET 11.
4. Preserve current defaults when the dictionary or a property is absent.
5. Give an explicit caller-supplied value precedence if `az webapp create` supports an override for the same property.

Regression coverage should verify that:

- Windows Node 24 is created with `use32BitWorkerProcess == false` and can run an x64 probe.
- Another stack carrying the same metadata receives the same setting without a runtime-specific code path. This should cover the upcoming .NET 11 requirement when that stack is available.
- A Linux stack or test fixture carrying site configuration metadata receives its declared properties through the same generalized path.
- A stack without this metadata retains its existing behavior.
- Additional valid SiteConfig properties supplied by stack metadata use the same generalized path.

## Environment Summary

```text
azure-cli 2.88.0
azure-cli-core 2.88.0
azure-cli-telemetry 1.1.0

Python (Windows) 3.14.5
OS Windows 11
```

The issue was reproduced on a Windows P0v3 App Service plan in East US 2. The plan reported `kind: app` and `reserved: false`.

## Additional context

The CLI correctly maps `NODE|24LTS` to `WEBSITE_NODE_DEFAULT_VERSION=~24` and writes `CURRENT_STACK=node`; the missing behavior is propagation of the selected stack's site configuration metadata.

The observed side-by-side test used the same plan and identical deployment package:

| Creation/configuration | `use32BitWorkerProcess` | Result |
|---|---:|---|
| `az webapp create --runtime "NODE:24LTS"` with no post-create change | `true` | HTTP 500 |
| Same create command, followed only by `az webapp config set --use-32bit-worker-process false` | `false` | HTTP 200, Node `v24.18.0`, `x64`, `win32` |

The generalized, OS-independent stacks metadata behavior is the requested fix. A Node 24-only or Windows-only workaround in `az webapp create` would leave the same defect for .NET 11, Linux stacks, and other future runtime requirements.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.