네트워크 격리를 통해 관리되는 온라인 엔드포인트 보호

적용 대상:Azure CLI ml 확장 v2(현재)Python SDK azure-ai-ml v2(현재)

이 문서에서는 네트워크 격리를 사용하여 관리되는 온라인 엔드포인트를 보호합니다. 보안 인바운드 통신을 위해 Azure Machine Learning 작업 영역의 프라이빗 엔드포인트를 사용하는 관리되는 온라인 엔드포인트를 만듭니다. 또한 배포를 위해 승인된 아웃바운드 통신만 허용하는 관리형 가상 네트워크로 작업 영역을 구성합니다. 마지막으로 아웃바운드 통신을 위해 작업 영역 관리되는 가상 네트워크의 프라이빗 엔드포인트를 사용하는 배포를 만듭니다.

네트워크 격리를 위해 레거시 방법을 사용하는 예를 보려면 azureml-examples GitHub 리포지토리에서 배포 파일 deploy-moe-vnet-legacy.sh(일반 모델을 사용한 배포의 경우) 및 deploy-moe-vnet-mlflow-legacy.sh(MLflow 모델을 사용한 배포의 경우)를 참조하세요.

필수 조건

  • Azure Machine Learning을 사용하려면 Azure 구독이 있어야 합니다. Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다. 지금 Azure Machine Learning 평가판 또는 유료 버전을 사용해 보세요.

  • Azure CLI 및 Azure CLI에 대한 ml 확장을 설치하고 구성합니다. 자세한 내용은 CLI(v2) 설치, 설정 및 사용을 참조하세요.

    Azure Machine Learning 관리되는 가상 네트워크는 2023년 5월 23일에 도입되었습니다. 이전 버전의 ml 확장이 있는 경우 이 문서의 예제가 작동하려면 업데이트해야 할 수 있습니다. 확장을 업데이트하려면 다음 Azure CLI 명령을 사용합니다.

    az extension update -n ml
    
  • 이 문서의 CLI 예에서는 Bash(또는 호환) 셸을 사용한다고 가정합니다. 예를 들어 Linux 시스템 또는 Linux용 Windows 하위 시스템에서 이러한 예제를 사용합니다.

  • Azure 리소스 그룹이 있고, 사용자(또는 사용하는 서비스 주체)에게 이에 대한 Contributor 액세스 권한이 있어야 합니다. ml 확장을 구성한 경우 이러한 리소스 그룹을 갖게 됩니다.

  • 사용자가 할당한 관리 ID를 사용하여 온라인 엔드포인트 및 온라인 배포를 만들고 관리하려면 ID에 적절한 권한이 있어야 합니다. 필요한 권한에 대한 자세한 내용은 서비스 인증 설정을 참조하세요. 예를 들어 ID의 Azure Key Vault에 적절한 RBAC 권한을 할당해야 합니다.

레거시 네트워크 격리 방법에서 관리형 가상 네트워크로 마이그레이션

이전에 관리되는 온라인 엔드포인트의 네트워크 격리에 레거시 방법을 사용했으며 작업 영역 관리형 가상 네트워크를 사용하여 엔드포인트를 보호하도록 마이그레이션하려는 경우 다음 단계를 수행합니다.

  1. 작업 영역에서 모든 컴퓨팅을 삭제합니다.
  2. 작업 영역에 대해 관리형 가상 네트워크를 사용하도록 설정합니다. 작업 영역에 대한 관리형 네트워크를 구성하는 방법에 대한 자세한 내용은 작업 영역 관리형 Virtual Network 격리를 참조하세요.
  3. 관리되는 온라인 엔드포인트에서 액세스해야 하는 프라이빗 리소스에 대한 아웃바운드 통신을 위한 프라이빗 엔드포인트를 구성합니다. 이러한 프라이빗 리소스에는 스토리지 계정, Azure Key Vault 및 ACR(Azure Container Registry)이 포함됩니다.
  4. (선택 사항) 사용자 레지스트리와 통합하는 경우 레지스트리, 해당 스토리지 계정 및 ACR에 대한 아웃바운드 통신을 위한 프라이빗 엔드포인트를 구성합니다.

제한 사항

  • Azure Machine Learning 작업 영역에서 v1_legacy_mode 플래그를 사용하지 않도록 설정(false)해야 합니다. 이 플래그가 사용하도록 설정되어 있으면 관리되는 온라인 엔드포인트를 만들 수 없습니다. 자세한 내용은 v2 API에서 네트워크 격리를 참조하세요.

  • Azure Machine Learning 작업 영역에 2022년 5월 24일 이전에 만들어진 프라이빗 엔드포인트가 있는 경우 프라이빗 엔드포인트를 사용하도록 온라인 엔드포인트를 구성하기 전에 작업 영역의 프라이빗 엔드포인트를 다시 만들어야 합니다. 작업 영역에 대한 프라이빗 엔드포인트를 만드는 방법에 대한 자세한 내용은 Azure Machine Learning 작업 영역에 대한 프라이빗 엔드포인트를 구성하는 방법을 참조하세요.

    작업 영역이 언제 만들어졌는지 확인하려면 작업 영역 속성을 확인합니다.

    스튜디오에서 Directory + Subscription + Workspace 섹션(스튜디오 오른쪽 상단)으로 이동하여 View all properties in Azure Portal을 선택합니다. "개요" 페이지 오른쪽 상단에서 JSON 보기를 선택한 다음 최신 API 버전을 선택합니다. 이 페이지에서 properties.creationTime의 값을 확인할 수 있습니다.

    또는 CLI와 함께 az ml workspace show, SDK와 함께 my_ml_client.workspace.get("my-workspace-name")을 사용하거나 REST API가 있는 작업 영역에서 curl을 사용합니다.

  • 온라인 엔드포인트와 함께 네트워크 격리를 사용하면 작업 영역과 다른 리소스 그룹의 작업 영역 관련 리소스(ACR(Azure Container Registry), Storage 계정, Key Vault 및 Application Insights)를 사용할 수 있습니다. 그러나 이러한 리소스는 작업 영역과 동일한 구독 및 테넌트에 속해야 합니다.

참고 항목

이 문서에 설명된 네트워크 격리는 데이터 평면 작업, 즉 요청 채점(또는 모델 서비스 제공)로 인해 발생하는 작업에 적용됩니다. 컨트롤 플레인 작업(예: 인증 키 만들기, 업데이트, 삭제 또는 검색 요청)은 공용 네트워크를 통해 Azure Resource Manager로 전송됩니다.

시스템 준비

  1. 다음 명령을 실행하여 이 예에서 사용되는 환경 변수를 만듭니다. <YOUR_WORKSPACE_NAME>을 작업 영역에 사용할 이름으로 바꿉니다. <YOUR_RESOURCEGROUP_NAME>을 작업 영역을 포함할 리소스 그룹으로 바꿉니다.

    새 작업 영역을 만들기 전에 이를 포함할 Azure 리소스 그룹을 만들어야 합니다. 자세한 내용은 Azure 리소스 그룹 관리를 참조하세요.

    export RESOURCEGROUP_NAME="<YOUR_RESOURCEGROUP_NAME>"
    export WORKSPACE_NAME="<YOUR_WORKSPACE_NAME>"
    
  2. 작업 영역을 만듭니다. -m allow_only_approved_outbound 매개 변수는 작업 영역에 대해 관리되는 가상 네트워크를 구성하고 승인된 대상을 제외한 아웃바운드 트래픽을 차단합니다.

    az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_only_approved_outbound
    

    또는 배포에서 아웃바운드 트래픽을 인터넷으로 보내도록 허용하려면 다음 코드의 주석 처리를 해제하고 대신 실행합니다.

    # az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_internet_outbound
    

    관리되는 가상 네트워크를 사용하도록 새 작업 영역을 만들거나 기존 작업 영역을 업그레이드하는 방법에 대한 자세한 내용은 인터넷 아웃바운드를 허용하도록 관리되는 가상 네트워크 구성을 참조하세요.

    작업 영역이 프라이빗 엔드포인트로 구성된 경우 프라이빗 엔드포인트를 통한 액세스를 허용하기 위해 작업 영역의 Azure Container Registry를 프리미엄 계층에 대해 구성되어야 합니다. 자세한 내용은 Azure Container Registry 서비스 계층을 참조하세요. 또한 배포를 만드는 동안 이미지가 빌드되므로 작업 영역을 image_build_compute 속성으로 설정해야 합니다. 자세한 내용은 이미지 빌드 구성을 참조하세요.

  3. 작업 영역 및 리소스 그룹의 값을 여러 번 전달하지 않도록 CLI의 기본값을 구성합니다.

    az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
    
  4. 리포지토리 예를 복제하여 엔드포인트 및 배포에 대한 예 파일을 가져온 다음 리포지토리의 /cli 디렉터리로 이동합니다.

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd /cli
    

이 자습서의 명령은 cli 디렉터리의 deploy-managed-online-endpoint-workspacevnet.sh 파일에 있고 YAML 구성 파일은 endpoints/online/managed/sample/ 하위 디렉터리에 있습니다.

보안 관리 온라인 엔드포인트 만들기

보안 관리되는 온라인 엔드포인트를 만들려면 작업 영역에서 엔드포인트를 만들고 엔드포인트의 public_network_accessdisabled로 설정하여 인바운드 통신을 제어합니다. 그런 다음 엔드포인트는 인바운드 통신을 위해 작업 영역의 프라이빗 엔드포인트를 사용해야 합니다.

작업 영역은 관리되는 가상 네트워크를 갖도록 구성되어 있으므로 엔드포인트 배포에서는 아웃바운드 통신을 위해 관리되는 가상 네트워크의 프라이빗 엔드포인트를 사용합니다.

  1. 엔드포인트의 이름을 설정합니다.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    
  2. 인바운드 트래픽을 차단하려면 public_network_access가 사용하지 않도록 설정된 엔드포인트를 만듭니다.

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml --set public_network_access=disabled
    

    엔드포인트에 대한 공용 네트워크 액세스를 사용하지 않도록 설정하는 경우 엔드포인트를 호출하는 유일한 방법은 가상 네트워크의 작업 영역에 액세스할 수 있는 프라이빗 엔드포인트를 사용하는 것입니다. 자세한 내용은 보안 인바운드 채점 요청Azure Machine Learning 작업 영역에 대한 프라이빗 엔드포인트 구성을 참조하세요.

    또는 엔드포인트가 인터넷에서 채점 요청을 수신하도록 허용하려면 다음 코드의 주석 처리를 제거하고 대신 실행합니다.

    # az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    
  3. 작업 영역 관리되는 가상 네트워크에서 배포를 만듭니다.

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
    
  4. 배포 상태를 가져옵니다.

    az ml online-endpoint show -n $ENDPOINT_NAME
    
  5. CLI를 사용하여 채점 요청으로 엔드포인트를 테스트합니다.

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
    
  6. 배포 로그를 가져옵니다.

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    
  7. 더 이상 필요하지 않은 경우 엔드포인트를 삭제합니다.

    az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
    
  8. 이 문서에서 만들어진 모든 리소스를 삭제합니다. <resource-group-name>을 이 예에 사용된 리소스 그룹의 이름으로 바꿉니다.

    az group delete --resource-group <resource-group-name>
    

문제 해결

V1LegacyMode == true 메시지와 함께 온라인 엔드포인트 만들기 실패

Azure Machine Learning 작업 영역을 v1_legacy_mode로 구성하여 v2 API를 비활성화할 수 있습니다. 관리되는 온라인 엔드포인트는 v2 API 플랫폼의 기능이며 작업 영역에 v1_legacy_mode가 사용하도록 설정된 경우 작동하지 않습니다.

Important

v1_legacy_mode를 사용하지 않도록 설정하기 전에 네트워크 보안 팀에 문의하세요. 네트워크 보안 팀에서 특정한 이유로 이를 사용하도록 설정했을 수 있습니다.

v1_legacy_mode를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 v2를 사용한 네트워크 격리를 참조하세요.

키 기반 인증을 사용한 온라인 엔드포인트 만들기 실패

다음 명령을 사용하여 작업 영역에 대한 Azure Key Vault의 네트워크 규칙을 나열합니다. <keyvault-name>을 키 자격 증명 모음의 이름으로 바꿉니다.

az keyvault network-rule list -n <keyvault-name>

이 명령에 대한 응답은 다음 JSON 문서와 유사합니다.

{
    "bypass": "AzureServices",
    "defaultAction": "Deny",
    "ipRules": [],
    "virtualNetworkRules": []
}

bypass 값이 AzureServices가 아니면 키 자격 증명 모음 네트워크 설정 구성의 지침에 따라 AzureServices로 설정합니다.

이미지 다운로드 오류와 함께 온라인 배포 실패

참고 항목

이 문제는 Azure Machine Learning이 엔드포인트 아래의 각 배포에 대해 관리되는 가상 네트워크를 만드는 관리되는 온라인 엔드포인트에 대한 레거시 네트워크 격리 방법을 사용할 때 발생합니다.

  1. 배포에 대해 egress-public-network-access 플래그가 사용하지 않도록 설정되었는지 확인합니다. 이 플래그가 사용하도록 설정되고 컨테이너 레지스트리의 표시 유형이 프라이빗 경우 이 실패가 예상됩니다.

  2. 다음 명령을 사용하여 프라이빗 엔드포인트 연결 상태를 확인합니다. <registry-name>을 작업 영역의 Azure Container Registry 이름으로 바꿉니다.

    az acr private-endpoint-connection list -r <registry-name> --query "[?privateLinkServiceConnectionState.description=='Egress for Microsoft.MachineLearningServices/workspaces/onlineEndpoints'].{Name:name, status:privateLinkServiceConnectionState.status}"
    

    응답 문서에서 status 필드가 Approved로 설정되어 있는지 확인합니다. 승인되지 않은 경우 다음 명령을 사용하여 승인합니다. <private-endpoint-name>을 이전 명령에서 반환된 이름으로 바꿉니다.

    az network private-endpoint-connection approve -n <private-endpoint-name>
    

점수 엔드포인트를 확인할 수 없습니다.

  1. 채점 요청을 실행하는 클라이언트가 Azure Machine Learning 작업 영역에 액세스할 수 있는 가상 네트워크인지 확인합니다.

  2. 엔드포인트 호스트 이름에서 nslookup 명령을 사용하여 IP 주소 정보를 검색합니다.

    nslookup endpointname.westcentralus.inference.ml.azure.com
    

    응답에 주소가 포함되어 있습니다. 이 주소는 가상 네트워크에서 제공한 범위에 있어야 합니다.

    참고 항목

    Kubernetes 온라인 엔드포인트의 경우 엔드포인트 호스트 이름은 Kubernetes 클러스터에 지정된 CName(도메인 이름)이어야 합니다. HTTP 엔드포인트인 경우 Studio UI에서 직접 가져올 수 있는 엔드포인트 URI에 IP 주소가 포함됩니다. 엔드포인트의 IP 주소를 가져오는 다른 방법은 보안 Kubernetes 온라인 엔드포인트에서 찾을 수 있습니다.

  3. 호스트 이름이 nslookup 명령으로 확인되지 않는 경우 다음을 수행합니다.

    관리되는 온라인 엔드포인트의 경우

    1. 가상 네트워크의 프라이빗 DNS 영역에 A 레코드가 있는지 확인합니다.

      기록을 확인하려면 다음 명령을 사용합니다.

      az network private-dns record-set list -z privatelink.api.azureml.ms -o tsv --query [].name
      

      결과에는 *.<GUID>.inference.<region>과 유사한 항목이 포함되어야 합니다.

    2. 유추 값이 반환되지 않으면 작업 영역에 대한 프라이빗 엔드포인트를 삭제한 다음 다시 만듭니다. 자세한 내용은 프라이빗 엔드포인트를 구성하는 방법을 참조하세요.

    3. 프라이빗 엔드포인트가 있는 작업 영역이 사용자 지정 DNS 사용자 지정 DNS 서버로 작업 영역을 사용하는 방법을 사용하여 설정된 경우 다음 명령을 사용하여 사용자 지정 DNS에서 확인이 올바르게 작동하는지 확인합니다.

      dig endpointname.westcentralus.inference.ml.azure.com
      

    Kubernetes 온라인 엔드포인트의 경우

    1. Kubernetes 클러스터에서 DNS 구성을 확인합니다.

    2. 또한 다음 명령을 사용하여 azureml-fe가 예상대로 작동하는지 확인할 수 있습니다.

      kubectl exec -it deploy/azureml-fe -- /bin/bash
      (Run in azureml-fe pod)
      
      curl -vi -k https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
      "Swagger not found"
      

      HTTP의 경우 다음을 사용합니다.

      curl https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
      "Swagger not found"
      

    curl HTTPs가 실패하지만(예: 시간 제한) HTTP가 작동하는 경우 인증서가 유효한지 확인하세요.

    이것이 A 레코드로 확인되지 않으면 Azure DNS(168.63.129.16)에서 확인이 작동하는지 확인합니다.

    dig @168.63.129.16 endpointname.westcentralus.inference.ml.azure.com
    

    이 작업이 성공하면 사용자 지정 DNS의 프라이빗 링크에 대한 조건부 전달자 문제를 해결할 수 있습니다.

온라인 배포는 점수를 매길 수 없습니다.

  1. 다음 명령을 사용하여 배포가 성공적으로 배포되었는지 확인합니다.

    az ml online-deployment show -e <endpointname> -n <deploymentname> --query '{name:name,state:provisioning_state}' 
    

    배포가 성공적으로 완료되면 state의 값은 Succeeded가 됩니다.

  2. 배포에 성공했다면 다음 명령을 사용하여 트래픽이 배포에 할당되었는지 확인합니다. <endpointname>를 사용자의 엔드포인트 이름으로 바꿉니다.

    az ml online-endpoint show -n <endpointname>  --query traffic
    

    이 배포를 대상으로 하기 위해 요청에서 azureml-model-deployment 헤더를 사용하는 경우 이 단계가 필요하지 않습니다.

    이 명령의 응답에는 배포에 할당된 트래픽의 백분율이 나열되어야 합니다.

  3. 트래픽 할당(또는 배포 헤더)이 올바르게 설정된 경우 다음 명령을 사용하여 엔드포인트에 대한 로그를 가져옵니다. <endpointname>을 엔드포인트 이름으로 바꾸고 <deploymentname>을 배포로 바꿉니다.

    az ml online-deployment get-logs  -e <endpointname> -n <deploymentname> 
    

    배포에 요청을 제출할 때 채점 코드를 실행하는 데 문제가 있는지 로그를 살펴봅니다.

다음 단계