Azure Application Gateway を運用していると、「このサイト系のリスナーとルールとバックエンド設定、全部まとめて消したい」という場面が必ず出てきます。しかしポータルから 1 個ずつ削除していると、依存関係エラーと格闘しながら延々クリック地獄……。この記事では、PowerShell と Azure CLI を使って、複数のリスナー/ルール/バックエンド設定を安全かつ一括で削除する具体的な手順とサンプルスクリプトを詳しく解説します。
Azure Application Gateway で一括削除が難しい理由
Application Gateway(以下 App Gateway)は L7 ロードバランサーとして多くのコンポーネントが相互に参照し合う構造になっています。
そのため、参照されている側から先に削除しようとすると必ずエラーになります。
主なコンポーネントと参照関係を整理すると、次のようになります。
| 種別 | 主な役割 | 参照するもの | 削除の条件 |
|---|---|---|---|
| ルーティング ルール (Request/Routing Rule) | どのリスナーに来たトラフィックを、どのバックエンドへどう流すかを定義 | HTTP リスナー、バックエンド HTTP 設定、URL パス マップ、バックエンド アドレス プール など | 紐付いているリスナー・バックエンド設定を残したままでも削除可能だが、 反対にルールが残っている限り、リスナーや設定側を削除できない |
| HTTP リスナー | フロントエンド IP/ポート/ホスト名/プロトコル(HTTP/HTTPS)を受け持つ | フロントエンド IP 設定、フロントエンド ポート、証明書(HTTPSの場合) | そのリスナーを参照するルールが 1 つでも残っていると削除不可 |
| バックエンド HTTP 設定 (Backend HTTP Settings) | HTTP/HTTPS のポート、ホストヘッダー、タイムアウト、Cookie ベース アフィニティなど | バックエンド アドレス プール、プローブ、URL パス マップ | いずれかのルールや URL パス マップが参照していると削除不可 |
| バックエンド設定 (Backend Settings / TCP/TLS) | TCP/TLS レベルの設定(新しめの Backend Settings 機能) | TCP/TLS ルール(routing-rule)、バックエンド プール、プローブ 等 | 同様に、参照しているルール・プールがあると削除不可 |
この構造のせいで、ポータルから適当に「リスナー消そう」とすると、
- “The ApplicationGatewayHttpListener … is referenced by request routing rule …”
のようなエラーに悩まされることになります。根本的な解決策はシンプルで、依存関係の「上流」から順番に外していくことです。
削除の基本戦略:ルール → リスナー → HTTP 設定 → TCP/TLS 設定
App Gateway の複数要素を一括削除する場合は、次の順番で削除していくのが鉄則です。
- ルーティング ルール(Request/Routing Rule)
- HTTP リスナー
- バックエンド HTTP 設定 (Backend HTTP Settings)
- バックエンド設定 (Backend Settings / TCP/TLS)
PowerShell で使う主な削除コマンドレットは次の通りです。
| 対象 | コマンドレット | 補足 |
|---|---|---|
| ルーティング ルール | Remove-AzApplicationGatewayRoutingRule/ Remove-AzApplicationGatewayRequestRoutingRule | Az.Network のバージョンによって名前が異なる。どちらも同様に動作 |
| HTTP リスナー | Remove-AzApplicationGatewayHttpListener | 参照中のルールが残っていると削除に失敗 |
| バックエンド HTTP 設定 | Remove-AzApplicationGatewayBackendHttpSetting | 従来からある HTTP/HTTPS 向けのバックエンド設定 |
| バックエンド設定 (TCP/TLS) | Remove-AzApplicationGatewayBackendSetting | 新しめの TCP/TLS 設定(Backend Settings)を削除 |
そして、これらの削除操作はすべて「ローカルの $appGw オブジェクトの操作」であり、Set-AzApplicationGateway を実行したタイミングで初めて Azure 側に反映されます。
一括削除では「必要な変更をすべて $appGw に対して行い、最後に 1 回だけ Set-AzApplicationGateway で反映する」のがポイントです。
PowerShell で複数ルール/リスナー/設定を一括削除するスクリプト
前提条件
以下の前提で説明します。
- Az PowerShell モジュール(Az.Network を含む)がインストール済み
Connect-AzAccount済みで、対象サブスクリプションが選択されている- 削除したい Application Gateway 名とリソース グループ名が分かっている
完成形スクリプト
まずは完成形のスクリプトです。そのままコピペして、名前だけ置き換えれば動く形になっています。
# ===============================================
# App Gateway 一括削除スクリプト(PowerShell)
# 対象: ルール / HTTP リスナー / Backend HTTP 設定 / Backend Settings (TCP/TLS)
# ===============================================
# 事前設定
$rg = "YourResourceGroupName"
$gw = "YourAppGatewayName"
# 削除対象(必要なものだけ指定)
$ruleNames = @("rule-a","rule-b") # ルーティング ルール名
$listenerNames = @("listener-a","listener-b") # HTTP リスナー名
$backendHttpSettingNames = @("httpSetting-a","httpSetting-b") # バックエンド HTTP 設定名
$backendSettingNames = @("tcpTlsSetting-a","tcpTlsSetting-b") # バックエンド設定 (TCP/TLS)
# 構成の取得
$appGw = Get-AzApplicationGateway -ResourceGroupName $rg -Name $gw
# 補助: ルール削除 (RoutingRule / RequestRoutingRule 両対応)
function Remove-AgwRule {
param(
[Parameter(Mandatory = $true)] $Agw,
[Parameter(Mandatory = $true)][string] $Name
)
try {
Remove-AzApplicationGatewayRoutingRule -ApplicationGateway $Agw -Name $Name -ErrorAction Stop
} catch {
# 古いモジュールなどで RoutingRule が無い場合はこちらを試す
Remove-AzApplicationGatewayRequestRoutingRule -ApplicationGateway $Agw -Name $Name -ErrorAction Stop
}
}
# もし「リスナー名だけ指定」された場合は、それを参照するルール名を自動抽出
if (($ruleNames -eq $null) -or ($ruleNames.Count -eq 0)) {
$ruleNames = $appGw.RequestRoutingRules |
Where-Object { $_.HttpListener -and ($listenerNames -contains $_.HttpListener.Name) } |
Select-Object -ExpandProperty Name -Unique
}
# --- 1) ルールを削除 ------------------------------------------
foreach ($r in ($ruleNames | Select-Object -Unique)) {
if ($appGw.RequestRoutingRules | Where-Object { $_.Name -eq $r }) {
Write-Host "Remove rule: $r"
Remove-AgwRule -Agw $appGw -Name $r
}
}
# --- 2) HTTP リスナーを削除 -----------------------------------
foreach ($l in ($listenerNames | Select-Object -Unique)) {
if ($appGw.HttpListeners | Where-Object { $_.Name -eq $l }) {
Write-Host "Remove http listener: $l"
Remove-AzApplicationGatewayHttpListener -ApplicationGateway $appGw -Name $l
}
}
# --- 3) Backend HTTP 設定を削除 -------------------------------
foreach ($s in ($backendHttpSettingNames | Select-Object -Unique)) {
if ($appGw.BackendHttpSettingsCollection | Where-Object { $_.Name -eq $s }) {
Write-Host "Remove backend HTTP setting: $s"
Remove-AzApplicationGatewayBackendHttpSetting -ApplicationGateway $appGw -Name $s
}
}
# --- 4) Backend Settings (TCP/TLS) を削除 ----------------------
foreach ($b in ($backendSettingNames | Select-Object -Unique)) {
if ($appGw.BackendSettingsCollection | Where-Object { $_.Name -eq $b }) {
Write-Host "Remove backend setting (TCP/TLS): $b"
Remove-AzApplicationGatewayBackendSetting -ApplicationGateway $appGw -Name $b
}
}
# --- 5) 変更を反映 ---------------------------------------------
Write-Host "Apply changes to Application Gateway..."
Set-AzApplicationGateway -ApplicationGateway $appGw
スクリプトのポイント解説
1. $appGw オブジェクトに対してまとめて変更する
各 Remove-AzApplicationGateway* コマンドレットには -ApplicationGateway パラメーターを渡しています。これは 「この PSApplicationGateway オブジェクトから指定のサブリソースを取り除く」という意味であり、Azure 側の実体への反映は Set-AzApplicationGateway を実行したときに行われます。
そのため、
- テスト環境ではそのまま実行
- 本番環境では
Set-AzApplicationGateway -WhatIfで一度ドライランしてから本実行
という二段構えでの運用がしやすくなります。
2. ルール → リスナー → HTTP 設定 → TCP/TLS 設定 の順
依存関係を考えると、この順序で削除するのが最もシンプルです。
- ルールは HTTP リスナーを参照しているため、「先にルールを消す → 次にリスナーを消す」という順番が必要
- バックエンド HTTP 設定もルール(または URL パス マップ/プローブなど)から参照されるので、ルールを外してから削除
- Backend Settings (TCP/TLS) も同様に、対応するルール/プールの参照を外してから削除
3. リスナー名から関連ルールを自動抽出できる
スクリプトの中で、$ruleNames が空だった場合に「指定したリスナーを参照しているルール名を自動抽出」する処理を入れています。
if (($ruleNames -eq $null) -or ($ruleNames.Count -eq 0)) {
$ruleNames = $appGw.RequestRoutingRules |
Where-Object { $_.HttpListener -and ($listenerNames -contains $_.HttpListener.Name) } |
Select-Object -ExpandProperty Name -Unique
}
これにより、
- 「このリスナー(listener-a, listener-b)にぶら下がっている構成だけ全部消したい」
という時に、$listenerNames だけ指定しておけば、あとはスクリプトが関連ルールを自動で解決してくれます。
4. よく使う削除系コマンドレット一覧
今回スクリプトで使用した主なコマンドレットは次の通りです。
| 目的 | PowerShell コマンドレット |
|---|---|
| ルーティング ルール削除 | Remove-AzApplicationGatewayRoutingRule / Remove-AzApplicationGatewayRequestRoutingRule |
| HTTP リスナー削除 | Remove-AzApplicationGatewayHttpListener |
| Backend HTTP Settings 削除 | Remove-AzApplicationGatewayBackendHttpSetting |
| Backend Settings (TCP/TLS) 削除 | Remove-AzApplicationGatewayBackendSetting |
| 変更の反映 | Set-AzApplicationGateway |
名前パターンで一括削除する応用例
「dev- から始まる構成だけ消したい」といったケースでは、名前のプレフィックスで対象を抽出するのが便利です。
$prefix = "dev-"
$ruleNames = $appGw.RequestRoutingRules.Name |
Where-Object { $_ -like "$prefix*" }
$listenerNames = $appGw.HttpListeners.Name |
Where-Object { $_ -like "$prefix*" }
$backendHttpSettingNames = $appGw.BackendHttpSettingsCollection.Name |
Where-Object { $_ -like "$prefix*" }
$backendSettingNames = $appGw.BackendSettingsCollection.Name |
Where-Object { $_ -like "$prefix*" }
あとは先ほどの本体スクリプトにこれらの変数を流用するだけで、「プレフィックスでまとめて削除」が可能になります。
Azure CLI(Bash)での一括削除
PowerShell ではなく Azure CLI を使っている場合も、考え方は全く同じです。
ルール → リスナー → HTTP 設定 → TCP/TLS 設定 の順で削除していきます。Azure CLI では次のサブコマンドを使用します。
| 対象 | CLI コマンド |
|---|---|
| HTTP/HTTPS ルール | az network application-gateway rule delete |
| TCP/TLS ルール | az network application-gateway routing-rule delete |
| HTTP リスナー | az network application-gateway http-listener delete / listener delete |
| Backend HTTP Settings | az network application-gateway http-settings delete |
| Backend Settings (TCP/TLS) | az network application-gateway settings delete |
シンプルな一括削除ループの例
rg="YourResourceGroupName"
gw="YourAppGatewayName"
# 1) HTTP/HTTPS ルール
for r in rule-a rule-b; do
echo "delete rule: $r"
az network application-gateway rule delete \
-g "$rg" --gateway-name "$gw" -n "$r"
done
# 2) HTTP リスナー
for l in listener-a listener-b; do
echo "delete http listener: $l"
az network application-gateway http-listener delete \
-g "$rg" --gateway-name "$gw" -n "$l"
done
# 3) Backend HTTP Settings
for s in httpSetting-a httpSetting-b; do
echo "delete http-settings: $s"
az network application-gateway http-settings delete \
-g "$rg" --gateway-name "$gw" -n "$s"
done
# 4) Backend Settings (TCP/TLS)
for b in tcpTlsSetting-a tcpTlsSetting-b; do
echo "delete settings: $b"
az network application-gateway settings delete \
-g "$rg" --gateway-name "$gw" -n "$b"
done
CLI はコマンドごとに即時反映されるため、PowerShell のように最後の Set-AzApplicationGateway は不要です。その代わり、削除途中でエラーになった場合は「どこまで削除済みか」を都度確認しながらリトライする必要があります。
名前パターンでの自動削除(jq 利用例)
CLI だけで「特定のプレフィックスを持つリソースだけ一括削除」したい場合は、az ... list と jq を組み合わせると便利です。
prefix="dev-"
# HTTP ルールをプレフィックスで削除
for r in $(az network application-gateway rule list \
-g "$rg" --gateway-name "$gw" \
--query "[?starts_with(name, '$prefix')].name" -o tsv); do
echo "delete rule: $r"
az network application-gateway rule delete \
-g "$rg" --gateway-name "$gw" -n "$r"
done
同様のパターンで、リスナー/http-settings/settings を順に削除していけば、「プレフィックス単位のサブ構成クリーンアップ」が実現できます。
URL パス マップや Rewrite など周辺リソースの注意点
URL パス マップによる HTTP 設定の追加参照
パスベース ルーティング(PathBasedRouting)を使っている場合、ルールは内部的に URL パス マップ(url-path-map)と紐付きます。この URL パス マップも各パス ルールごとにバックエンド HTTP 設定を参照しているため、HTTP 設定を消す前に、関連する URL パス マップ/パス ルールを更新または削除する必要があります。
CLI では例えば次のようなコマンドで URL パス マップとそのルールを操作できます。
az network application-gateway url-path-map showaz network application-gateway url-path-map rule deleteaz network application-gateway url-path-map delete
PowerShell の場合も同様に、URL パス マップ関連の Add/Set/Remove コマンドレットで参照を外してから HTTP 設定を削除してください。
Backend HTTP Settings と Backend Settings (TCP/TLS) の違い
近年の App Gateway では、従来の Backend HTTP Settings に加えて、Backend Settings (TCP/TLS) という新しい設定オブジェクトが増えています。
| 種別 | 用途 | 代表的なパラメーター | 削除コマンド |
|---|---|---|---|
| Backend HTTP Settings | HTTP/HTTPS の動作(ポート、ホストヘッダー、パス、Cookie アフィニティ 等) | port, protocol, hostName, pickHostNameFromBackendAddress, cookieBasedAffinity など | Remove-AzApplicationGatewayBackendHttpSettingaz network application-gateway http-settings delete |
| Backend Settings (TCP/TLS) | TCP/TLS レベルの設定(HTTP/HTTPS 以外も含む) | port, protocol (Tcp/Tls), probe, connection-draining など | Remove-AzApplicationGatewayBackendSettingaz network application-gateway settings delete |
混在環境では、「どのルールがどちらを参照しているか」を事前に確認しておきましょう。
Rewrite Rule Set や WAF ポリシーも依存関係に注意
ルールに Rewrite Rule Set や WAF ポリシーを適用している場合、削除順を誤るとエラーになることがあります。
- Rewrite Rule Set はルール側から参照を外してから削除
- WAF ポリシーは、必要に応じて App Gateway から関連付けを外した上で削除
特に CLI では、エラー解析のために --debug オプションを併用すると、どのリソースの参照が邪魔をしているかのヒントが得られます。
安全に実行するためのドライランとロールバック戦略
-WhatIf / -Confirm を活用する(PowerShell)
破壊的な操作を行う PowerShell 関数では、SupportsShouldProcess と -WhatIf / -Confirm を実装するのがベスト プラクティスです。
例えば、先ほどの一括削除ロジックを次のような関数に包むと、
function Invoke-AgwBulkDelete {
[CmdletBinding(SupportsShouldProcess)]
param(
[Parameter(Mandatory = $true)][string] $ResourceGroupName,
[Parameter(Mandatory = $true)][string] $GatewayName
)
$appGw = Get-AzApplicationGateway -ResourceGroupName $ResourceGroupName -Name $GatewayName
if ($PSCmdlet.ShouldProcess("Application Gateway '$GatewayName' in '$ResourceGroupName'")) {
# ここに先ほどの削除ロジックを丸ごと実装
# ...
Set-AzApplicationGateway -ApplicationGateway $appGw
}
}
呼び出し側では、
Invoke-AgwBulkDelete -ResourceGroupName rg -GatewayName gw -WhatIfInvoke-AgwBulkDelete -ResourceGroupName rg -GatewayName gw -Confirm
のように実行することで、実際に削除される前に確認ダイアログを出したり、ドライランすることができます。
現行構成のバックアップを必ず取っておく
一括削除を行う前には、App Gateway の構成を JSON として吐き出しておくことを強くおすすめします。
Get-AzApplicationGateway -ResourceGroupName $rg -Name $gw |
ConvertTo-Json -Depth 20 |
Out-File ".\${gw}-backup.json" -Encoding UTF8
CLI 派であれば、
az network application-gateway show \
-g "$rg" -n "$gw" \
-o json > "${gw}-backup.json"
としておけば、最悪の場合でも ARM テンプレート的に「ほぼ同じ構成」を再現することができます。
メンテナンス時間帯での実行と監視
App Gateway の構成変更は基本的にインプレースで行われますが、更新中に短時間の接続リセットや一時的な 502 が発生する可能性があります。大規模な一括削除を行う際は、以下を意識しましょう。
- 事前にメンテナンス時間帯を確保する
- App Gateway の診断ログやバックエンドの監視(APM / Application Insights 等)を確認しながら作業
- 予期せぬ影響が出た場合は、直ちにロールバック or 一時的な代替ルーティングを適用
よくあるトラブルとその対処法
HTTP リスナー削除時の「参照されています」エラー
Remove-AzApplicationGatewayHttpListener や az network application-gateway http-listener delete を実行したときに、「ルールに参照されているため削除できません」というエラーが出ることがあります。
対処法はシンプルで、
- 該当リスナーを参照しているルールをすべて削除(または別リスナーへ切り替え)
- その後でリスナーを削除
という順番を徹底することです。今回の一括削除スクリプトは、この問題を避けるために「必ずルールから先に削除」するようになっています。
Backend HTTP Settings が削除できない
HTTP 設定を削除しようとして、
- まだルール/URL パス マップ/プローブに参照されている
というパターンも頻出です。特にパスベース ルーティングを多用している構成では、パス マップ側の参照を見落としがちなので、ルール・URL パス マップ・プローブの 3 箇所から参照されていないかを順番に確認してください。
CLI 実行時の「Conflict」エラー
Azure CLI で一括削除をしていると、Conflict エラーが出ることがあります。原因としては、
- 並列で別の構成変更が走っている
- 内部的な更新が終わる前に次の削除を投げている
などが考えられます。この場合は、
--no-waitを付けず同期的に待つ--debugで詳しいログを確認し、どのリソースの更新が詰まっているかを確認
といった対処を行うと原因切り分けがしやすくなります。
運用で効く命名規則と削除パターン
サイト単位でのプレフィックス命名
実運用では、App Gateway を 1 台にまとめて複数サイトを公開しているケースが多く、「サイト A を丸ごと撤去したい」といった要望が頻繁に発生します。その際に効いてくるのがプレフィックス命名です。
- 例)
site1-listener-https/site1-rule-main/site1-backend-http - 例)
corp-portal-*/partner-api-*
このように命名しておくと、先ほど紹介した「$prefix で名前フィルタ → まとめて削除」スクリプトがそのまま活用できます。
「一時的なテスト構成」は最初から削除前提の名前にする
検証やデバッグ用に追加した構成を後から消すのを忘れ、いつの間にか本番トラフィックが混在していた……というのはよくある失敗例です。
これを防ぐには、
tmp-/test-/exp-など削除前提のプレフィックスを付ける- 定期的に「tmp- プレフィックスの構成をフル削除」する保守作業をスケジュール化する
といった運用ルールと、一括削除スクリプトをセットにしておくと管理が楽になります。
まとめ
Azure Application Gateway 上で複数のリスナー/ルーティング ルール/バックエンド設定を一括で削除したい場合、ポイントは次の 3 つです。
- 依存関係の逆順で削除する
ルール → リスナー → Backend HTTP Settings → Backend Settings (TCP/TLS) の順に参照を断ち切る。 - PowerShell では $appGw を編集してから最後に 1 回だけ Set-AzApplicationGateway
これにより変更の整合性を保ちつつ、ドライラン(-WhatIf)やロールバックがやりやすくなる。 - Azure CLI でも同じ順序でループ削除
プレフィックスや jq を組み合わせれば、名前パターン単位でのサブ構成一括削除が簡単になる。
日々の運用で「App Gateway の構成クリーンアップ」が必要になったときは、今回紹介したスクリプトと手順をそのままテンプレートとして活用し、自身の環境の命名規則に合わせてカスタマイズしてみてください。

コメント