Azure Pipelines の「There was a resource authorization issue」:サービス接続の名前に変数、合わない名前、無効か未承認の接続
ステージが始まる前に、Azure Pipelines はそのジョブが使うサービス接続・セキュア ファイル・変数グループ・エージェントプールを探し、このパイプラインが使ってよいかを確かめます。どれかが見つからない、無効になっている、または承認されていないと、実行はここで落ちます。references service connection の後ろの名前を読みます。$(なにか) のままなら、名前はパイプラインがまだ値を持っていない変数から来ていて、テンプレートのパラメーターで直ります。そうでなければ、Project settings → Service connections から名前をそのまま写し、パイプラインを承認します(このメッセージについての Stack Overflow の質問は1万1千回以上見られています)。
これでプルリクエストのビルド検証が落ちると、ビルドは最初のステージの前で落ち、実行が通るまでプルリクエストは完了できません:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、そのプルリクエストのブランチ ポリシーを状態つきで IDE に並べるので、落ちた必須のビルドが、それを待っているプルリクエストの横に出ます。JetBrains Marketplace で入れる
どう見えるか
There was a resource authorization issue: "The pipeline is not valid. Job Deploy: Step AzureCLI input connectedServiceNameARM references service connection my-azure which could not be found. The service connection does not exist, has been disabled or has not been authorized for use. For authorization details, refer to https://aka.ms/yamlauthz."- 読むのは3つです。ジョブとステップ、入力(
connectedServiceNameARMはタスクのazureSubscriptionのこと。ほかにbackendServiceArm・kubernetesServiceConnection・containerRegistry)、そしてreferences service connectionの後ろの名前です。名前はパイプラインが持っていたとおりに出ます。 - 同じメッセージが、セキュア ファイル(
input secureFile references secure file file_B.txt which could not be found)、変数グループ(Variable group was not found or is not authorized for use)、プール(Could not find a pool with the name ... The pool does not exist or has not been authorized for use)についても出ます。 - メッセージのリンクは Microsoft の リソースの承認を開きます。順番は Microsoft の パイプラインの実行にあります。まずテンプレートとテンプレート式、次に選ばれたステージごとに、すべてのジョブのリソースの確認、その後でやっとジョブ、その条件、そのステップです。
名前が $(...) のまま:接続の名前に変数
- メッセージが
references service connection $(serviceConnection)なら、パイプラインは変数の値を持つ前に接続を確かめています。Microsoft ははっきり、変数ではサービス接続や環境の名前を決められないと書いています。リソースの承認はステージが始まる前で、ステージとジョブの変数はまだなく、変数グループはそれ自体がリソースなので、その値もまだないからです。前のジョブやタスクの出力変数、ログのコマンドで設定した値は、さらに後です。 - テンプレートのパラメーターとランタイム パラメーターは最初の段で、YAML の文字のまま決まります。なので
$(serviceConnection)が通らないところで${{ parameters.serviceConnection }}は通ります(ランタイム パラメーター):
parameters:
- name: serviceConnection
type: string
default: azure-dev
values:
- azure-dev
- azure-prod
steps:
- task: AzureCLI@2
inputs:
azureSubscription: ${{ parameters.serviceConnection }}
scriptType: bash
scriptLocation: inlineScript
inlineScript: az account show
- ステージごとに別の接続を使いたいとき(Stack Overflow の質問で9千回近く):ステージをテンプレートにして、接続をパラメーターにし、ステージごとに自分の値でテンプレートを呼びます。各ステージの下の変数は、上の理由で通りません。
- パイプライン自身のいちばん上の
variables:に書いた値は使えます。前のタスクの出力から Azure サブスクリプションを取るときについて、Microsoft の Azure Resource Manager の接続のトラブルシューティングは、値をパイプラインの variables のセクションに定義するよう書いています。 - パラメーターで選べる接続も、名前で書いた接続と同じく、どれもパイプラインに承認されている必要があります。
このプロジェクトの接続と合わない名前
- 入力に書くのは、Project settings → Service connections に出ているサービス接続の名前です(サービス接続を使う)。Azure サブスクリプションの名前、サブスクリプション ID、Microsoft Entra ID のアプリの登録の名前では見つかりません。その一覧から名前を写します。
- テンプレートに分けたパイプラインでは、メッセージの名前はテンプレートを展開した後の値です。テンプレートだけなら動くときは、呼び出す側のパイプラインが何を渡しているかを見ます。
- 別のプロジェクトのテンプレートは、呼び出したパイプラインのプロジェクトで動きます。サービス接続は、既定ではほかのプロジェクトと共有されていません。組織のレベルの管理者が共有できます:その接続 → Security → Project permissions → Add projects。共有された接続の名前は、相手のプロジェクトではプロジェクトの名前が後ろに付き、そこで名前を変えることもできるので、呼び出す側のプロジェクトに出ている名前を使います(サービス接続のプロジェクトのアクセス許可)。
無効になった接続
- メッセージは、接続が無効になっている(disabled)こともあると言っています。サービス接続の管理者と Project Administrators は、接続の More options のメニューで Disable を選べ、それを使うパイプラインは、誰かが同じメニューで Enable を選ぶまで落ちます。
- Azure Pipelines が、100日使われていない接続を自分で無効にすることもあります。サービス接続の一覧と接続のページに無効と出て、無効にした時と有効にした時は Audit log に残ります(サービス接続の編集、2026年10月15日の更新)。年に数回しか動かないデプロイだけが使う接続は、この100日に届くことがあります。
- 確かめるには、Project settings → Service connections からその接続を開きます。Overview と Usage history のタブに、無効になっていることと最後に使われた日が出ます(Microsoft のトラブルシューティング)。
パイプラインが承認されていない接続
- Microsoft の手順:そのリソースで少なくとも User の役割を持っていることを確かめ、落ちた実行でリソースを承認する選択肢を選び、新しい実行を始めます。
- 前もって承認するには、接続の Security → Pipeline permissions にパイプラインを足します。Grant access permission to all pipelines もありますが、Microsoft は勧めていません(パイプラインを承認する)。
- 実行が落ちずに View と Permit で待っているなら、同じ確認のもう一方の側です:「This pipeline needs permission to access a resource before this run can continue」。リソースの種類ごとに、誰が Permit を選べるかを書いています。
セキュア ファイル、変数グループ、プール
- セキュア ファイルも接続と同じです:
references secure file $(CertSecureFile)は、パイプラインがまだ値を持っていない変数です。condition:で飛ばすはずのステップも、そのセキュア ファイルは確かめられます。確認が条件の評価より前だからです(一部の実行でだけセキュア ファイルを取りたいという Stack Overflow の質問)。ファイルを外すには、パラメーターに対する${{ if }}でステップごと取り除きます。これはテンプレートを展開する時に起きます。 Variable group was not found or is not authorized for use:- group:の下の名前が、パイプラインのプロジェクトの Pipelines → Library にある変数グループと合っている必要があり、YAML のパイプラインはそのグループを使う承認を受けている必要があります(Pipelines の画面での承認)。Could not find a pool with the name ...:pool:の下の名前が、パイプラインのプロジェクトの Project settings → Agent pools にあるプールの1つで、そのプールがこのパイプラインを許している必要があります。名前は合っていてもジョブに合うエージェントがいないプールは、別のメッセージで落ちます:「No agent found in pool ... which satisfies the specified demands」。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエスト
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。組織・プロジェクト・リポジトリを git のリモートから読み、自分のレビューを待っているプルリクエストを IDE のツールウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも使えます。プルリクエストのブランチ ポリシーを状態つきで並べるので、まだ通っていない必須のビルドがそのプルリクエストの横に出ます。必須のポリシーが通っていないときは、完了の画面がまず自動完了を勧めます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps・Azure Pipelines・Microsoft Entra ID は Microsoft Corporation の商標、IntelliJ IDEA・Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:Permit を待っている実行 · プールに demand を満たすエージェントがいない · Microsoft ホストの並列ジョブがまだない · English