Azure Resource Manager 서비스 연결을 사용하여 Azure에 커넥트

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

Azure Resource Manager 서비스 연결을 사용하여 서비스 주체 인증 또는 Azure 관리 서비스 ID를 통해 Azure 리소스에 연결할 수 있습니다. Resource Manager 서비스 연결을 사용하는 경우 매번 인증하지 않고도 파이프라인을 사용하여 Azure 앱 Service 앱과 같은 Azure 리소스에 배포할 수 있습니다.

Azure Resource Manager 서비스 연결을 사용하여 Azure에 연결하는 여러 옵션이 있습니다.

  • 워크로드 ID 페더레이션을 사용하는 서비스 주체 또는 관리 ID
  • 비밀을 사용하는 서비스 주체
  • 에이전트 할당 관리 ID

다른 유형의 연결에 대해 알아보고 연결을 만들고 사용하는 방법에 대한 일반적인 정보는 빌드 및 릴리스에 대한 서비스 연결을 참조 하세요.

워크로드 ID 페더레이션을 사용하는 Azure Resource Manager 서비스 연결 만들기

워크로드 ID 페더레이션은 OIDC(OpenID 커넥트)를 사용하여 비밀을 사용하지 않고 Microsoft Entra로 보호된 리소스를 인증합니다.

시나리오에 대해 다음 항목이 모두 true인 경우 이 방법을 사용하는 것이 좋습니다.

  • Azure 구독에 대한 소유자 역할이 있습니다.
  • Azure Stack 또는 Azure Government 클라우드연결하지 않습니다.
  • 사용하는 모든 Marketplace 확장 작업은 워크로드 ID 페더레이션을 지원하도록 업데이트됩니다.

새 워크로드 ID 페더레이션 서비스 연결 만들기

  1. Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결이동합니다.

    자세한 내용은 프로젝트 설정 열기를 참조 하세요.

  2. 새 서비스 연결을 선택한 다음, Azure Resource Manager를 선택합니다.

    워크로드 ID 서비스 연결 유형 선택을 보여 주는 스크린샷

  3. 워크로드 ID 페더레이션(자동)을 선택합니다.

    워크로드 ID 서비스 연결 유형을 선택하는 방법을 보여 주는 스크린샷.

  4. 다음 매개 변수를 지정합니다.

    매개 변수 설명
    Subscription 기존 Azure 구독을 선택합니다. Azure 구독 또는 인스턴스가 표시되지 않는 경우 Azure Resource Manager 서비스 연결 문제 해결을 참조 하세요.
    리소스 그룹 사용자가 구독 내에 정의된 모든 리소스에 액세스할 수 있도록 비워 둡니다. 리소스에 대한 사용자 액세스를 제한하려면 리소스 그룹 이름을 입력합니다. 그런 다음 사용자는 해당 리소스 그룹에 대해 정의된 리소스에만 액세스할 수 있습니다.
    서비스 연결 이름 필수입니다. 작업 속성에서 이 서비스 연결을 참조하는 데 사용하는 이름입니다. Azure 구독의 이름이 아닙니다.
  5. 새 서비스 연결을 만든 후 연결 이름을 복사하여 코드에 값 azureSubscription으로 붙여넣습니다.

  6. 특정 Azure 리소스에 배포하려면 태스크에 해당 리소스에 대한 더 많은 데이터가 필요합니다. Azure Portal의 리소스로 이동한 다음, 데이터를 코드에 복사합니다. 예를 들어 웹앱을 배포하려면 Azure 앱 Service 앱의 이름을 복사하여 코드에 값WebAppName으로 붙여넣습니다.

워크로드 ID 페더레이션을 사용하도록 기존 Azure Resource Manager 서비스 연결 변환

서비스 주체 대신 인증에 워크로드 ID 페더레이션을 사용하도록 기존 Azure Resource Manager 서비스 연결을 신속하게 변환할 수 있습니다. 서비스 연결이 다음 요구 사항을 충족하는 경우 Azure DevOps에서 서비스 연결 변환 도구를 사용할 수 있습니다.

  • Azure DevOps는 원래 서비스 연결을 만들었습니다. 서비스 연결을 수동으로 만드는 경우 Azure DevOps에 자체 자격 증명을 수정할 수 있는 권한이 없으므로 서비스 연결 변환 도구를 사용하여 서비스 연결을 변환할 수 없습니다.
  • 하나의 프로젝트만 서비스 연결을 사용합니다. 프로젝트 서비스 간 연결을 변환할 수 없습니다.

서비스 연결을 변환하려면 다음을 수행합니다.

  1. Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결이동합니다.

    자세한 내용은 프로젝트 설정 열기를 참조 하세요.

  2. 워크로드 ID를 사용하도록 변환하려는 서비스 연결을 선택합니다.

  3. 변환을 선택합니다.

    페더레이션된 자격 증명에 대한 변환을 선택하는 방법을 보여 주는 스크린샷

    만료된 비밀이 있는 기존 서비스 주체 자격 증명이 있는 경우 변환할 다른 옵션이 표시됩니다.

    만료된 인증서가 있는 경우 페더레이션된 자격 증명을 사용하도록 변환하는 옵션을 보여 주는 스크린샷

  4. 변환을 다시 선택하여 새 서비스 연결을 만들 것인지 확인합니다.

    변환에는 몇 분 정도 걸릴 수 있습니다. 연결을 되돌리기 하려면 7일 이내에 되돌리기 합니다.

스크립트를 사용하여 여러 Azure Resource Manager 서비스 연결 변환

스크립트를 사용하여 여러 서비스 연결을 한 번에 업데이트하여 인증에 워크로드 ID 페더레이션을 사용합니다.

이 예제 PowerShell 스크립트에는 Azure DevOps 조직(예: ) 및 Azure DevOps 프로젝트(예: https://dev.azure.com/fabrikam-tailspinSpace 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에 자체 자격 증명을 수정할 수 있는 권한이 없으므로 서비스 연결 변환 도구를 사용하여 서비스 연결을 되돌리기 수 없습니다.

서비스 연결을 되돌리기:

  1. Azure DevOps 프로젝트에서 Pipelines>Service 연결이동합니다.

  2. 되돌리기 기존 서비스 연결을 선택합니다.

  3. 원래 구성표로 변환 되돌리기를 선택합니다.

    페더레이션 자격 증명에 대한 되돌리기 선택하는 방법을 보여 주는 스크린샷

  4. [되돌리기]를 다시 선택하여 선택을 확인합니다.

서비스 주체 암호를 사용하는 Azure Resource Manager 서비스 연결 만들기

시나리오에 대해 다음 항목이 모두 true인 경우 이 방법을 사용하는 것이 좋습니다.

  • Azure Pipelines 조직 및 Azure 구독의 소유자로 로그인했습니다.
  • 사용자가 서비스 연결을 통해 액세스하는 Azure 리소스에 대한 권한을 추가로 제한할 필요가 없습니다.
  • Azure Stack 또는 Azure Government 클라우드연결하지 않습니다.
  • Azure DevOps Server 2019 또는 이전 버전의 Team Foundation Server에서 연결하지 않습니다.

서비스 연결을 만들려면 다음을 수행합니다.

  1. Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결이동합니다.

    Team Foundation Server의 위쪽 메뉴 모음에서 설정 아이콘을 선택하여 서비스 페이지로 이동합니다.

    자세한 내용은 프로젝트 설정 열기를 참조 하세요.

  2. 새 서비스 연결을 선택한 다음, Azure Resource Manager를 선택합니다.

    서비스 연결 유형 선택을 보여 주는 스크린샷

  3. 다음 매개 변수를 입력하거나 선택합니다.

    매개 변수 Description
    연결 이름 필수입니다. 작업 속성에서 이 서비스 연결을 참조하는 데 사용하는 이름입니다. Azure 구독의 이름이 아닙니다.
    범위 수준 구독 또는 관리 그룹을 선택합니다. 관리 그룹은 여러 구독에서 액세스, 정책 및 규정 준수를 관리하는 데 도움이 되는 컨테이너입니다.
    구독 범위에 대한 구독을 선택하는 경우 기존 Azure 구독을 선택합니다. Azure 구독 또는 인스턴스가 표시되지 않는 경우 Azure Resource Manager 서비스 연결 문제 해결을 참조 하세요.
    관리 그룹 범위에 대한 관리 그룹을 선택하는 경우 기존 Azure 관리 그룹을 선택합니다. 자세한 내용은 관리 그룹 만들기를 참조 하세요.
    리소스 그룹 사용자가 구독 내에 정의된 모든 리소스에 액세스할 수 있도록 비워 둡니다. 리소스에 대한 사용자 액세스를 제한하려면 리소스 그룹 이름을 입력합니다. 그런 다음 사용자는 해당 리소스 그룹에 대해 정의된 리소스에만 액세스할 수 있습니다.
  4. 새 서비스 연결을 만든 후:

    • 클래식 편집기를 사용하는 경우 파이프라인의 Azure 구독 설정에서 할당한 연결 이름을 선택합니다.
    • YAML 파일을 사용하는 경우 연결 이름을 코드에 값 azureSubscription으로 복사합니다.
  5. 특정 Azure 리소스에 배포하려면 작업에 리소스에 대한 추가 정보를 추가합니다.

    • 클래식 편집기를 사용하는 경우 작업에 추가할 데이터를 선택합니다. 예를 들어 App Service 이름을 선택합니다.
    • YAML 파일을 사용하는 경우 Azure Portal의 리소스로 이동합니다. 필요한 데이터를 복사하여 작업 코드에 붙여넣습니다. 예를 들어 웹앱을 배포하려면 App Service 앱의 이름을 복사하여 작업 YAML에 대한 WebAppName 값으로 붙여넣습니다.

참고 항목

이 방법을 따르면 Azure DevOps 는 Microsoft Entra ID와 연결하고 3개월 동안 유효한 비밀로 앱 등록을 만듭니다. 서비스 연결이 곧 만료되면 Microsoft Entra ID에 인증서 또는 비밀이 곧 만료됨이라는 메시지가 표시됩니다. 새 만들기 이 시나리오에서는 서비스 연결을 새로 고쳐야 합니다.

서비스 연결을 새로 고치려면 Azure DevOps 포털에서 연결을 편집한 다음 확인을 선택합니다. 편집을 저장한 후 서비스 연결은 3개월 동안 유효합니다.

비밀을 만드는 대신 워크로드 ID 페더레이션을 사용하는 것이 좋습니다. 워크로드 ID 페더레이션을 사용하는 경우 비밀을 회전할 필요가 없으며 앱 등록은 의도한 목적에 기본. 워크로드 ID 페더레이션 사용을 시작하려면 서비스 연결 세부 정보 페이지로 이동하여 변환을 선택합니다. 서비스 연결은 비밀 대신 워크로드 ID 페더레이션을 사용하도록 변환됩니다. 자세한 내용은 워크로드 ID 페더레이션을 사용하도록 기존 Azure Resource Manager 서비스 연결 변환을 참조하세요.

자세한 내용은 Azure Resource Manager 서비스 연결 문제를 참조 하세요.

이 방법(예: 드롭다운 목록에 표시된 구독 없음)을 사용하는 데 문제가 있거나 사용자 권한을 추가로 제한하려는 경우 대신 관리 서비스 ID가 있는 서비스 주체 또는 가상 머신을 사용할 수 있습니다.

기존 서비스 주체를 사용하는 Azure Resource Manager 서비스 연결 만들기

  1. 미리 정의된 액세스 권한 집합을 사용하려는데 이 용도로 정의된 서비스 주체가 아직 없는 경우 다음 자습서 중 하나를 따라 새 서비스 주체를 만듭니다.

  2. Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결이동합니다.

    Team Foundation Server의 위쪽 메뉴 모음에서 설정 아이콘을 선택하여 서비스 페이지로 이동합니다.

    자세한 내용은 프로젝트 설정 열기를 참조 하세요.

  3. 새 서비스 연결을 선택한 다음, Azure Resource Manager를 선택합니다.

    서비스 연결 유형 선택을 보여 주는 스크린샷

  4. 서비스 주체(수동) 옵션을 선택한 다음 서비스 주체 세부 정보를 입력합니다.

    서비스 대화 상자의 전체 버전을 여는 것을 보여 주는 스크린샷

  5. 커넥트이 서비스 연결을 참조하는 데 사용할 표시 이름을 입력합니다.

  6. 환경의 경우 환경 이름(Azure Cloud, Azure Stack 또는 Azure Government Cloud)을 선택합니다.

  7. Azure Cloud를 선택하지 않으면 환경 URL을 입력합니다. Azure Stack의 경우 환경 URL은 다음과 같습니다 https://management.local.azurestack.external.

  8. 범위 수준의 경우 연결 범위를 선택합니다.

    • 구독을 선택하는 경우 기존 Azure 구독을 선택합니다. Azure 구독 또는 인스턴스가 표시되지 않는 경우 Azure Resource Manager 서비스 연결 문제 해결을 참조 하세요.
    • 관리 그룹을 선택하는 경우 기존 Azure 관리 그룹을 선택합니다. 자세한 내용은 관리 그룹 만들기를 참조 하세요.
  9. Azure 구독 대화 상자에서 서비스 주체에 대한 다음 정보를 입력합니다.

    • 구독 ID
    • 구독 이름
    • 서비스 주체 ID
    • 서비스 주체 클라이언트 키 또는 인증서선택한 경우 *.pem 파일의 인증서 및 프라이빗 키 섹션의 내용을 입력합니다.
    • 테넌트 ID

    Azure PowerShell 스크립트를 다운로드하고 실행하여 이 정보를 가져올 수 있습니다. 메시지가 표시되면 구독 이름, 암호, 역할(선택 사항) 및 클라우드 유형(예: Azure Cloud(기본값), Azure Stack 또는 Azure Government 클라우드를 입력합니다.

  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 기반 에이전트를 구성할 수 있습니다. 이 시나리오에서는 시스템 할당 ID(서비스 주체)를 사용하여 Azure DevOps에서 연결을 위해 자격 증명을 유지하는 대신 Azure Key Vault 인스턴스와 같이 Microsoft Entra ID를 지원하는 Azure 리소스에 대한 액세스 권한을 Azure VM 기반 에이전트에 부여합니다.

  1. Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결이동합니다.

    Team Foundation Server의 위쪽 메뉴 모음에서 설정 아이콘을 선택하여 서비스 페이지로 이동합니다.

    자세한 내용은 프로젝트 설정 열기를 참조 하세요.

  2. 새 서비스 연결을 선택한 다음, Azure Resource Manager를 선택합니다.

    서비스 연결 유형 선택을 보여 주는 스크린샷

  3. 관리 ID 인증 옵션을 선택합니다.

    관리 서비스 ID 설정으로 가는 것을 보여 주는 스크린샷.

  4. 커넥트이 서비스 연결을 참조할 때 사용할 표시 이름을 입력합니다.

  5. 환경의 경우 환경 이름(Azure Cloud, Azure Stack 또는 Azure Government Cloud)을 선택합니다.

  6. 연결 대화 상자에서 구독에서 다음 값을 입력합니다.

    • 구독 ID
    • 구독 이름
    • 테넌트 ID
  7. 새 서비스 연결을 만든 후:

    • UI에서 서비스 연결을 사용하는 경우 파이프라인의 Azure 구독 설정에서 할당한 연결 이름을 선택합니다.
    • YAML 파일에서 서비스 연결을 사용하는 경우 연결 이름을 코드에 값 azureSubscription으로 복사합니다.
  8. VM(에이전트)에 적절한 권한이 있는지 확인합니다.

    예를 들어 코드에서 Azure Resource Manager를 호출해야 하는 경우 Microsoft Entra ID에서 RBAC(역할 기반 액세스 제어)를 사용하여 VM에 적절한 역할을 할당합니다.

    자세한 내용은 Azure 리소스에 대한 관리 ID를 사용하는 방법 및 역할 기반 액세스 제어를 사용하여 Azure 구독 리소스에 대한 액세스를 관리하는 방법을 참조하세요.

프로세스 에 대한 자세한 내용은 Azure Resource Manager 서비스 연결 문제를 참조하세요.

Azure Government 클라우드에 커넥트

Azure Government 클라우드에 연결하는 방법에 대한 자세한 내용은 Azure Pipelines(Azure Government 클라우드)의 커넥트 참조하세요.

Azure Stack에 연결

Azure Stack에 연결하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.

도움말 및 지원 

  • 문제 해결 팁을 살펴보세요.
  • Stack Overflow에 대한 조언을 얻을 수 있습니다.
  • Azure DevOps 개발자 커뮤니티에서 질문을 게시하거나, 답변을 검색하거나, 기능을 제안합니다.
  • Azure DevOps에 대한 지원을 받 습니다.