Azure CLI - リソース グループを削除せずにリソースを削除する

okwaves2024-01-25  9

目標は、Azure CLI を使用してリソース グループを削除せずに、リソース グループ内のすべてのリソースを削除することです。

ドキュメントを読むと、次のことができます。

az resource delete -g MyResourceGroup -n MyVm

したがって、次のことができると想定しました。

az resource list   --resource-group MyResourceGroup | az resource delete 

Azure Powershell の同様のコマンドは上記のように機能します。 CLI についてはまったくの初心者ですが、この方法は可能ですか?リソース グループ内のすべてのリソースを削除する効率的な方法は何ですか (複数の種類のリソースがある場合)



------------------------

PowerShell で Azure CLI を実行できる場合は、ConvertFrom-Json を使用して JSON 結果を az resource list のオブジェクトのリストに変換してから、az re を実行できます。foreach ループを使用して、各オブジェクト ID のソースを削除します。

$resources = az resource list --resource-group myResourceGroup | ConvertFrom-Json

foreach ($resource in $resources) {
    az resource delete --resource-group myResourceGroup --ids $resource.id --verbose
}

Foreach-Object を使用して、これをパイプライン内で完全に実行することもできます。これは、あなたがやろうとしていることに近いです。

az resource list --resource-group myResourceGroup 
    | ConvertFrom-Json
        | Foreach-Object {az resource delete --resource-group myResourceGroup --ids $_.id --verbose}

PowerShell をまったく使用したくない場合は、bash を使用して、grep と awk を使用して JSON 出力を自分で解析できます。

#!/bin/bash

resources="$(az resource list --resource-group myResourceGroup | grep id | awk -F \" '{print }')"

for id in $resources; do
    az resource delete --resource-group myResourceGroup --ids "$id" --verbose
done

@Hong Oi がコメントで有益に指摘したように、上記の主な問題は、一部のリソースが他のリソースに依存しているため、削除の順序が重要であることです。一例として、仮想マシンを削除するまでは仮想マシン ディスクを削除できないことが挙げられます。

これを回避するには、以下のハッシュ テーブルの例に示すように、リソースを削除するリソース タイプの順序を定義できます。

$resourceOrderRemovalOrder = [ordered]@{
    "Microsoft.Compute/virtualMachines" = 0
    "Microsoft.Compute/disks" = 1
    "Microsoft.Network/networkInterfaces" = 2
    "Microsoft.Network/publicIpAddresses" = 3
    "Microsoft.Network/networkSecurityGroups" = 4
    "Microsoft.Network/virtualNetworks" = 5
}

次に、リソースをリソース タイプごとに並べ替えます。d それらを削除します:

$resources = az resource list --resource-group myResourceGroup | ConvertFrom-Json

$orderedResources = $resources 
    | Sort-Object @{
        Expression = {$resourceOrderRemovalOrder[$_.type]}
        Descending = $False
    }

$orderedResources | ForEach-Object {
    az resource delete --resource-group myResourceGroup --ids $_.id --verbose
}

または、必要に応じて 1 つのパイプライン内で:

az resource list --resource-group myResourceGroup 
    | ConvertFrom-Json
        | Sort-Object @{Expression = {$resourceOrderRemovalOrder[$_.type]}; Descending = $False}
            | ForEach-Object {az resource delete --resource-group myResourceGroup --ids $_.id --verbose}

1

2

単純なループの問題は、リソースが他のリソースに依存する可能性があることです。削除が正しい順序で進行することを確認する必要があります。そうしないと、リソース マネージャーからエラーが発生します。

– ホン・オイ

2020 年 9 月 4 日 17:15



------------------------

より速く簡単なアプローチ:

az deployment group create --mode complete --template-uri data:application/json,%7B%22%24schema%22%3A%22https%3A%2F%2Fschema.management.azure.com%2Fschemas%2F2019-04-01%2FdeploymentTemplate.json%23%22%2C%22contentVersion%22%3A%221.0.0.0%22%2C%22resources%22%3A%5B%5D%7D --name clear-resources --resource-group <RG_NAME>

上記のデータ URI (Base64 でエンコードされている場合もあります) は、このファイルを表します。

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": []
}

DevOps では --template-uri を使用した HTTP(s) スキームのみが許可されるため、Azure DevOps パイプラインでは、上記の JSON コンテンツを含む実際のファイルを渡す必要があります。

az deployment group create --mode complete --template-file ./clear-resources.json --resource-group <RG_NAME>

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。