目標は、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>