Azure DevOps で「Azure Resource Manager(ARM)」のサービス接続を作ろうとしたら、リソースグループ(RG)のプルダウンが延々と回り続けて先に進めない——現場でよく遭遇するこの“無限ロード”の根本原因と解決手順を、実務で使える深さで体系化しました。権限・ブラウザ・ネットワーク・サービス側の要因まで丁寧に切り分け、最短で復旧するための具体策と再発防止の設計指針をまとめます。
現象の整理(症状と前提)
Azure DevOps の プロジェクト設定 > サービス接続 から Azure Resource Manager を選び、認証方法(例:サービスプリンシパル) と サブスクリプション を指定した段階で、リソースグループ のドロップダウンが読み込み中のまま止まる/項目が出てこない/「内部エラー(TF400898 など)」が断続的に出る、というものです。
この現象は、UI 側の一時不具合だけでなく、RBAC 権限の不足、企業ネットワークの制限、Azure/DevOps 側の一時障害、あるいは 対象サブスクリプションに RG が一つも存在しない といった構造的な要因で発生します。
主な原因候補(一覧)
| カテゴリ | 具体的な要因 |
|---|---|
| 権限不足 | サブスクリプションへの Reader(または RG 列挙に必要な権限)が無く RG 取得に失敗 自動 SPN 作成やロール割り当てのための Owner または User Access Administrator が無い プロジェクト側の Service connections 作成権限が不足(Project Administrator 以外で拒否される設定) |
| UI/ブラウザ起因 | キャッシュ/Cookie の破損、CORS/同一サイト Cookie の影響 ブラウザ相性:Edge では失敗、Chrome では成功 の報告例あり 拡張機能の干渉(広告ブロッカー、スクリプト制御系) |
| サービス側の遅延・障害 | ARM(management.azure.com)や Azure DevOps の一時的な 5xx/内部エラー サブスクリプション API のサーバー側スロットリング |
| ネットワーク制限 | プロキシ/FW が dev.azure.com、management.azure.com、login.microsoftonline.com などへの呼び出しを遮断 SSL インスペクションや HTTP/2 ダウングレードの副作用 |
| RG が存在しない | 対象サブスクリプションに RG が 0 件だと UI が“空”を取り扱えず無限ロードに見えることがある |
最短で復旧するチェックリスト(優先度順)
1. RBAC 権限を確認・付与(最優先)
RG 一覧は Microsoft.Resources/subscriptions/resourcegroups/read を呼びます。最低でも RG 列挙が可能な権限(多くのケースで Reader)が必要です。自動 SPN 作成やロール割当てを UI で行う場合は、Owner または User Access Administrator が要求されます。
| ユースケース | 必要権限(サブスクリプション/RG) | ポイント |
|---|---|---|
| 既存 SPN を「手動」で登録 | RG/サブスクリプションの Reader(少なくとも列挙可能) | 発行済み SPN の ID/シークレットを UI に入力 |
| UI で SPN を自動作成 | Owner または User Access Administrator | ロール割当てを伴うため高権限が必要 |
| パイプライン実行のための最小権限 | 対象 RG に Contributor(推奨) | サブスクリプション全体への Owner 付与は避ける |
確認コマンド(Azure CLI)
# ログイン&コンテキスト
az login
az account set --subscription <SUB_ID>
# 現在のアカウントとサブスクリプション
az account show --output table
# RG を CLI 側で列挙できるか(UI 切り分け)
az group list --subscription --query "[].name" --output table
# RBAC の割当て確認(自分または SPN)
az role assignment list --assignee --scope /subscriptions/ --output table
# 必要に応じて RG 単位で Contributor を付与(最小権限)
az role assignment create
--assignee
--role Contributor
--scope /subscriptions//resourceGroups/
2. ブラウザ対策(キャッシュ・相性・拡張機能)
- シークレットウィンドウ(InPrivate/Incognito)で再試行
- サイトデータ(キャッシュ/Cookie)を
dev.azure.comドメインで個別削除 - Edge/Chrome/Firefox を切り替え検証(Edge では失敗 → Chrome で成功 の事例あり)
- 拡張機能を一時停止(特にスクリプト制御・広告ブロック系)
- Ctrl+F5 でハードリロード、または再ログイン
開発者ツールでの観察ポイント
- Network タブで
management.azure.com/.../resourcegroupsへのリクエストが200/403/401/5xxのどれかを確認 - 失敗時のレスポンス本文に RBAC 由来のメッセージ(AuthorizationFailed 等)がないか
- ブラウザコンソールに CORS エラー、Cookie の SameSite 警告が出ていないか
3. UI の「再取得」操作と手入力
- サブスクリプションのプルダウンを一度別の値に切替→元に戻す(RG 取得が再実行される)
- RG 名の手入力(UI が許容している場合、一覧の取得を待たずに進められる)
4. CLI/PowerShell で作成(UI をバイパス)
UI が不安定なときは、CLI でサービス接続(サービスエンドポイント)を作成します。事前に Azure DevOps 拡張を有効化してください。 Azure CLI(推奨)
# Azure DevOps 拡張
az extension add --name azure-devops
# Azure DevOps 組織とプロジェクトの既定値を設定
az devops configure --defaults organization=[https://dev.azure.com/<ORG](https://dev.azure.com/<ORG)> project=
# 既存 SPN を使う(手動)
az devops service-endpoint azurerm create
--name "MyServiceConnection"
--azure-rm-subscription-id ""
--azure-rm-subscription-name ""
--azure-rm-tenant-id ""
--azure-rm-service-principal-id ""
--azure-rm-service-principal-key ""
--output jsonc
PowerShell(Az モジュール)
# ログインとコンテキスト
Connect-AzAccount
Select-AzSubscription -SubscriptionId <SUB_ID>
# 既存 SPN がない場合は発行(RBAC 付与は別途最小権限で)
$sp = New-AzADServicePrincipal -DisplayName "ado-spn-myproject" -Role Reader
# RG 単位で Contributor を付与(最小権限)
New-AzRoleAssignment -ObjectId $sp.Id -RoleDefinitionName "Contributor" -Scope "/subscriptions//resourceGroups/"
5. サービス健全性を確認
- Azure 側のステータスで ARM/API の障害がないか(内規の運用窓口や監視ダッシュボードで確認)
- Azure DevOps のステータスでサービス接続関連の遅延・障害がないか
TF400898のような内部エラーが継続するときはサポートへログを提示(後述のログ採取手順)
6. ネットワーク診断(企業プロキシ/FW)
| 必須ドメイン | 用途 | チェック |
|---|---|---|
dev.azure.com | Azure DevOps API/UI | HTTP/2, WebSocket, TLS 終端の検査無効化を検討 |
management.azure.com | Azure Resource Manager | GET /subscriptions/.../resourcegroups への到達性 |
login.microsoftonline.com | 認証(OAuth2, AAD) | 認証フローが遮断されていないか |
graph.microsoft.com | MS Graph(必要に応じて) | 組織の CA/条件付きアクセスの影響確認 |
疎通テスト例(PowerShell)
# 443 ポート疎通
Test-NetConnection dev.azure.com -Port 443
Test-NetConnection management.azure.com -Port 443
# ARM への生リクエスト(トークン必須)
# ※ 事前に Connect-AzAccount 済み、最新 API バージョンは環境に合わせて
$ctx = Get-AzContext
$token = (Get-AzAccessToken -ResourceUrl "[https://management.azure.com").Token](https://management.azure.com%22%29.Token)
$uri = "[https://management.azure.com/subscriptions/<SUB_ID>/resourcegroups?api-version=2021-04-01](https://management.azure.com/subscriptions/<SUB_ID>/resourcegroups?api-version=2021-04-01)"
Invoke-WebRequest -Headers @{Authorization = "Bearer $token"} -Uri $uri -UseBasicParsing
原因別の深掘りと個別対処
権限不足(RBAC)
RG の列挙はサブスクリプションまたは RG スコープでの読み取り権限が必要です。UI で SPN を自動作成する場合は、ロール割当て操作が入るため Owner または User Access Administrator が必要です。最小権限の原則に則り、パイプライン実行時の権限は原則 RG 単位 Contributor に限定しましょう。 組織のよくある落とし穴
- Azure DevOps 側で Create service connection 権限が拒否設定になっている
- テナントの条件付きアクセス(CA)により UI のトークン更新が中断
- サブスクリプションが「アクセス可能リソース」に表示されているのに、実 RBAC が無い(招待ゲスト/委任の勘違い)
UI/ブラウザの不調
キャッシュ破損や拡張機能の干渉で ARM 呼び出しがブロックされたり、Cookie 設定(SameSite/Lax)により認証情報が付かないことがあります。シークレットモードでの再試行とブラウザ切替が最短の切り分けです。
サービス側の遅延・障害
プラットフォーム側の一時的な 5xx が返っている場合、ローカルの対策では回避できないことがあります。時間をおいて再試行し、再現性が高い場合はサポートに リクエスト ID / 時刻 / 地域 を添えて問い合わせます。
ネットワーク制限
プロキシの SSL インスペクションで TLS ハンドシェイクが書き換えられると、ARM 側で接続が拒否されることがあります。対象ドメインの検査除外や HTTP/2 の強制ダウングレード無効化を検討してください。
RG が存在しない
初期状態で RG が 0 件だと UI 実装によっては“空”を扱いきれず、読み込み中に見えることがあります。空の RG を 1 つ作成してから再試行します。
設計視点:サービス接続の認証方式と最小権限
| 方式 | 特徴 | 権限要件 | 使いどころ |
|---|---|---|---|
| SPN(手動) | 既存アプリ登録とシークレットを入力、審査や棚卸しが容易 | UI 作成時は Reader 程度、実行時は RG Contributor など | 企業ポリシーで自動生成が抑制される環境 |
| SPN(自動) | UI からワンストップ作成、迅速 | Owner / User Access Administrator が必須 | 小規模チーム/検証環境 |
| マネージド ID | シークレットレス、リソース側 ID を利用 | 対象 RG/リソースへの RBAC 付与のみ | 自己ホストエージェントや Azure リソースからの発行 |
再発防止として、サブスクリプション全体の Owner は恒常付与せず、RG 単位での Contributor を原則にする運用を推奨します。
復旧までの実務フロー(テンプレ)
- CLI で列挙できるか:
az group listが成功するなら UI 依存の問題濃厚。 - ブラウザ切替/シークレットモード:Edge→Chrome/Firefox、キャッシュクリア。
- ネットワーク切替:社内ネットワーク→モバイルテザリングで再現するか。
- RG 手入力/一時的に空 RG 作成:入力許容なら進める。RG 0 件なら 1 件作成。
- CLI でバイパス作成:サービス接続を CLI で作る。
- 権限是正:RBAC を最小権限で適正化。UI 自動作成時のみ Owner を一時付与→即剥奪。
ログ採取とサポートに渡す情報
- 発生時刻(UTC とローカル)
- Azure DevOps 組織名/プロジェクト名
- ブラウザ種別・バージョン、拡張機能の有無
- Network タブの失敗リクエスト URL、ステータスコード、レスポンス本文
- ARM 呼び出しの client-request-id 等の相関 ID
- CLI での再現可否(成功/失敗の差分)
よくある質問(FAQ)
Q. サブスクリプションは見えるのに RG だけ出ません。 サブスクリプションへの閲覧権限はあっても RG の列挙権限が不足している場合があります。Reader を付与するか、対象 RG へ Reader 以上を付けてください。
<dt>Q. UI で「自動」作成が失敗します。</dt>
<dd>ロール割り当てに必要な <code>Owner</code>/<code>User Access Administrator</code> が不足しています。既存 SPN の「手動」登録に切り替えるか、一時的に必要権限を付与して作成後に剥奪してください。</dd>
<dt>Q. 会社のプロキシ配下でのみ失敗します。</dt>
<dd><code>dev.azure.com</code> と <code>management.azure.com</code> を検査除外にし、TLS インスペクションや HTTP/2 の制限が影響していないかネットワークチームへ相談してください。</dd>
<dt>Q. RG を作っていないのですが必要ですか?</dt>
<dd>少なくとも 1 件の RG を事前に作成すると UI が安定します。最小 RG を仮で作成してから接続を作り、後で整理しましょう。</dd>
実務で役立つコマンドスニペット集
Azure CLI:RG と RBAC の基本操作
# RG 作成(初期化)
az group create -n <RG_NAME> -l <REGION>
# RG 一覧
az group list --query "[].{name:name, location:location}" --output table
# SPN(アプリ登録)を新規発行(※実運用はセキュリティポリシーに従う)
az ad sp create-for-rbac --name "ado-spn-myproject" --sdk-auth
# SPN に RG Contributor を付与
az role assignment create
--assignee
--role Contributor
--scope /subscriptions//resourceGroups/
Azure DevOps CLI:サービス接続の確認と作成
# 既存サービス接続の一覧
az devops service-endpoint list --query "[].{Name:name, Type:type}" --output table
# ARM サービス接続を作成(既存 SPN)
az devops service-endpoint azurerm create
--name "MyServiceConnection"
--azure-rm-subscription-id ""
--azure-rm-subscription-name ""
--azure-rm-tenant-id ""
--azure-rm-service-principal-id ""
--azure-rm-service-principal-key ""
PowerShell:到達性/TLS の健全性チェック
# TLS 1.2 を強制(古い環境対策)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# ドメイン疎通
Test-NetConnection dev.azure.com -Port 443
Test-NetConnection management.azure.com -Port 443
技術的背景:UI が RG を「無限ロード」する理由
サービス接続のウィザードは、選択済みのサブスクリプション ID とアクセストークンを元に ARM の resourcegroups エンドポイントを呼び、結果を非同期で描画します。ここで下記のいずれかが起きるとスピナーが回り続けます。
- 非同期呼び出しが 403/401 で失敗(権限問題)
- 5xx やネットワークタイムアウトでレスポンスが返らない
- レスポンスが空(0 件)で UI 側が空配列をハンドリングできていない
- ブラウザ拡張/CSP/CORS によりスクリプトが途中でブロック
したがって、CLI で列挙できるかを最初に確認することが、UI 依存か構成問題かの切り分けに非常に有効です。
運用ベストプラクティスと再発防止
- 既存 SPN の活用:企業ポリシーで自動生成が制限される場合、アプリ登録を事前に発行し「手動」オプションで ID/シークレットを入力。
- 最小権限:RG 単位
Contributorを原則にし、サブスクリプション Owner の恒常付与は避ける。 - 初期 RG の用意:新規サブスクリプションでも空の RG を 1 つ置いておく。
- プロジェクト権限の定期棚卸し:Project Administrators と Service connections の作成権限を定期レビュー。
- ネットワーク例外の文書化:プロキシ/FW の除外ドメインと理由を標準化(監査対応)。
ケーススタディ:実際の復旧シナリオ
| 状況 | 原因 | 対処 | 結果 |
|---|---|---|---|
| Edge でのみ RG が出ない | 拡張機能のスクリプト干渉 | 拡張無効+シークレットモード、または Chrome で実施 | 即時解決 |
| UI で自動作成が失敗 | Owner 権限不足 | 一時的に Owner を付与→作成後に剥奪 | 作成成功、最小権限運用に移行 |
| 社内ネットワークのみ失敗 | TLS インスペクション | 対象ドメインを検査除外 | 安定化 |
| サブスクリプション新設直後 | RG が 0 件 | 空の RG を 1 件作成 | UI で選択可能に |
手戻りを減らすチェックシート(印刷推奨)
- CLI で
az group listが成功する - 自分(または SPN)に必要 RBAC が付与されている(UI 自動作成時は Owner/UA Admin、一時付与)
- ブラウザ:シークレットモード試行、別ブラウザ試行、拡張無効
- ネットワーク:
dev.azure.com/management.azure.com/login.microsoftonline.com到達性あり - RG が 1 件以上存在する(なければ作成)
- 最終手段として CLI でサービス接続を作成できる
まとめ
RG が読み込めない問題は、一見 UI の“気まぐれ”に見えても多くは 権限・ネットワーク・UI のどれかに収斂します。CLI での列挙可否 → ブラウザ切替 → ネットワーク → RBAC 是正 → CLI バイパスの順で対処すれば、ほとんどのケースで迅速に復旧可能です。恒常運用では「既存 SPN の活用」「RG 単位 Contributor」「プロジェクト権限の棚卸し」を柱に、最小権限で安定したサービス接続管理を実現しましょう。
付録:トラブルシューティング決定木(テキスト版)
RG 無限ロード発生
├─ CLI で az group list は成功? ── はい ──▶ ブラウザ問題の可能性大:シークレット・他ブラウザ・拡張無効
│ └─ なおらない → ネットワーク(プロキシ/FW)確認
└─ いいえ
├─ RBAC は十分?(Reader / RG Contributor) ── いいえ ──▶ 付与
│ └─ はい
├─ ネットワーク到達性(443/TLS)問題なし? ── いいえ ──▶ 解除または除外設定
│ └─ はい
├─ RG は 1 件以上ある? ── いいえ ──▶ RG 作成
│ └─ はい
└─ サービス側障害の可能性 ──▶ 時間をおいて再試行/サポートへログと相関 ID 提示

コメント