Azure 資源管理者サービス接続を使用して Azure に接続します。

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Azure 資源管理者サービス接続を使用すると、サービス プリンシパル認証または Azure マネージド サービス ID を通じて Azure リソースに接続できます。 資源管理者サービス接続を使用する場合は、毎回認証を行わなくても、パイプラインを使用して Azure App Service アプリなどの Azure リソースにデプロイできます。

Azure 資源管理者サービス接続を使用して Azure に接続するには、複数のオプションがあります。

  • Workload Identity フェデレーションを使用したサービス プリンシパルまたはマネージド ID
  • シークレットを持つサービス プリンシパル
  • エージェント割り当てのマネージド ID

他の種類の接続について学び、接続の作成と使用に関する一般情報を知るには、ビルドとリリース用のサービス接続を参照してください。

Workload Identity フェデレーションを使用する Azure 資源管理者サービス接続を作成します。

Workload identity連邦は、シークレットを使用せずに Microsoft Entra で保護されたリソースに OpenID Connect (OIDC) を使用して認証します。

次のすべての項目がシナリオに当てはまる場合は、このアプローチを使用することをお勧めします。

  • Azure サブスクリプションの所有者ロールが割り当てられている。
  • Azure StackまたはAzure Government Cloudに接続していません。
  • 使用する Marketplace 拡張機能タスクは、Workload Identity フェデレーションをサポートするように更新されます。

新しいワークロード ID フェデレーション サービス接続を作成する

  1. Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。

    詳細については、. プロジェクト設定を開くを参照してください。

  2. 新しいサービス接続を選択し、次にAzure資源管理者を選択します。

    ワークロード ID サービス接続の種類を選択する様子を示すスクリーンショット。

  3. [Workload Identity federation (automatic)] (ワークロード ID フェデレーション (自動)) を選択します。

    ワークロード ID サービス接続の種類を選択する様子示すスクリーンショット。

  4. 次のパラメーターを指定します。

    パラメーター 説明
    サブスクリプション 既存の Azure サブスクリプションを選択します。 Azure サブスクリプションまたはインスタンスが表示されない場合は、「Azure資源管理者サービス接続のトラブルシューティング」を参照してください。
    リソース グループ サブスクリプション内で定義されているすべてのリソースにユーザーがアクセスできるようにするには、空のままにします。 リソースへのユーザー アクセスを制限するには、リソース グループ名を入力します。 これにより、ユーザーは、そのリソース グループに定義されているリソースにのみアクセスできるようになります。
    サービス接続名 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 Azure サブスクリプションの名前ではありません。
  5. 新しいサービス接続が作成されたら、接続名をコピーし、azureSubscriptionの値としてコードに貼り付けます。

  6. 特定の Azure リソースにデプロイするには、タスクにはそのリソースに関する追加のデータが必要です。 Azure portal のリソースに移動し、データをコードにコピーします。 たとえば、Web アプリをデプロイするには、Azure App Service アプリの名前をコピーし、WebAppName の値としてコードに貼り付けます。

Workload Identity フェデレーションを使用するように既存の Azure 資源管理者サービス接続を変換します

既存の Azure 資源管理者サービス接続を、サービス プリンシパルの代わりに認証に Workload Identity フェデレーションを使用するように簡単に変換できます。 サービス接続が次の要件を満たしている場合、Azure DevOps でサービス接続変換ツールを使用できます。

  • Azure DevOps は最初にサービス接続を作成しました。 サービス接続を手動で作成する場合、Azure DevOps には独自の資格情報を変更するアクセス許可がないため、サービス接続変換ツールを使用してサービス接続を変換することはできません。
  • サービス接続を使用するプロジェクトは 1 つだけです。 プロジェクト間のサービス接続は変換できません。

サービス接続を変換するには:

  1. Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。

    詳細については、. プロジェクト設定を開くを参照してください。

  2. Workload Identity を使用するように変換するサービス接続を選択します。

  3. 変換 を選択します。

    フェデレーション資格情報の変換を選択する様子を示すスクリーンショット。

    有効期限が切れたシークレットを持つ既存のサービス プリンシパルの資格情報がある場合は、変換するための別のオプションが表示されます。

    有効期限が切れた認定資格証があるときに、フェデレーション資格情報を使用するように変換するオプションを示すスクリーンショット。

  4. もう一度 [変換] を選択して、新しいサービス接続を作成することを確認します。

    変換には数分かかる場合があります。 接続を元に戻したい場合は、7 日以内に元に戻す必要があります。

スクリプトを使用して複数の Azure 資源管理者サービス接続を変換します

スクリプトを使用して複数のサービス接続を一度に更新し、認証にワークロード ID フェデレーションを使用します。

このサンプル PowerShell スクリプトでは、Azure DevOps 組織 (例: https://dev.azure.com/fabrikam-tailspin) と Azure DevOps プロジェクト (例: Space game web agent) の 2 つのパラメーターが必要です。 その後、スクリプトでは Azure DevOps プロジェクトと組織の関連付けられているサービス接続を取得します。 ワークロード ID フェデレーションを使用しない、関連付けられている各サービス接続の変換を確定するメッセージが表示されます。 確定すると、スクリプトでは Azure DevOps REST API を使用して、ワークロード ID フェデレーションを使用するように各サービス接続を更新します。 このスクリプトを実行するには、PowerShell 7.3 以降Azure CLI が必要です。 スクリプトを .ps1 ファイルに保存し、PowerShell 7 を使用して実行します。

#!/usr/bin/env pwsh
<# 
.SYNOPSIS 
    Convert multiple Azure Resource Manager service connection(s) to use Workload identity federation

.LINK
    https://aka.ms/azdo-rm-workload-identity-conversion

.EXAMPLE
    ./convert_azurerm_service_connection_to_oidc_simple.ps1 -Project <project> -OrganizationUrl https://dev.azure.com/<organization>
#> 

#Requires -Version 7.3

param ( 
    [parameter(Mandatory=$true,HelpMessage="Name of the Azure DevOps Project")]
    [string]
    [ValidateNotNullOrEmpty()]
    $Project,

    [parameter(Mandatory=$true,HelpMessage="Url of the Azure DevOps Organization")]
    [uri]
    [ValidateNotNullOrEmpty()]
    $OrganizationUrl
) 
$apiVersion = "7.1"
$PSNativeCommandArgumentPassing = "Standard" 

#-----------------------------------------------------------
# Log in to Azure
$azdoResource = "499b84ac-1321-427f-aa17-267ca6975798" # application id of Azure DevOps 
az login --allow-no-subscriptions --scope ${azdoResource}/.default
$OrganizationUrl = $OrganizationUrl.ToString().Trim('/')

#-----------------------------------------------------------
# Retrieve the service connection
$getApiUrl = "${OrganizationUrl}/${Project}/_apis/serviceendpoint/endpoints?authSchemes=ServicePrincipal&type=azurerm&includeFailed=false&includeDetails=true&api-version=${apiVersion}"
az rest --resource $azdoResource -u "${getApiUrl} " -m GET --query "sort_by(value[?authorization.scheme=='ServicePrincipal' && data.creationMode=='Automatic' && !(isShared && serviceEndpointProjectReferences[0].projectReference.name!='${Project}')],&name)" -o json `
        | Tee-Object -Variable rawResponse | ConvertFrom-Json | Tee-Object -Variable serviceEndpoints | Format-List | Out-String | Write-Debug
if (!$serviceEndpoints -or ($serviceEndpoints.count-eq 0)) {
    Write-Warning "No convertible service connections found"
    exit 1
}

foreach ($serviceEndpoint in $serviceEndpoints) {
    # Prompt user to confirm conversion
    $choices = @(
        [System.Management.Automation.Host.ChoiceDescription]::new("&Convert", "Converting service connection '$($serviceEndpoint.name)'...")
        [System.Management.Automation.Host.ChoiceDescription]::new("&Skip", "Skipping service connection '$($serviceEndpoint.name)'...")
        [System.Management.Automation.Host.ChoiceDescription]::new("&Exit", "Exit script")
    )
    $prompt = $serviceEndpoint.isShared ? "Convert shared service connection '$($serviceEndpoint.name)'?" : "Convert service connection '$($serviceEndpoint.name)'?"
    $decision = $Host.UI.PromptForChoice([string]::Empty, $prompt, $choices, $serviceEndpoint.isShared ? 1 : 0)

    if ($decision -eq 0) {

        Write-Host "$($choices[$decision].HelpMessage)"
    } elseif ($decision -eq 1) {
        Write-Host "$($PSStyle.Formatting.Warning)$($choices[$decision].HelpMessage)$($PSStyle.Reset)"
        continue 
    } elseif ($decision -ge 2) {
        Write-Host "$($PSStyle.Formatting.Warning)$($choices[$decision].HelpMessage)$($PSStyle.Reset)"
        exit 
    }

    # Prepare request body
    $serviceEndpoint.authorization.scheme = "WorkloadIdentityFederation"
    $serviceEndpoint.data.PSObject.Properties.Remove('revertSchemeDeadline')
    $serviceEndpoint | ConvertTo-Json -Depth 4 | Write-Debug
    $serviceEndpoint | ConvertTo-Json -Depth 4 -Compress | Set-Variable serviceEndpointRequest
    $putApiUrl = "${OrganizationUrl}/${Project}/_apis/serviceendpoint/endpoints/$($serviceEndpoint.id)?operation=ConvertAuthenticationScheme&api-version=${apiVersion}"
    # Convert service connection
    az rest -u "${putApiUrl} " -m PUT -b $serviceEndpointRequest --headers content-type=application/json --resource $azdoResource -o json `
            | ConvertFrom-Json | Set-Variable updatedServiceEndpoint

    $updatedServiceEndpoint | ConvertTo-Json -Depth 4 | Write-Debug
    if (!$updatedServiceEndpoint) {
        Write-Debug "Empty response"
        Write-Error "Failed to convert service connection '$($serviceEndpoint.name)'"
        exit 1
    }
    Write-Host "Successfully converted service connection '$($serviceEndpoint.name)'"
}

サービス プリンシパル シークレットを使用する既存の Azure 資源管理者サービス接続を元に戻します

変換された自動サービス接続は、そのシークレットを使用して 7 日間元に戻すことができます。 7 日後、新しいシークレットを手動で作成します。

サービス接続を手動で作成して変換した場合、Azure DevOps には独自の資格情報を変更するアクセス許可がないため、サービス接続変換ツールを使用してサービス接続を元に戻すことはできません。

サービス接続を元に戻すには:

  1. Azure DevOps プロジェクトで、パイプライン> サービスに移動します。

  2. 元に戻す既存のサービス接続を選択します。

  3. [Revert conversion to the original scheme] (変換を元のスキーマに戻す) を選択 します。

    フェデレーション資格情報を元に戻すことを選択する様子を示すスクリーンショット。

  4. もう一度 [元に戻す] を選んで選択を確定します。

サービス プリンシパル シークレットを使用する Azure Resource Manager サービス接続を作成します

次のすべての項目がシナリオに当てはまる場合は、このアプローチを使用することをお勧めします。

  • Azure Pipelines 組織および Azure サブスクリプションの所有者としてサインインしている。
  • ユーザーがサービス接続を通じてアクセスする Azure リソースのアクセス許可をさらに制限する必要はありません。
  • Azure StackまたはAzure Government Cloudに接続していません。
  • Azure DevOps Server 2019 または以前のバージョンの Team Foundation Server から接続していません。

サービス接続を作成するには:

  1. Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。

    Team Foundation Server で、上部のメニュー バーにある 設定 アイコンを選択して、 サービス ページに移動します。

    詳細については、. プロジェクト設定を開くを参照してください。

  2. 新しいサービス接続を選択し、次にAzure資源管理者を選択します。

    サービス接続の種類を選択する様子を示すスクリーンショット。

  3. 次のパラメータを入力または選択します。

    パラメーター 説明
    Connection Name 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 Azure サブスクリプションの名前ではありません。
    スコープのレベル サブスクリプションまたは管理グループを選択します。 管理グループは、複数のサブスクリプションのアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。
    サブスクリプション スコープとしてサブスクリプション を選択した場合は、既存の Azure サブスクリプションを選択します。 Azure サブスクリプションまたはインスタンスが表示されない場合は、「Azure資源管理者サービス接続のトラブルシューティング」を参照してください。
    管理グループ スコープとして管理グループを選択した場合は、既存の Azure 管理グループを選択します。 詳細については、管理グループの作成を参照してください。
    リソース グループ サブスクリプション内で定義されているすべてのリソースにユーザーがアクセスできるようにするには、空のままにします。 リソースへのユーザー アクセスを制限するには、リソース グループ名を入力します。 これにより、ユーザーは、そのリソース グループに定義されているリソースにのみアクセスできるようになります。
  4. 新しいサービス接続が作成されたら、次の手順に従います。

    • クラシック エディターを使用する場合は、パイプラインの Azure サブスクリプション設定で割り当てた接続名を選択します。
    • YAML ファイルを使用する場合は、接続名を azureSubscriptionの値としてコードにコピーします。
  5. 特定の Azure リソースにデプロイするには、リソースに関する詳細情報をタスクに追加します。

    • クラシック エディターを使用する場合は、タスクに追加するデータを選択します。 たとえば、App Service 名を選択します。
    • YAML ファイルを使用する場合は、Azure portal のリソースに移動します。 必要なデータをコピーし、タスク コードに貼り付けます。 たとえば、Web アプリをデプロイするには、App Service アプリの名前をコピーし、それをタスク YAML のWebAppNameの値として貼り付けます。

メモ

このアプローチに従うと、Azure DevOps は Azure Microsoft Entra ID と接続し、3 か月間有効なシークレットを含むアプリ登録を作成します。 サービス接続の有効期限が近づくと、Microsoft Entra ID に次のプロンプトが表示されます: 証明書またはシークレットの有効期限が間もなく切れます。新しいものを作成してください。 このシナリオでは、サービス接続を更新する必要があります。

サービス接続を更新するには、Azure DevOps ポータルで接続を編集し、検証を選択します。 編集内容を保存すると、サービス接続はさらに 3 か月間有効になります。

シークレットを作成する代わりに、Workload Identity フェデレーションを使用することをお勧めします。 Workload Identity フェデレーションを使用する場合、シークレットをローテーションする必要はなく、アプリの登録によって本来の目的が維持されます。 ワークロード ID フェデレーションの使用を開始するには、サービス接続の詳細ページに移動し、[変換] を選択します。 サービス接続は、シークレットの代わりに Workload Identity フェデレーションを使用するように変換されます。 詳細については、Workload Identity フェデレーションを使用するように既存の Azure 資源管理者サービス接続を変換するを参照してください。

詳細については、Azure資源管理者サービス接続のトラブルシューティングを参照してください。

このアプローチの使用に問題がある場合 (ドロップダウン リストにサブスクリプションが表示されないなど)、またはユーザーのアクセス許可をさらに制限したい場合は、代わりにサービス プリンシパルまたは仮想マシンを使用できます。 マネージド サービス ID

既存のサービス プリンシパルを使用する Azure 資源管理者サービス接続を作成します

  1. 定義済みのアクセス許可のセットを使用する必要があり、この目的のためにサービス プリンシパルがまだ定義されていない場合は、次のチュートリアルのいずれかに従って新しいサービス プリンシパルを作成します。

  2. Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。

    Team Foundation Server で、上部のメニュー バーにある 設定 アイコンを選択して、 サービス ページに移動します。

    詳細については、. プロジェクト設定を開くを参照してください。

  3. 新しいサービス接続を選択し、次にAzure資源管理者を選択します。

    サービス接続の種類を選択する様子を示すスクリーンショット。

  4. サービス プリンシパル (手動)オプションを選択し、サービス プリンシパルの詳細を入力します。

    サービス ダイアログの完全バージョンを開く様子を示すスクリーンショット。

  5. 接続名に、このサービス接続を参照するために使用する表示名を入力します。

  6. 環境では、環境名(Azure CloudAzure Stack、またはAzure Government Cloudを選択します。

  7. Azure Cloud を選択しない場合は、環境 URL を入力します。 Azure Stack の場合、環境 URL はhttps://management.local.azurestack.externalのようになります。

  8. スコープ レベルで、接続のスコープを選択します。

    • サブスクリプションを選択した場合は、既存の Azure サブスクリプションを選択します。 Azure サブスクリプションまたはインスタンスが表示されない場合は、「Azure資源管理者サービス接続のトラブルシューティング」を参照してください。
    • 管理グループを選択した場合は、既存の Azure 管理グループを選択します。 詳細については、管理グループの作成を参照してください。
  9. Azure サブスクリプション ダイアログで、サービス プリンシパルに関する次の情報を入力します。

    • サブスクリプション ID
    • サブスクリプション名
    • サービス プリンシパル ID
    • サービス プリンシパル クライアント キー、または証明書を選択した場合は、*.pem ファイルの証明書セクションと秘密キー セクションの両方の内容を入力します。
    • テナント ID

    この情報は、Azure PowerShell スクリプトをダウンロードして実行することで取得できます。 プロンプトが表示されたら、サブスクリプション名、パスワード、ロール (オプション)、およびクラウドの種類 (Azure Cloud (既定)、Azure Stack、Azure Government Cloud など) を入力します。

  10. 接続を確認するを選択して、入力した設定を検証します。

  11. 新しいサービス接続が作成されたら、次の手順に従います。

    • UI でサービス接続を使用する場合は、パイプラインのAzure サブスクリプション設定で割り当てた接続名を選択します。
    • YAML ファイルでサービス接続を使用する場合は、接続名をコピーし、azureSubscriptionの値としてコードに貼り付けます。
  12. 必要に応じて、サービス プリンシパルを変更して、適切なアクセス許可を公開します。

    サービス プリンシパルを使用した認証についての詳細については、Azure サブスクリプション リソースへのアクセスを管理するためのロールベースのアクセス制御の使用、または ブログ記事Visual Studio でサービス プリンシパルを使用して Azure リソース グループの展開を自動化する 、もしくはを参照してください。

詳細については、Azure Resource Manager サービス接続のトラブルシューティングを参照してください。

マネージド サービス ID を使用する VM への Azure Resource Manager サービス接続を作成します

メモ

マネージド サービス ID を使用して認証するには、Azure 仮想マシン (VM) 上でセルフホステッド エージェントを使用する必要があります。

Microsoft Entra ID のAzure マネージド サービス IDを使用するように Azure VM ベースのエージェントを構成できます。 このシナリオでは、Azure VM ベースのエージェントに、Azure DevOps の接続のために資格情報を永続化する代わりに、Microsoft Entra ID をサポートする Azure Key Vault のインスタンスなどの任意の Azure リソースへのアクセス権を付与するために、システム割り当ての ID (サービス プリンシパル) を使用します。

  1. Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。

    Team Foundation Server で、上部のメニュー バーにある 設定 アイコンを選択して、 サービス ページに移動します。

    詳細については、. プロジェクト設定を開くを参照してください。

  2. 新しいサービス接続を選択し、次にAzure資源管理者を選択します。

    サービス接続の種類を選択する様子を示すスクリーンショット。

  3. [マネージド ID の認証] オプションを選択します。

    マネージド サービス ID の設定に移動する様子を示すスクリーンショット。

  4. 接続名には、このサービス接続を参照する際に使用する表示名を入力します。

  5. 環境では、環境名(Azure CloudAzure Stack、またはAzure Government Cloudを選択します。

  6. 接続ダイアログで、サブスクリプションから次の値を入力します。

    • サブスクリプション ID
    • サブスクリプション名
    • テナント ID
  7. 新しいサービス接続が作成されたら、次の手順に従います。

    • UI でサービス接続を使用する場合は、パイプラインのAzure サブスクリプション設定で割り当てた接続名を選択します。
    • YAML ファイルでサービス接続を使用する場合は、接続名を azureSubscriptionの値としてコードにコピーします。
  8. VM (エージェント) に適切なアクセス許可があることを確認します。

    たとえば、コードで Azure 資源管理者を呼び出す必要がある場合は、Microsoft Entra ID のロールベースのアクセス制御 (RBAC) を使用して、VM に適切なロールを割り当てます。

    詳細については、Azure リソースの管理された ID をどのように使用できますか?、および Azure サブスクリプションのリソースへのアクセスを管理するためのロールベースのアクセス制御の使用を参照してください。

プロセスの詳細については、Azure Resource Manager サービス接続のトラブルシューティングを参照してください。

Azure Government クラウドに接続する

Azure Government Cloud への接続については、「Azure Pipelines から接続する (Azure Government Cloud)」を参照してください。

Azure Stack への接続

Azure Stack への接続については、次の記事を参照してください:

ヘルプとサポート