다음을 통해 공유


가상 네트워크에서 Azure Machine Learning 추론 환경(v1)을 보호합니다.

적용 대상:Python SDK azureml v1

적용 대상:Azure CLI ml 확장 v1

이 문서에서는 Azure Machine Learning의 가상 네트워크를 사용하여 추론 환경을 보호하는 방법을 알아봅니다. 이 문서는 모델을 웹 서비스로 배포하는 SDK/CLI v1 배포 워크플로에만 해당됩니다.

이 문서는 Azure Machine Learning 워크플로 보안에 대한 시리즈의 일부입니다. 이 시리즈의 다른 문서를 참조하세요.

보안 작업 영역 만들기에 대한 자습서는 자습서: 보안 작업 영역 만들기 또는 자습서: 템플릿을 사용하여 보안 작업 영역 만들기를 참조하세요.

이 문서에서는 가상 네트워크에서 다음 추론 리소스를 보호하는 방법을 알아봅니다.

  • 기본 AKS(Azure Kubernetes Service) 클러스터
  • 프라이빗 AKS 클러스터
  • 프라이빗 링크를 사용하는 AKS 클러스터

사전 요구 사항

  • 일반적인 가상 네트워크 시나리오 및 전반적인 가상 네트워크 구조를 이해하려면 네트워크 보안 개요 문서를 참조하세요.

  • 컴퓨팅 리소스에 사용할 기존 가상 네트워크 및 서브넷입니다.

  • 가상 네트워크 또는 서브넷에 리소스를 배포하려면 사용자 계정에 Azure RBAC(Azure 역할 기반 액세스 제어)에서 다음 작업에 대한 사용 권한이 있어야 합니다.

    • 가상 네트워크 리소스에 대한 "Microsoft.Network/virtualNetworks/join/action"
    • 서브넷 리소스에 대한 "Microsoft.Network/virtualNetworks/subnet/join/action"

    네트워킹과 Azure RBAC에 대한 자세한 내용은 네트워킹 기본 제공 역할을 참조하세요.

중요

이 문서의 일부 Azure CLI 명령에서는 azure-cli-ml 또는 v1(Azure Machine Learning용 확장)을 사용합니다. v1 확장에 대한 지원은 2025년 9월 30일에 종료됩니다. v1 확장은 이 날짜까지 설치하고 사용할 수 있습니다.

2025년 9월 30일 이전에 ml 또는 v2 확장으로 전환하는 것이 좋습니다. v2 확장에 대한 자세한 내용은 Azure ML CLI 확장 및 Python SDK v2를 참조하세요.

제한 사항

Azure Container Instances

Azure Machine Learning 작업 영역이 프라이빗 엔드포인트로 구성된 경우 VNet의 Azure Container Instances에 배포하는 것은 지원되지 않습니다. 대신 네트워크 격리에서 관리형 온라인 엔드포인트를 사용하는 것이 좋습니다.

Azure Kubernetes Service

  • AKS 클러스터가 VNET 뒤에 있는 경우 작업 영역 및 관련 리소스(스토리지, 키 자격 증명 모음, Azure Container Registry)는 AKS 클러스터의 VNET과 동일한 VNET에 프라이빗 엔드포인트 또는 서비스 엔드포인트가 있어야 합니다. VNET에 프라이빗 엔드포인트 또는 서비스 엔드포인트를 추가하는 보안 작업 영역 만들기 자습서를 읽어 보세요.
  • 작업 영역에 프라이빗 엔드포인트가 있는 경우 Azure Kubernetes Service 클러스터는 작업 영역과 동일한 Azure 지역에 있어야 합니다.
  • Azure Machine Learning에서는 프라이빗 AKS 클러스터와 함께 퍼블릭 FQDN(정규화된 도메인 이름)을 사용할 수 없습니다.

Azure Kubernetes Service

중요

가상 네트워크에서 AKS 클러스터를 사용하려면 먼저 AKS(Azure Kubernetes Service)에서 고급 네트워킹 구성의 필수 구성 요소를 따릅니다.

가상 네트워크의 AKS를 작업 영역에 추가하려면 다음 단계를 수행합니다.

  1. Azure Machine Learning 스튜디오에 로그인한 다음, 구독과 작업 영역을 선택합니다.

  2. 왼쪽에서 컴퓨팅을 선택하고 중앙에서 유추 클러스터를 선택한 다음 + 새로 만들기를 선택합니다.

    유추 클러스터 만들기 대화 상자의 스크린샷

  3. 유추 클러스터 만들기 대화 상자에서 새로 만들기 및 클러스터에 사용할 VM 크기를 선택합니다. 마지막으로 다음을 선택합니다.

    VM 설정의 스크린샷

  4. 설정 구성 섹션에서 컴퓨팅 이름을 입력하고 클러스터 용도, 노드 수를 선택한 다음 고급을 선택하면 네트워크 설정이 표시됩니다. 가상 네트워크 구성 영역에서 다음 값을 설정합니다.

    • 사용할 가상 네트워크를 설정합니다.

      작업 영역이 프라이빗 엔드포인트를 사용하여 가상 네트워크에 연결하는 경우 가상 네트워크 선택 필드가 회색으로 표시됩니다.

    • 클러스터를 만들 서브넷을 설정합니다.

    • Kubernetes 서비스 주소 범위 필드에 Kubernetes 서비스 주소 범위를 입력합니다. 이 주소 범위는 CIDR(Classless Inter-Domain Routing) 표기법 IP 범위를 사용하여 클러스터에 사용할 수 있는 IP 주소를 정의합니다. 서브넷 IP 범위(예: 10.0.0.0/16)와 겹치지 않아야 합니다.

    • Kubernetes DNS 서비스 IP 주소 필드에 Kubernetes DNS 서비스 IP 주소를 입력합니다. 이 IP 주소는 Kubernetes DNS 서비스에 할당됩니다. 이 주소는 Kubernetes 서비스 주소 범위(예: 10.0.0.10)에 속해야 합니다.

    • Docker 브리지 주소 필드에 Docker 브리지 주소를 입력합니다. 이 IP 주소는 Docker 브리지에 할당됩니다. 서브넷 IP 범위 또는 Kubernetes 서비스 주소 범위(예: 172.18.0.1/16)에 속하지 않아야 합니다.

    네트워크 설정 구성의 스크린샷

  5. AKS에 웹 서비스로 모델을 배포하면 추론 요청을 처리하는 점수 매기기 엔드포인트가 만들어집니다. 가상 네트워크 외부에서 호출하려는 경우 가상 네트워크를 제어하는 NSG(네트워크 보안 그룹)에 점수 매기기 엔드포인트의 IP 주소에 대해 사용하도록 설정된 인바운드 보안 규칙이 있는지 확인합니다.

    점수 매기기 엔드포인트의 IP 주소를 찾으려면 배포된 서비스에 대한 점수 매기기 URI를 확인합니다. 점수 매기기 URI를 보는 방법에 대한 자세한 내용은 웹 서비스로 배포된 모델 이용을 참조하세요.

    중요

    NSG에 대한 기본 아웃바운드 규칙을 유지합니다. 자세한 내용은 보안 그룹의 기본 보안 규칙을 참조하세요.

    인바운드 보안 규칙을 추가하는 방법을 보여 주는 스크린샷](./media/how-to-secure-inferencing-vnet/aks-vnet-inbound-nsg-scoring.png#lightbox)

    중요

    점수 매기기 엔드포인트의 이미지에 표시되는 IP 주소는 배포에 따라 다릅니다. 하나의 AKS 클러스터에 대한 모든 배포에서 동일한 IP를 공유하지만 각 AKS 클러스터는 서로 다른 IP 주소를 갖습니다.

Azure Machine Learning SDK를 사용하여 가상 네트워크에 Azure Kubernetes Service를 추가할 수도 있습니다. 가상 네트워크에 AKS 클러스터가 이미 있는 경우 AKS에 배포하는 방법의 설명에 따라 작업 영역에 연결할 수 있습니다. 다음 코드는 mynetwork라는 가상 네트워크의 default 서브넷에 새 AKS 인스턴스를 만듭니다.

적용 대상:Python SDK azureml v1

from azureml.core.compute import ComputeTarget, AksCompute

# Create the compute configuration and set virtual network information
config = AksCompute.provisioning_configuration(location="eastus2")
config.vnet_resourcegroup_name = "mygroup"
config.vnet_name = "mynetwork"
config.subnet_name = "default"
config.service_cidr = "10.0.0.0/16"
config.dns_service_ip = "10.0.0.10"
config.docker_bridge_cidr = "172.17.0.1/16"

# Create the compute target
aks_target = ComputeTarget.create(workspace=ws,
                                  name="myaks",
                                  provisioning_configuration=config)

만들기 프로세스가 완료되면 가상 네트워크 뒤에서 AKS 클러스터에 유추 또는 모델 채점을 수행할 수 있습니다. 자세한 내용은 AKS에 배포하는 방법을 참조하세요.

Kubernetes와 함께 역할 기반 액세스 제어를 사용하는 방법에 대한 자세한 내용은 Kubernetes 권한 부여에 Azure RBAC 사용을 참조하세요.

네트워크 참가자 역할

중요

이전에 만든 가상 네트워크를 제공하여 AKS 클러스터를 만들거나 연결하는 경우 AKS 클러스터에 대한 SP(서비스 주체) 또는 관리 ID에 가상 네트워크를 포함하는 리소스 그룹에 대한 네트워크 참가자 역할을 부여해야 합니다.

네트워크 참가자로 ID를 추가하려면 다음 단계를 수행합니다.

  1. AKS에 대한 서비스 주체 또는 관리 ID를 찾으려면 다음 Azure CLI 명령을 사용합니다. <aks-cluster-name>을 클러스터의 이름으로 바꿉니다. <resource-group-name>AKS 클러스터가 포함된 리소스 그룹의 이름으로 바꿉니다.

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query servicePrincipalProfile.clientId
    

    이 명령이 msi 값을 반환하는 경우 다음 명령을 사용하여 관리 ID의 주체 ID를 식별합니다.

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query identity.principalId
    
  2. 가상 네트워크가 포함된 리소스 그룹의 ID를 찾으려면 다음 명령을 사용합니다. <resource-group-name>가상 네트워크가 포함된 리소스 그룹의 이름으로 바꿉니다.

    az group show -n <resource-group-name> --query id
    
  3. 서비스 주체 또는 관리 ID를 네트워크 참가자로 추가하려면 다음 명령을 사용합니다. <SP-or-managed-identity>를 서비스 주체 또는 관리 ID에 대해 반환된 ID로 바꿉니다. <resource-group-id>를 가상 네트워크가 포함된 리소스 그룹에 대해 반환된 ID로 바꿉니다.

    az role assignment create --assignee <SP-or-managed-identity> --role 'Network Contributor' --scope <resource-group-id>
    

AKS에서 내부 부하 분산 장치를 사용하는 방법에 대한 자세한 내용은 Azure Kubernetes Service에서 내부 부하 분산 장치 사용을 참조하세요.

VNet 트래픽 보호

AKS 클러스터와 가상 네트워크 간에 트래픽을 격리하는 방법에는 두 가지가 있습니다.

  • 프라이빗 AKS 클러스터: 이 방법은 Azure Private Link를 사용하여 배포/관리 작업을 위한 클러스터와의 통신을 보호합니다.
  • 내부 AKS 부하 분산 장치: 이 방법은 가상 네트워크 내에서 개인 IP를 사용하도록 배포하기 위한 엔드포인트를 AKS에 구성합니다.

프라이빗 AKS 클러스터

기본적으로 AKS 클러스터에는 공용 IP 주소를 사용하는 API 서버 또는 컨트롤 플레인이 있습니다. 프라이빗 AKS 클러스터를 만들어 프라이빗 컨트롤 플레인을 사용하도록 AKS를 구성할 수 있습니다. 자세한 내용은 프라이빗 Azure Kubernetes Service 클러스터 만들기를 참조하세요.

프라이빗 AKS 클러스터를 만든 후에는 클러스터를 가상 네트워크에 연결하여 Azure Machine Learning에 사용합니다.

내부 AKS 부하 분산 장치

기본적으로 AKS 배포는 공용 부하 분산 장치를 사용합니다. 이 섹션에서는 내부 부하 분산 장치를 사용하도록 AKS를 구성하는 방법을 알아봅니다. 내부(또는 개인) 부하 분산 장치는 개인 IP만 프런트 엔드로 허용되는 경우에 사용됩니다. 내부 부하 분산 장치는 가상 네트워크 내부의 트래픽 부하를 분산하는 데 사용됩니다.

개인 IP 주소는 AKS가 내부 부하 분산 장치를 사용하도록 구성하여 활성화합니다.

개인 부하 분산 장치 사용

중요

Azure Machine Learning 스튜디오에서 Azure Kubernetes Service 클러스터를 만들 때는 개인 IP를 사용할 수 없습니다. 기계 학습을 위해 Python SDK 또는 Azure CLI 확장을 사용할 때 내부 부하 분산 장치를 사용하여 클러스터를 만들 수 있습니다.

다음 예제에서는 SDK 및 CLI를 사용하여 개인 IP/내부 부하 분산 장치로 새 AKS 클러스터를 만드는 방법을 보여 줍니다.

적용 대상:Python SDK azureml v1

import azureml.core
from azureml.core.compute import AksCompute, ComputeTarget

# Verify that cluster does not exist already
try:
    aks_target = AksCompute(workspace=ws, name=aks_cluster_name)
    print("Found existing aks cluster")

except:
    print("Creating new aks cluster")

    # Subnet to use for AKS
    subnet_name = "default"
    # Create AKS configuration
    prov_config=AksCompute.provisioning_configuration(load_balancer_type="InternalLoadBalancer")
    # Set info for existing virtual network to create the cluster in
    prov_config.vnet_resourcegroup_name = "myvnetresourcegroup"
    prov_config.vnet_name = "myvnetname"
    prov_config.service_cidr = "10.0.0.0/16"
    prov_config.dns_service_ip = "10.0.0.10"
    prov_config.subnet_name = subnet_name
    prov_config.load_balancer_subnet = subnet_name
    prov_config.docker_bridge_cidr = "172.17.0.1/16"

    # Create compute target
    aks_target = ComputeTarget.create(workspace = ws, name = "myaks", provisioning_configuration = prov_config)
    # Wait for the operation to complete
    aks_target.wait_for_completion(show_output = True)

작업 영역에 기존 클러스터를 연결할 때 AksCompute.attach_configuration()load_balancer_typeload_balancer_subnet 매개 변수를 사용하여 부하 분산 장치를 구성합니다.

클러스터 연결에 대한 자세한 내용은 기존 AKS 클러스터 연결을 참조하세요.

가상 네트워크에서 아웃바운드 연결 제한

기본 아웃바운드 규칙을 사용하지 않고 가상 네트워크의 아웃바운드 액세스를 제한하려면 Azure Container Registry에 대한 액세스를 허용해야 합니다. 예를 들어 NSG(네트워크 보안 그룹)에 AzureContainerRegistry.RegionNam 서비스 태그에 대한 액세스를 허용하는 규칙이 포함되어 있어야 합니다. 여기서 '{RegionName}'은 Azure 지역의 이름입니다.

다음 단계

이 문서는 Azure Machine Learning 워크플로 보안에 대한 시리즈의 일부입니다. 이 시리즈의 다른 문서를 참조하세요.