次の方法で共有


Azure Resource Manager サービス接続を使用して Azure に接続する

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

新しい Azure サービス接続の作成エクスペリエンスをロールアウトしています。 組織で受け取る方法はさまざまな要因によって異なり、以前のユーザー エクスペリエンスが引き続き表示される場合があります。

Azure Resource Manager サービス接続を使用すると、パイプラインから Azure Key Vault などの Azure リソースに接続できます。 この接続により、パイプラインを使用して、毎回認証する必要なく、Azure App Service アプリなどの Azure リソースにデプロイできます。

Azure Resource Manager サービス接続を使用して Azure に接続するための認証オプションは複数あります。 アプリの登録またはマネージド ID のいずれかでワークロード ID フェデレーション を使用することをお勧めします。 ワークロード ID フェデレーションにより、シークレットとシークレット管理の必要がなくなります。

推奨されるオプション:

ワークロード ID フェデレーションを使用しない他の Azure Resource Manager サービス接続認証オプションがあります。 これらのオプションは、下位互換性とエッジ ケースに使用でき、推奨されません。 サービス接続を初めて設定する場合は、ワークロード ID フェデレーションを使用します。 既存のサービス接続がある場合は、サービス接続を最初にワークロード ID フェデレーションを使用するように変換してみてください

ワークロード ID フェデレーションを使用してアプリ登録を作成する (自動)

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

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

この選択により、Azure DevOps は、接続するサブスクリプション、管理グループ、または Machine Learning ワークスペースに対して自動的にクエリを実行し、認証用のワークロード ID フェデレーションを作成します。

  1. Azure DevOps プロジェクトで、 プロジェクト設定>Service 接続に移動します。

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

  2. [ 新しいサービス接続] を選択し、[ Azure Resource Manager ] と [次へ] を選択します。

    Azure Resource Manager の選択を示すスクリーンショット。

  3. 資格情報ワークロード ID フェデレーションを使用したアプリ登録 (自動) を選択します。

    ワークロード ID が選択されたアプリ登録 (自動) 認証方法の選択のスクリーンショット。

  4. スコープ レベルを選択します。 [サブスクリプション]、[管理グループ]、または [Machine Learning ワークスペース] を選択します。 管理グループ は、複数のサブスクリプションにわたるアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。 Machine Learning ワークスペースは、機械学習成果物を作成するための場所です。

    • サブスクリプション スコープには、次のパラメーターを入力します。

      パラメーター 説明
      予約 必須。 Azure サブスクリプションを選択します。
      リソース グループ 省略可能。 Azure リソース グループを選択します。
    • 管理グループスコープで、Azure 管理グループを選択します。

    • Machine Learning ワークスペーススコープの場合は、次のパラメーターを入力します。

      パラメーター 説明
      予約 必須。 Azure サブスクリプションを選択します。
      リソース グループ 必須。 ワークスペースを含むリソース グループを選択します。
      Machine Learning ワークスペース 必須。 Azure Machine Learning ワークスペースを選択します。
  5. サービス接続名を入力します。

  6. 必要に応じて、サービス接続の説明を入力します。

  7. [ すべてのパイプラインにアクセス許可を付与する ] を選択すると、すべてのパイプラインでこの接続が使用されます。 "このオプションは推奨されません"。 代わりに、 サービス接続を使用するように各パイプラインを個別に承認します

  8. [保存] を選択します

既存のユーザー割り当てマネージド ID のサービス接続を作成する

このオプションは、既存のユーザー割り当てマネージド ID 用のワークロード ID 資格情報を自動的に作成する場合に使用します。 開始する前に、 既存のユーザー割り当てマネージド ID が 必要です。

  1. Azure DevOps プロジェクトで、 プロジェクト設定>Service 接続に移動します。

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

  2. [ 新しいサービス接続] を選択し、[ Azure Resource Manager ] と [次へ] を選択します。

    Azure Resource Manager の選択を示すスクリーンショット。

  3. [ マネージド ID] を選択します

    ユーザー割り当て ID を持つマネージド ID の Azure Resource Manager の選択を示すスクリーンショット。

  4. 手順 1: マネージド ID の詳細:

    1. マネージド ID のサブスクリプションを選択します。 これは、マネージド ID を含む Azure サブスクリプションです。
    2. マネージド ID のリソース グループを選択します。 これは、マネージド ID を含むリソース グループです。
    3. [ マネージド ID] を選択します。 これは、リソースにアクセスするために使用するリソース グループ内のマネージド ID です。
  5. 手順 2: Azure スコープ:

    1. スコープ レベルを選択します。 [サブスクリプション]、[管理グループ]、または [Machine Learning ワークスペース] を選択します。 管理グループ は、複数のサブスクリプションにわたるアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。 Machine Learning ワークスペースは、機械学習成果物を作成するための場所です。

      • サブスクリプション スコープには、次のパラメーターを入力します。

        パラメーター 説明
        サービス接続のサブスクリプション 必須。 マネージド ID でアクセスする Azure サブスクリプション名を選択します。
        サービス接続のリソース グループ 省略可能。 マネージド ID アクセスを 1 つのリソース グループに制限する場合に入力します。
      • 管理グループスコープには、次のパラメーターを入力します。

        パラメーター 説明
        管理グループ 必須。 Azure 管理グループを選択します。
      • Machine Learning ワークスペーススコープの場合は、次のパラメーターを入力します。

        パラメーター 説明
        予約 必須。 Azure サブスクリプション名を選択します。
        サービス接続のリソース グループ 省略可能。 ワークスペースを含むリソース グループを選択します。
        ML ワークスペース ワークスペース 必須。 既存の Azure Machine Learning ワークスペースの名前を入力します。
    2. 手順 3: サービス接続の詳細: セクションで、次のパラメーターを入力または選択します。

      パラメーター 説明
      サービス接続名 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 Azure サブスクリプションの名前ではありません。
      サービス管理リファレンス 省略可能。 ITSM データベースからのコンテキスト情報。
      説明 省略可能。 サービス接続の説明を入力します。
    3. [ セキュリティ ] セクションで、[ すべてのパイプラインにアクセス許可を付与 する] を選択して、すべてのパイプラインがこのサービス接続を使用できるようにします。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。

    4. [ 保存] を 選択して、サービス接続を検証して作成します。

ワークロード ID フェデレーションを使用するように既存のサービス接続を変換する

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

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

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

  1. Azure DevOps プロジェクトで、 プロジェクト設定>Service 接続に移動します。

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

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

  3. 変換を選択します。

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

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

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

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

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

スクリプトを使用して複数のサービス接続を変換する

スクリプトを使用して複数のサービス接続を一度に更新し、認証にワークロード 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)'"
}

シークレットを使用する既存のサービス接続を元に戻す

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

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

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

  1. Azure DevOps プロジェクトで、 Pipelines>Service 接続に移動します。

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

  3. [ 元のスキームへの変換を元に戻す] を選択します

    フェデレーション資格情報の [元に戻す] の選択を示すスクリーンショット。

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

既存のサービス プリンシパルを使用するサービス接続を作成する

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

既存のサービス プリンシパルを使用するサービス接続を作成するには、次のようにします。

  1. Azure DevOps プロジェクトで、 プロジェクト設定>Service 接続に移動します。

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

  2. [ 新しいサービス接続] を選択し、[ Azure Resource Manager ] と [次へ] を選択します。

    Azure Resource Manager の選択を示すスクリーンショット。

  3. [ サービス プリンシパル (手動)][次へ] を選択します。

    サービス プリンシパル (手動) 認証方法の選択を示すスクリーンショット。

  4. [ 新しい Azure サービス接続 ] ダイアログで、[ 環境] を選択します。 Azure Stack を選択した場合は、環境 URL を入力します。これは、https://management.local.azurestack.externalのようなものです。

  5. スコープ レベルを選択します。 [サブスクリプション] または [管理グループ] を選択します。 管理グループ は、複数のサブスクリプションにわたるアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。

    • サブスクリプション スコープには、次のパラメーターを入力します。

      パラメーター 説明
      サブスクリプション ID 必須。 Azure サブスクリプション ID を入力します。
      サブスクリプション名 必須。 Azure サブスクリプション名を入力します。
    • 管理グループスコープには、次のパラメーターを入力します。

      パラメーター 説明
      管理グループ ID 必須。 Azure 管理グループ ID を入力します。
      管理グループ名 必須。 Azure 管理グループ名を入力します。
  6. [ 認証 ] セクションで、次のパラメーターを入力または選択します。

    パラメーター 説明
    サービス プリンシパル ID 必須。 サービス プリンシパル ID を入力します。
    資格 [サービス プリンシパル キー] または [証明書] を選択します。 [サービス プリンシパル キー] を選択した場合は、キー (パスワード) を入力します。 [ 証明書] を選択した場合は、証明書を入力します。
    テナント ID 必須。 テナント ID を入力します。
    確かめる 入力した設定を検証する場合に選択します。
  7. [詳細] セクションで次のパラメーターを入力します。

    パラメーター 説明
    接続名 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 Azure サブスクリプションの名前ではありません。
    説明 省略可能。 サービス接続の説明を入力します。
    安全 すべてのパイプラインでこのサービス接続を使用できるようにするには、[ すべてのパイプラインにアクセス許可を付与 する] を選択します。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。
  8. [ 確認して保存] を選択して、サービス接続を検証して作成します。

ヘルプとサポート