Azure Resource Manager サービス接続を使用して Azure に接続する
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Azure Resource Manager サービス接続を使用すると、パイプラインから Azure Key Vault などの Azure リソースに接続できます。 この接続により、パイプラインを使用して、毎回認証する必要なく、Azure App Service アプリなどの Azure リソースにデプロイできます。
Azure Resource Manager サービス接続を使用して Azure に接続するための認証オプションは複数あります。 推奨されるオプションは、アプリ登録またはマネージド ID と共にワークロード ID フェデレーションを使用することです。
推奨される Azure Resource Manager サービス接続オプションは次のとおりです。
- ワークロード ID フェデレーションまたはシークレットを使用したアプリ登録 (自動)
- ワークロード ID フェデレーション資格情報を作成し、既存のユーザー割り当てマネージド ID に接続するマネージド ID。 アプリ登録を作成するアクセス許可がない場合は、このオプションを使用します。
この記事には含まれていませんが、ほかにも次のような Azure Resource Manager サービス接続認証オプションがあります。
Azure Resource Manager アプリ登録を作成する (自動)
Azure Resource Manager サービス接続を作成するときは、2 種類の資格情報 (ワークロード ID フェデレーションまたはシークレット) から選択します。
ワークロード ID フェデレーションを使用して Azure Resource Manager アプリ登録を作成する (自動)
次のすべての項目がシナリオに当てはまる場合は、このアプローチを使用できます。
- Azure サブスクリプションの所有者ロールが割り当てられている。
- Azure Stack または Azure US Government 環境には接続しません。
- 使用する Marketplace 拡張機能タスクは、Workload Identity フェデレーションをサポートするように更新されます。
この選択により、Azure DevOps は、接続するサブスクリプション、管理グループ、または Machine Learning ワークスペースに対して自動的にクエリを実行し、認証用のワークロード ID フェデレーションを作成します。
Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。
詳細については、. プロジェクト設定を開くを参照してください。
[新しいサービス接続]、[Azure Resource Manager]、[次へ] の順に選択します。
[アプリの登録 (自動)] を選択し、資格情報として [ワークロード ID フェデレーション] を選択します。
スコープ レベルを選択します。 [サブスクリプション]、[管理グループ]、または [Machine Learning ワークスペース] を選択します。 管理グループは、複数のサブスクリプションのアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。 Machine Learning ワークスペースは機械学習アーティファクトを作成するための場所です。
[サブスクリプション] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション 必須。 Azure サブスクリプションを選択します。 リソース グループ 必須。 Azure リソース グループを選択します。 [管理グループ]スコープで [Azure 管理グループ] を選択します。
[Machine Learning ワークスペース] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション 必須。 Azure サブスクリプションを選択します。 リソース グループ 必須。 ワークスペースを含むリソース グループを選択します。 Machine Learning ワークスペース 必須。 Azure Machine Learning ワークスペースを選択します。
サービス接続名を入力します。
必要に応じて、サービス接続の説明を入力します。
[すべてのパイプラインにアクセス許可を付与する] をオンにし、すべてのパイプラインがこのサービス接続を使用できるようにします。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。
[保存] を選択します。
新しいサービス接続が作成されたら、接続名をコピーし、azureSubscription
の値としてコードに貼り付けます。
シークレットを使用して Azure Resource Manager アプリ登録を作成する (自動)
これを選択すると、Azure DevOps は接続先のサブスクリプション、管理グループ、または Machine Learning ワークスペースを自動的に照会し、認証用のシークレットを作成します。
警告
シークレットを使用するには、手動でのローテーションと管理が必要になるため、お勧めしません。 推奨される認証情報タイプは、ワークロード ID フェデレーションです。
次のすべての項目がシナリオに当てはまる場合は、このアプローチを使用できます。
- Azure Pipelines 組織および Azure サブスクリプションの所有者としてサインインしている。
- ユーザーがサービス接続を通じてアクセスする Azure リソースのアクセス許可をさらに制限する必要はありません。
- Azure Stack または Azure US Government 環境には接続しません。
- Azure DevOps Server 2019 または以前のバージョンの Team Foundation Server から接続していません。
Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。
詳細については、. プロジェクト設定を開くを参照してください。
[新しいサービス接続]、[Azure Resource Manager]、[次へ] の順に選択します。
[アプリの登録 (自動)] を選択し、資格情報として [シークレット] を選択します。
スコープ レベルを選択します。 [サブスクリプション]、[管理グループ]、または [Machine Learning ワークスペース] を選択します。 管理グループは、複数のサブスクリプションのアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。 Machine Learning ワークスペースは機械学習アーティファクトを作成するための場所です。
[サブスクリプション] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション 必須。 Azure サブスクリプションを選択します。 リソース グループ 必須。 Azure リソース グループを選択します。 [管理グループ]スコープで [Azure 管理グループ] を選択します。
[Machine Learning ワークスペース] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション 必須。 Azure サブスクリプションを選択します。 リソース グループ 必須。 ワークスペースを含むリソース グループを選択します。 Machine Learning ワークスペース 必須。 Azure Machine Learning ワークスペースを選択します。
サービス接続名を入力します。
必要に応じて、サービス接続の説明を入力します。
[すべてのパイプラインにアクセス許可を付与する] をオンにし、すべてのパイプラインがこのサービス接続を使用できるようにします。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。
[保存] を選択します。
新しいサービス接続が作成されたら、接続名をコピーし、azureSubscription
の値としてコードに貼り付けます。
既存のユーザー割り当てマネージド ID 用の Azure Resource Manager サービス接続を作成する
このオプションは、既存のユーザー割り当てマネージド ID 用のワークロード ID 資格情報を自動的に作成する場合に使用します。 開始する前に、既存のユーザー割り当てマネージド ID が必要です。
Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。
詳細については、. プロジェクト設定を開くを参照してください。
[新しいサービス接続]、[Azure Resource Manager]、[次へ] の順に選択します。
[マネージド ID] を選択します。
[ステップ 1: マネージド ID の詳細] での指定:
- [マネージド ID のサブスクリプション] を選択します。 これは、マネージド ID を含む Azure サブスクリプションです。
- [マネージド ID のリソース グループ] を選択します。 これは、マネージド ID を含むリソース グループです。
- [マネージド ID] を選択します。 これは、リソースにアクセスするために使用するリソース グループ内のマネージド ID です。
[ステップ 2: Azure スコープ] での指定:
[スコープ レベル] を選択します。 [サブスクリプション]、[管理グループ]、または [Machine Learning ワークスペース] を選択します。 管理グループは、複数のサブスクリプションのアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。 Machine Learning ワークスペースは機械学習アーティファクトを作成するための場所です。
[サブスクリプション] スコープに次のパラメーターを入力します。
パラメーター 説明 サービス接続のサブスクリプション 必須。 マネージド ID でアクセスする Azure サブスクリプション名を選択します。 サービス接続のリソース グループ 省略可能。 マネージド ID アクセスを 1 つのリソース グループに制限する場合に入力します。 [管理グループ] スコープに次のパラメーターを入力します。
パラメーター 説明 管理グループ 必須。 Azure 管理グループを選択します。 [Machine Learning ワークスペース] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション 必須。 Azure サブスクリプション名を選択します。 サービス接続のリソース グループ 省略可能。 ワークスペースを含むリソース グループを選択します。 ML Workspace ワークスペース 必須。 既存の Azure Machine Learning ワークスペースの名前を入力します。
[ステップ 3: サービス接続の詳細] セクションで、次のパラメーターを入力または選択します。
パラメーター 説明 サービス接続名 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 Azure サブスクリプションの名前ではありません。 サービス管理リファレンス 省略可能。 ITSM データベースからのコンテキスト情報。 説明 省略可。 サービス接続の説明を入力します。 [セキュリティ] セクションで、[すべてのパイプラインへのアクセス許可を与える] を選択してすべてのパイプラインがこのサービス接続を使用できるようにします。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。
[保存] を選択し、サービス接続を確認して作成します。
Workload Identity フェデレーションを使用するように既存の Azure 資源管理者サービス接続を変換します
既存の Azure 資源管理者サービス接続を、シークレットの代わりに認証に Workload Identity フェデレーションを使用するように簡単に変換できます。 サービス接続が次の要件を満たしている場合、Azure DevOps でサービス接続変換ツールを使用できます。
- Azure DevOps は最初にサービス接続を作成しました。 サービス接続を手動で作成する場合、Azure DevOps には独自の資格情報を変更するアクセス許可がないため、サービス接続変換ツールを使用してサービス接続を変換することはできません。
- サービス接続を使用するプロジェクトは 1 つだけです。 プロジェクト間のサービス接続は変換できません。
サービス接続を変換するには:
Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。
詳細については、. プロジェクト設定を開くを参照してください。
Workload Identity を使用するように変換するサービス接続を選択します。
変換 を選択します。
有効期限が切れたシークレットを持つ既存の資格情報がある場合は、変換するための別のオプションが表示されます。
もう一度 [変換] を選択して、新しいサービス接続を作成することを確認します。
変換には数分かかる場合があります。 接続を元に戻したい場合は、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 には独自の資格情報を変更するアクセス許可がないため、サービス接続変換ツールを使用してサービス接続を元に戻すことはできません。
サービス接続を元に戻すには:
Azure DevOps プロジェクトで、パイプライン> サービスに移動します。
元に戻す既存のサービス接続を選択します。
[Revert conversion to the original scheme] (変換を元のスキーマに戻す) を選択 します。
もう一度 [元に戻す] を選んで選択を確定します。
既存のサービス プリンシパルを使用する Azure 資源管理者サービス接続を作成します
定義済みのアクセス許可のセットを使用する必要があり、この目的のためにサービス プリンシパルがまだ定義されていない場合は、次のチュートリアルのいずれかに従って新しいサービス プリンシパルを作成します。
- リソースにアクセスできる Microsoft Entra アプリケーションとサービス プリンシパルをポータルで作成する
- Azure PowerShell を使用して、証明書を持つ Azure サービス プリンシパルを作成します
既存のサービス プリンシパルを使用するサービス接続を作成するには、次のようにします。
Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。
詳細については、. プロジェクト設定を開くを参照してください。
[新しいサービス接続]、[Azure Resource Manager]、[次へ] の順に選択します。
[サービス プリンシパル (手動)]、[次へ] の順に選択します。
[新しい Azure サービス接続] ダイアログで [環境] を選択します。 Azure Stack を選択した場合は、
https://management.local.azurestack.external
のような環境 URL を入力します。[スコープ レベル] を選択します。 サブスクリプションまたは管理グループを選択します。 管理グループは、複数のサブスクリプションのアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。
[サブスクリプション] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション ID 必須。 Azure サブスクリプション ID を入力します。 サブスクリプション名 必須。 Azure サブスクリプション名を入力します。 [管理グループ] スコープに次のパラメーターを入力します。
パラメーター 説明 管理グループ ID 必須。 Azure 管理グループ ID を入力します。 管理グループ名 必須。 Azure 管理グループ名を入力します。
[認証] セクションで次のパラメーターを入力または選択します。
パラメーター 説明 サービス プリンシパル ID 必須。 サービス プリンシパル ID を入力します。 資格情報 [サービス プリンシパル キー] または [証明書] を選択します。 [サービス プリンシパル キー] を選択した場合はキー (パスワード) を入力します。 [証明書] を選択した場合は証明書を入力します。 テナント ID 必須。 テナント ID を入力します。 確認 入力した設定を検証する場合に選択します。 [詳細] セクションで次のパラメーターを入力します。
パラメーター 説明 Connection Name 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 Azure サブスクリプションの名前ではありません。 説明 省略可。 サービス接続の説明を入力します。 Security [すべてのパイプラインにアクセス許可を付与する] をオンにし、すべてのパイプラインがこのサービス接続を使用できるようにします。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。 [確認して保存] を選択し、サービス接続を確認して作成します。
Azure DevOps プロジェクトで、 プロジェクト設定 > サービスに移動します。
詳細については、. プロジェクト設定を開くを参照してください。
[新しいサービス接続] を選択し、次に [Azure Resource Manager] を選択します。
[Azure Resource Manager サービス接続の追加] ダイアログで、次のように各フィールドに入力します。
[接続名] を入力します。
[環境] を選択します。 Azure Stack を選択した場合は、
https://management.local.azurestack.external
のような環境 URL を入力します。[スコープ レベル]、[**サブスクリプション]、または [管理グループ] を選択します。 管理グループは、複数のサブスクリプションのアクセス、ポリシー、コンプライアンスを管理するのに役立つコンテナーです。
[サブスクリプション] スコープに次のパラメーターを入力します。
パラメーター 説明 サブスクリプション ID 必須。 Azure サブスクリプション ID を入力します。 サブスクリプション名 必須。 Azure サブスクリプション名を入力します。 [管理グループ] スコープに次のパラメーターを入力します。
パラメーター 説明 管理グループ ID 必須。 Azure 管理グループ ID を入力します。 管理グループ名 必須。 Azure 管理グループ名を入力します。
[サービス プリンシパル ID] を入力します。
資格情報の種類を選択します。
- サービス プリンシパル キー: サービス プリンシパル キー (パスワード) を入力します。
- 証明書: 証明書セクションと秘密キー セクションの両方を含めて、.perm ファイルの内容を入力します。
[テナント ID] を入力します。
[接続確認] を選択して、サービス接続を検証します。
必要に応じて、[この接続の使用をすべてのパイプラインに許可します] を選択します。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。
[保存] を選択してサービス接続を作成します。
新しいサービス接続が作成されたら、次の手順に従います。
- UI でサービス接続を使用する場合は、パイプラインのAzure サブスクリプション設定で割り当てた接続名を選択します。
- YAML ファイルでサービス接続を使用する場合は、接続名をコピーし、
azureSubscription
の値としてコードに貼り付けます。
必要に応じて、サービス プリンシパルを変更して、適切なアクセス許可を公開します。
サービス プリンシパルを使用した認証についての詳細については、Azure サブスクリプション リソースへのアクセスを管理するためのロールベースのアクセス制御の使用、または ブログ記事Visual Studio でサービス プリンシパルを使用して Azure リソース グループの展開を自動化する 、もしくはを参照してください。
詳細については、Azure Resource Manager サービス接続のトラブルシューティングを参照してください。
ヘルプとサポート
- 調べるトラブルシューティングのヒント
- Stack Overflow に関するアドバイスを得るを提供します。
- Azure DevOps 開発者コミュニティで質問を投稿したり、回答を検索したり、機能を提案したりできます。
- Azure DevOps のサポートを取得