Azure Resource Manager 서비스 연결을 사용하여 Azure에 연결
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Azure Resource Manager 서비스 연결을 사용하면 파이프라인에서 Azure Key Vault와 같은 Azure 리소스에 연결할 수 있습니다. 이 연결을 사용하면 매번 인증할 필요 없이 파이프라인을 사용하여 Azure 앱 Service 앱과 같은 Azure 리소스에 배포할 수 있습니다.
Azure Resource Manager 서비스 연결을 사용하여 Azure에 연결하기 위한 여러 인증 옵션이 있습니다. 권장되는 옵션은 앱 등록 또는 관리 ID와 함께 워크로드 ID 페더레이션을 사용하는 것입니다.
권장되는 Azure Resource Manager 서비스 연결 옵션은 다음과 같습니다.
- 워크로드 ID 페더레이션 또는 비밀을 사용한 앱 등록(자동)
- 워크로드 ID 페더레이션 자격 증명을 만들고 기존 사용자 할당 관리 ID에 연결하는 관리 ID입니다. 앱 등록을 만들 수 있는 권한이 없는 경우 이 옵션을 사용합니다.
이 문서에 포함되지 않은 다른 Azure Resource Manager 서비스 연결 인증 옵션이 있습니다.
Azure Resource Manager 앱 등록 만들기(자동)
Azure Resource Manager 서비스 연결을 만들 때 워크로드 ID 페더레이션 또는 비밀이라는 두 가지 자격 증명 유형 중에서 선택합니다.
워크로드 ID 페더레이션을 사용하여 Azure Resource Manager 앱 등록 만들기(자동)
시나리오에 대해 다음 항목이 모두 true인 경우 이 방법을 사용할 수 있습니다.
- Azure 구독에 대한 소유자 역할이 있어야 합니다.
- Azure Stack 또는 Azure 미국 정부 환경에 연결하지 않습니다.
- 사용하는 모든 Marketplace 확장 작업은 워크로드 ID 페더레이션을 지원하도록 업데이트됩니다.
이 선택을 통해 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 작업 영역을 자동으로 쿼리하고 인증에 대한 비밀을 만듭니다.
Warning
비밀을 사용하려면 수동 회전 및 관리가 필요하며 권장되지 않습니다. 워크로드 ID 페더레이션은 기본 자격 증명 유형입니다.
시나리오에 대해 다음 항목이 모두 true인 경우 이 방법을 사용할 수 있습니다.
- Azure Pipelines 조직 및 Azure 구독의 소유자로 로그인했습니다.
- 사용자가 서비스 연결을 통해 액세스하는 Azure 리소스에 대한 권한을 추가로 제한할 필요가 없습니다.
- Azure Stack 또는 Azure 미국 정부 환경에 연결하지 않습니다.
- 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 액세스를 하나의 리소스 그룹으로 제한하려면 입력합니다. 관리 그룹 범위의 경우 다음 매개 변수를 입력합니다.
매개 변수 설명 관리 그룹 필수입니다. Azure 관리 그룹을 선택합니다. Machine Learning 작업 영역 범위의 경우 다음 매개 변수를 입력합니다.
매개 변수 설명 구독 필수입니다. Azure 구독 이름을 선택합니다. 서비스 연결을 위한 리소스 그룹 선택 사항. 작업 영역이 포함된 리소스 그룹을 선택합니다. ML 작업 영역 작업 영역 필수입니다. 기존 Azure Machine Learning 작업 영역의 이름을 입력합니다.
3단계: 서비스 연결 세부 정보: 섹션에서 다음 매개 변수를 입력하거나 선택합니다.
매개 변수 설명 서비스 연결 이름 필수입니다. 작업 속성에서 이 서비스 연결을 참조하는 데 사용하는 이름입니다. Azure 구독의 이름이 아닙니다. 서비스 관리 참조 선택 사항. ITSM 데이터베이스의 컨텍스트 정보입니다. 설명 선택 사항입니다. 서비스 연결에 대한 설명을 입력합니다. 보안 섹션에서 모든 파이프라인에서 이 서비스 연결을 사용할 수 있도록 모든 파이프라인에 액세스 권한 부여를 선택합니다. 이 옵션을 선택하지 않으면 이 서비스 연결을 사용하는 각 파이프라인에 대한 액세스 권한을 수동으로 부여해야 합니다.
저장을 선택하여 서비스 연결의 유효성을 검사하고 만듭니다.
워크로드 ID 페더레이션을 사용하도록 기존 Azure Resource Manager 서비스 연결 변환
비밀 대신 인증에 워크로드 ID 페더레이션을 사용하도록 기존 Azure Resource Manager 서비스 연결을 신속하게 변환할 수 있습니다. 서비스 연결이 다음 요구 사항을 충족하는 경우 Azure DevOps에서 서비스 연결 변환 도구를 사용할 수 있습니다.
- Azure DevOps는 원래 서비스 연결을 만들었습니다. 서비스 연결을 수동으로 만드는 경우 Azure DevOps에 자체 자격 증명을 수정할 수 있는 권한이 없으므로 서비스 연결 변환 도구를 사용하여 서비스 연결을 변환할 수 없습니다.
- 하나의 프로젝트만 서비스 연결을 사용합니다. 프로젝트 서비스 간 연결을 변환할 수 없습니다.
서비스 연결을 변환하려면 다음을 수행합니다.
Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결로 이동합니다.
자세한 내용은 프로젝트 설정 열기를 참조 하세요.
워크로드 ID를 사용하도록 변환하려는 서비스 연결을 선택합니다.
변환을 선택합니다.
만료된 비밀이 있는 기존 자격 증명이 있는 경우 변환할 다른 옵션이 표시됩니다.
변환을 다시 선택하여 새 서비스 연결을 만들 것인지 확인합니다.
변환에는 몇 분 정도 걸릴 수 있습니다. 연결을 되돌리려면 7일 이내에 되돌려야 합니다.
스크립트를 사용하여 여러 Azure Resource Manager 서비스 연결 변환
스크립트를 사용하여 여러 서비스 연결을 한 번에 업데이트하여 인증에 워크로드 ID 페더레이션을 사용합니다.
이 예제 PowerShell 스크립트에는 Azure DevOps 조직(예: ) 및 Azure DevOps 프로젝트(예: https://dev.azure.com/fabrikam-tailspin
Space game web agent
)의 두 매개 변수가 필요합니다. 그런 다음 스크립트는 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 Resource Manager 서비스 연결 되돌리기
7일 동안 비밀로 변환된 자동 서비스 연결을 되돌릴 수 있습니다. 7일 후 새 비밀을 수동으로 만듭니다.
서비스 연결을 수동으로 만들고 변환하는 경우 Azure DevOps에 자체 자격 증명을 수정할 수 있는 권한이 없으므로 서비스 연결 변환 도구를 사용하여 서비스 연결을 되돌릴 수 없습니다.
서비스 연결을 되돌리려면 다음을 수행합니다.
Azure DevOps 프로젝트에서 Pipelines>Service 연결로 이동합니다.
되돌릴 기존 서비스 연결을 선택합니다.
원래 구성표로 변환 되돌리기를 선택합니다.
[되돌리기]를 다시 선택하여 선택을 확인합니다.
기존 서비스 주체를 사용하는 Azure Resource Manager 서비스 연결 만들기
미리 정의된 액세스 권한 집합을 사용하려는데 이 용도로 정의된 서비스 주체가 아직 없는 경우 다음 자습서 중 하나를 따라 새 서비스 주체를 만듭니다.
- 포털을 사용하여 리소스에 액세스할 수 있는 Microsoft Entra 애플리케이션 및 서비스 주체 만들기
- Azure PowerShell을 사용하여 인증서가 있는 Azure 서비스 주체 만들기
기존 서비스 주체를 사용하는 서비스 연결을 만들려면 다음을 수행합니다.
Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결로 이동합니다.
자세한 내용은 프로젝트 설정 열기를 참조 하세요.
새 서비스 연결을 선택한 다음, Azure Resource Manager 및 다음을 선택합니다.
서비스 주체(수동) 및 다음을 선택합니다.
새 Azure 서비스 연결 대화 상자에서 환경을 선택합니다. Azure Stack을 선택하는 경우 환경 URL(예:
https://management.local.azurestack.external
)을 입력합니다.범위 수준을 선택합니다. 구독 또는 관리 그룹을 선택합니다. 관리 그룹은 여러 구독에서 액세스, 정책 및 규정 준수를 관리하는 데 도움이 되는 컨테이너입니다.
구독 범위에 대해 다음 매개 변수를 입력합니다.
매개 변수 설명 구독 ID 필수입니다. Azure 구독 ID를 입력합니다. 구독 이름 필수입니다. Azure 구독 이름을 입력합니다. 관리 그룹 범위의 경우 다음 매개 변수를 입력합니다.
매개 변수 설명 관리 그룹 ID 필수입니다. Azure 관리 그룹 ID를 입력합니다. 관리 그룹 이름 필수입니다. Azure 관리 그룹 이름을 입력합니다.
인증 섹션에서 다음 매개 변수를 입력하거나 선택합니다.
매개 변수 설명 서비스 주체 ID 필수입니다. 서비스 주체 ID를 입력합니다. 자격 증명 서비스 주체 키 또는 인증서를 선택합니다. 서비스 주체 키를 선택한 경우 키(암호)를 입력합니다. 인증서를 선택한 경우 인증서를 입력합니다. 테넌트 ID 필수입니다. 테넌트 ID를 입력합니다. 확인 입력한 설정의 유효성을 검사하려면 선택합니다. 세부 정보 섹션에서 다음 매개 변수를 입력합니다.
매개 변수 Description 연결 이름 필수입니다. 작업 속성에서 이 서비스 연결을 참조하는 데 사용하는 이름입니다. Azure 구독의 이름이 아닙니다. 설명 선택 사항입니다. 서비스 연결에 대한 설명을 입력합니다. 보안 모든 파이프라인이 이 서비스 연결을 사용하도록 허용하려면 모든 파이프라인에 액세스 권한 부여를 선택합니다. 이 옵션을 선택하지 않으면 이 서비스 연결을 사용하는 각 파이프라인에 대한 액세스 권한을 수동으로 부여해야 합니다. 확인 및 저장을 선택하여 서비스 연결의 유효성을 검사하고 만듭니다.
Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결로 이동합니다.
자세한 내용은 프로젝트 설정 열기를 참조 하세요.
새 서비스 연결을 선택한 다음, Azure Resource Manager를 선택합니다.
Azure Resource Manager 서비스 연결 추가 대화 상자에서 다음과 같이 필드를 채웁니다.
연결 이름을 입력합니다.
환경을 선택합니다. Azure Stack을 선택하는 경우 환경 URL(예:
https://management.local.azurestack.external
)을 입력합니다.범위 수준, **구독 또는 관리 그룹을 선택합니다. 관리 그룹은 여러 구독에서 액세스, 정책 및 규정 준수를 관리하는 데 도움이 되는 컨테이너입니다.
구독 범위에 대해 다음 매개 변수를 입력합니다.
매개 변수 설명 구독 ID 필수입니다. Azure 구독 ID를 입력합니다. 구독 이름 필수입니다. Azure 구독 이름을 입력합니다. 관리 그룹 범위의 경우 다음 매개 변수를 입력합니다.
매개 변수 설명 관리 그룹 ID 필수입니다. Azure 관리 그룹 ID를 입력합니다. 관리 그룹 이름 필수입니다. Azure 관리 그룹 이름을 입력합니다.
서비스 주체 ID를 입력합니다.
자격 증명 유형을 선택합니다.
- 서비스 주체 키: 서비스 주체 키(암호)를 입력합니다.
- 인증서: 인증서 및 프라이빗 키 섹션을 포함하여 .perm 파일의 내용을 입력합니다.
테넌트 ID를 입력합니다.
연결 확인을 선택하여 서비스 연결의 유효성을 검사합니다.
필요에 따라 모든 파이프라인에서 이 연결을 사용하도록 허용을 선택합니다. 이 옵션을 선택하지 않으면 이 서비스 연결을 사용하는 각 파이프라인에 대한 액세스 권한을 수동으로 부여해야 합니다.
저장을 선택하여 서비스 연결을 만듭니다.
새 서비스 연결을 만든 후:
- UI에서 서비스 연결을 사용하는 경우 파이프라인의 Azure 구독 설정에서 할당한 연결 이름을 선택합니다.
- YAML 파일에서 서비스 연결을 사용하는 경우 연결 이름을 복사하여 코드에 값
azureSubscription
으로 붙여넣습니다.
필요한 경우 적절한 권한을 노출하도록 서비스 주체를 수정합니다.
서비스 주체 를 사용하여 인증하는 방법에 대한 자세한 내용은 역할 기반 액세스 제어를 사용하여 Azure 구독 리소스 에 대한 액세스를 관리하거나 Visual Studio에서 서비스 주체를 사용하여 Azure 리소스 그룹 배포를 자동화하는 블로그 게시물을 참조하세요.
자세한 내용은 Azure Resource Manager 서비스 연결 문제를 참조 하세요.