다음을 통해 공유


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

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

참고 항목

새 Azure 서비스 연결 만들기 환경을 배포하고 있습니다. 조직에서 수신하는 것은 다양한 요인에 따라 달라지며, 이전 사용자 환경이 여전히 표시되어 있을 수 있습니다.

Azure Resource Manager 서비스 연결을 사용하면 파이프라인에서 Azure Key Vault와 같은 Azure 리소스에 연결할 수 있습니다. 이 연결을 사용하면 매번 인증할 필요 없이 파이프라인을 사용하여 Azure 앱 Service 앱과 같은 Azure 리소스에 배포할 수 있습니다.

Azure Resource Manager 서비스 연결을 사용하여 Azure에 연결하기 위한 여러 인증 옵션이 있습니다. 앱 등록 또는 관리 ID와 함께 워크로드 ID 페더레이션 사용하는 것이 좋습니다. 워크로드 ID 페더레이션을 사용하면 비밀 및 비밀 관리가 필요하지 않습니다.

권장 옵션:

참고 항목

워크로드 ID 페더레이션을 사용하지 않는 다른 Azure Resource Manager 서비스 연결 인증 옵션이 있습니다. 이러한 옵션은 이전 버전과의 호환성 및 에지 사례에 사용할 수 있으며 권장되지 않습니다. 처음으로 서비스 연결을 설정하는 경우 워크로드 ID 페더레이션을 사용합니다. 기존 서비스 연결이 있는 경우 먼저 워크로드 ID 페더레이션 사용하도록 서비스 연결을 변환해 보세요.

  • 비밀 사용하여 자동 앱 등록
  • 에이전트 할당된 관리 ID
  • 프로필 게시

워크로드 ID 페더레이션을 사용하여 앱 등록 만들기(자동)

시나리오에 대해 다음 항목이 모두 true인 경우 이 방법을 사용할 수 있습니다.

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

이 선택을 통해 Azure DevOps는 연결하려는 구독, 관리 그룹 또는 Machine Learning 작업 영역을 자동으로 쿼리하고 인증을 위한 워크로드 ID 페더레이션을 만듭니다.

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

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

  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 프로젝트에서 프로젝트 설정>로 이동합니다.

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

  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 액세스를 하나의 리소스 그룹으로 제한하려면 입력합니다.
      • 관리 그룹 범위의 경우 다음 매개 변수를 입력합니다.

        매개 변수 설명
        관리 그룹 필수입니다. Azure 관리 그룹을 선택합니다.
      • Machine Learning 작업 영역 범위의 경우 다음 매개 변수를 입력합니다.

        매개 변수 설명
        구독 필수입니다. Azure 구독 이름을 선택합니다.
        서비스 연결을 위한 리소스 그룹 선택 사항. 작업 영역이 포함된 리소스 그룹을 선택합니다.
        ML 작업 영역 작업 영역 필수입니다. 기존 Azure Machine Learning 작업 영역의 이름을 입력합니다.
    2. 3단계: 서비스 연결 세부 정보: 섹션에서 다음 매개 변수를 입력하거나 선택합니다.

      매개 변수 설명
      서비스 연결 이름 필수입니다. 작업 속성에서 이 서비스 연결을 참조하는 데 사용하는 이름입니다. Azure 구독의 이름이 아닙니다.
      서비스 관리 참조 선택 사항. ITSM 데이터베이스의 컨텍스트 정보입니다.
      설명 선택 사항. 서비스 연결에 대한 설명을 입력합니다.
    3. 보안 섹션에서 모든 파이프라인에서 이 서비스 연결을 사용할 수 있도록 모든 파이프라인에 액세스 권한 부여를 선택합니다. 이 옵션을 선택하지 않으면 이 서비스 연결을 사용하는 각 파이프라인에 대한 액세스 권한을 수동으로 부여해야 합니다.

    4. 저장을 선택하여 서비스 연결의 유효성을 검사하고 만듭니다.

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

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

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

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

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

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

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

  3. 변환을 선택합니다.

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

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

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

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

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

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

스크립트를 사용하여 여러 서비스 연결을 한 번에 업데이트하여 인증에 워크로드 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)'"
}

비밀을 사용하는 기존 서비스 연결 되돌리기

7일 동안 비밀로 변환된 자동 서비스 연결을 되돌릴 수 있습니다. 7일 후 새 비밀을 수동으로 만듭니다.

서비스 연결을 수동으로 만들고 변환하는 경우 Azure DevOps에 자체 자격 증명을 수정할 수 있는 권한이 없으므로 서비스 연결 변환 도구를 사용하여 서비스 연결을 되돌릴 수 없습니다.

서비스 연결을 되돌리려면 다음을 수행합니다.

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

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

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

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

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

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

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

기존 서비스 주체를 사용하는 서비스 연결을 만들려면 다음을 수행합니다.

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

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

  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. 확인 및 저장을 선택하여 서비스 연결의 유효성을 검사하고 만듭니다.

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

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

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

    Azure Resource Manager 선택을 보여 주는 스크린샷

  3. Azure Resource Manager 서비스 연결 추가 대화 상자에서 다음과 같이 필드를 채웁니다.

    Azure Resource Manager 서비스 연결 추가 스크린샷

    1. 연결 이름을 입력합니다.

    2. 환경을 선택합니다. Azure Stack을 선택하는 경우 환경 URL(예: https://management.local.azurestack.external)을 입력합니다.

    3. 범위 수준, **구독 또는 관리 그룹을 선택합니다. 관리 그룹은 여러 구독에서 액세스, 정책 및 규정 준수를 관리하는 데 도움이 되는 컨테이너입니다.

      • 구독 범위에 대해 다음 매개 변수를 입력합니다.

        매개 변수 설명
        구독 ID 필수입니다. Azure 구독 ID를 입력합니다.
        구독 이름 필수입니다. Azure 구독 이름을 입력합니다.
      • 관리 그룹 범위의 경우 다음 매개 변수를 입력합니다.

        매개 변수 설명
        관리 그룹 ID 필수입니다. Azure 관리 그룹 ID를 입력합니다.
        관리 그룹 이름 필수입니다. Azure 관리 그룹 이름을 입력합니다.
    4. 서비스 주체 ID입력합니다.

    5. 자격 증명 유형을 선택합니다.

      • 서비스 주체 키: 서비스 주체 키(암호)를 입력합니다.
      • 인증서: 인증서 및 프라이빗 키 섹션을 포함하여 .perm 파일의 내용을 입력합니다.
    6. 테넌트 ID입력합니다.

    7. 연결 확인을 선택하여 서비스 연결의 유효성을 검사합니다.

    8. 필요에 따라 모든 파이프라인에서 이 연결을 사용하도록 허용을 선택합니다. 이 옵션을 선택하지 않으면 이 서비스 연결을 사용하는 각 파이프라인에 대한 액세스 권한을 수동으로 부여해야 합니다.

    9. 저장을 선택하여 서비스 연결을 만듭니다.

새 서비스 연결을 만든 후:

  • UI에서 서비스 연결을 사용하는 경우 파이프라인의 Azure 구독 설정에서 할당한 연결 이름을 선택합니다.
  • YAML 파일에서 서비스 연결을 사용하는 경우 연결 이름을 복사하여 코드에 값 azureSubscription으로 붙여넣습니다.

필요한 경우 적절한 권한을 노출하도록 서비스 주체를 수정합니다.

서비스 주체 를 사용하여 인증하는 방법에 대한 자세한 내용은 역할 기반 액세스 제어를 사용하여 Azure 구독 리소스 에 대한 액세스를 관리하거나 Visual Studio에서 서비스 주체를 사용하여 Azure 리소스 그룹 배포를 자동화하는 블로그 게시물을 참조하세요.

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

도움말 및 지원 

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