Azure DevOpsのサービス接続でリソースグループが読み込めない時の原因と対処法|権限・ブラウザ・ネットワーク・CLI完全ガイド

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.comAzure DevOps API/UIHTTP/2, WebSocket, TLS 終端の検査無効化を検討
management.azure.comAzure Resource ManagerGET /subscriptions/.../resourcegroups への到達性
login.microsoftonline.com認証(OAuth2, AAD)認証フローが遮断されていないか
graph.microsoft.comMS 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 を原則にする運用を推奨します。

復旧までの実務フロー(テンプレ)

  1. CLI で列挙できるか:az group list が成功するなら UI 依存の問題濃厚。
  2. ブラウザ切替/シークレットモード:Edge→Chrome/Firefox、キャッシュクリア。
  3. ネットワーク切替:社内ネットワーク→モバイルテザリングで再現するか。
  4. RG 手入力/一時的に空 RG 作成:入力許容なら進める。RG 0 件なら 1 件作成。
  5. CLI でバイパス作成:サービス接続を CLI で作る。
  6. 権限是正: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 提示

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次