【Azure】App Serviceの.NETランタイム確認方法

### 概要
AzureのApp Serviceにて、どの.NETランタイムバージョンが使用されているのかをコマンドで確認する方法

### PowerShellスクリプトのパターン
以下のスクリプトを実行すると、JSONファイルで結果が作成される。
az loginしたローカルのPowerShellで実行してもいいし、CloudShellでPowerShellを選択して実行してもいい。

```実行コマンド.txt
# Define a collection to hold the output
$runtimes = [System.Collections.Generic.List[object]]@()

# Get subscription id
Write-Progress "Fetching subscription id"
$sub = (az account show --query id -o tsv)

# Get all resource groups in the subscription
Write-Progress "Searching for resource groups"
$groups = (az group list --query "[].name" -o tsv)

# Set counter for group progress
$groupCounter = 1;

# Loop through each resource group to find all the web apps in it
foreach($group in $groups) {

    # Find web apps in the specified group
    Write-Progress "Searching for web apps in resource group $group" -PercentComplete (($groupCounter / $groups.Count) * 100)
    $apps =(az webapp list -g $group --query "[?kind=='app' || kind=='app,linux'].name" -o tsv)

    # Iterate the web apps
    foreach($app in $apps) {

        # Query the web app for versions
        Write-Progress "Querying web app $app"
        $appConfig = (az webapp show -n $app -g $group --query "{java:siteConfig.javaversion,netFramework:siteConfig.netFrameworkVersion,php:siteConfig.phpVersion,python:siteConfig.pythonVersion,linux:siteConfig.linuxFxVersion}") | ConvertFrom-Json

        # Define an output object
        $output = [PSCustomObject]@{
            group = $group
            name = $app
            host = $null
            runtime = $null
            version = $null
        }

        # Determine which type of app service it is and get the values accordingly
        if($appConfig.linux -eq "") {

            # Windows platform
            $output.host = "windows"

            # Query the app config to get the metadata for the current stack
            $uri = "https://management.azure.com/subscriptions/$sub/resourceGroups/$group/providers/Microsoft.Web/sites/$app/config/metadata/list?api-version=2020-10-01"
            $output.runtime = (az rest --method post --uri $uri --query "properties.CURRENT_STACK" -o tsv)

            # Determine the version of the relevant stack
            $output.version = switch($output.runtime) {
                "dotnet" {$appConfig.netFramework}
                "dotnetcore" {$null}
                "python" {$appConfig.python}
                "php" {$appConfig.php}
                "java" {$appConfig.java}
                default {$null}    
            }        

        } else {

            # Linux platform
            $output.host = "linux"

            # Split out the stack from the version
            $output.runtime = $appConfig.linux.split("|")[0]
            $output.version = $appConfig.linux.split("|")[1]

        }

        $runtimes.Add($output)
    }
```

```実行結果サンプル.json
[
  {
    "group": "sample-group",
    "name": "sample-ruby-app",
    "host": "linux",
    "runtime": "RUBY",
    "version": "2.6"
  },
  {
    "group": "php-group",
    "name": "sample-php-app",
    "host": "windows",
    "runtime": "php",
    "version": "7.3"
  },
  {
    "group": "linux-apps",
    "name": "sample-node-app",
    "host": "linux",
    "runtime": "NODE",
    "version": "14-lts"
  },
  {
    "group": "linux-apps",
    "name": "sample-dotnetcore-app",
    "host": "linux",
    "runtime": "DOTNETCORE",
    "version": "3.1"
  }
]
```

### Cloud Shell/Azure CLIのパターン
```実行コマンドサンプル.txt
az webapp config show --resource-group <resource-group-name> --name <app-name> --query netFrameworkVersion
```
※リソースグループ・アプリの数だけ上記コマンドを実行する必要あり

```実行結果サンプル.txt
{
  "Name": "linux-apps",
  "NetFrameworkVersion": "v4.0"
}
```

一括で流し込みたいなら、シェルスクリプトにして実行するなど

```sample.sh
#!/bin/bash
az webapp config show --resource-group <resource-group-name> --name <app-name> --query netFrameworkVersion
az webapp config show --resource-group <resource-group-name> --name <app-name> --query netFrameworkVersion
az webapp config show --resource-group <resource-group-name> --name <app-name> --query netFrameworkVersion

```

```実行コマンドサンプル.txt
sh sample.sh > sample_result.txt

```

### 参考
[How to List App Services ( Webapp ) Runtimes?](https://stackoverflow.com/questions/67107064/how-to-list-app-services-webapp-runtimes)
[現在の .NET Framework ランタイム バージョンを表示する](https://docs.microsoft.com/ja-jp/azure/app-service/configure-language-dotnet-framework#show-current-net-framework-runtime-version)