Contributor 역할은 일반적으로 Microsoft Azure 구독에서 Horizon Cloud 애플리케이션 등록 프로세스를 통해 API 호출을 수행하는 데 사용할 수 있습니다. Contributor 역할을 사용하지 않으려는 경우 이 용도로 사용자 지정 역할을 생성할 수 있습니다. 사용자 지정 역할에는 서비스 주체를 생성할 때 알고 있어야 하는 특정 필수 및 선택적 사용 권한이 있습니다.

사용자 지정 역할을 생성하려면 Azure PowerShell 또는 Azure CLI와 같은 도구를 사용하고, 최소한 이 항목에 나열된 필수 사용 권한을 포함하는 사용자 지정 역할 정의를 생성합니다. 다음 JSON 예를 참조하십시오. 이 페이지에 나열된 특정 Microsoft Azure 사용 권한에 대한 자세한 내용은 Azure 리소스 제공자 작업을 참조하십시오.

필수 사용 권한

표 1. 구독 수준에서 사용 권한을 할당할 때 사용자 지정 역할에서 허용해야 하는 Microsoft Azure 리소스 작업
작업
Microsoft.Authorization/*/read
Microsoft.Compute/*/read
Microsoft.Compute/availabilitySets/*
Microsoft.Compute/disks/*
Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/write
Microsoft.Compute/galleries/delete
Microsoft.Compute/galleries/images/*
Microsoft.Compute/galleries/images/versions/*
Microsoft.Compute/images/*
Microsoft.Compute/locations/*
Microsoft.Compute/snapshots/*
Microsoft.Compute/virtualMachines/*
Microsoft.Compute/virtualMachineScaleSets/*
Microsoft.ContainerService/managedClusters/delete
Microsoft.ContainerService/managedClusters/read
Microsoft.ContainerService/managedClusters/write
Microsoft.ContainerService/managedClusters/commandResults/read
Microsoft.ContainerService/managedClusters/runcommand/action
Microsoft.ContainerService/managedClusters/upgradeProfiles/read
Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action
Microsoft.ManagedIdentity/userAssignedIdentities/*/read
Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/read
Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/write
Microsoft.Network/loadBalancers/*
Microsoft.Network/networkInterfaces/*
Microsoft.Network/networkSecurityGroups/*
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/write
Microsoft.Network/virtualNetworks/checkIpAddressAvailability/read
Microsoft.Network/virtualNetworks/subnets/*
Microsoft.Network/virtualNetworks/virtualNetworkPeerings/read
Microsoft.ResourceGraph/*
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/read
Microsoft.Resources/subscriptions/resourceGroups/*
Microsoft.ResourceHealth/availabilityStatuses/read
Microsoft.Storage/*/read
Microsoft.Storage/storageAccounts/*

App Volumes를 사용하려는 경우 구독 수준에서 표에 나열된 사용 권한을 구성했는지 확인합니다. 이러한 사용 권한에 대한 자세한 내용은 App Volumes 애플리케이션 스토리지 계정의 Azure 개인 끝점을 참조하십시오.

작업
Microsoft.Network/locations/availablePrivateEndpointTypes/read
Microsoft.Network/privateEndpoints/read
Microsoft.Network/privateEndpoints/write
Microsoft.Network/privateEndpoints/delete
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/read
Microsoft.Network/virtualNetworks/subnets/write
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/read
Microsoft.Resources/subscriptions/resourceGroups/read

선택적 사용 권한

다음 사용 권한은 Microsoft Azure의 Horizon Edge 배포에 대해 필수가 아닙니다. 그러나 이러한 선택적 사용 권한에 의존하는 Horizon Universal Console의 기능을 포함하지 않으면 해당 기능이 작동하지 않습니다.

표 2. 구독 수준에서 사용 권한을 할당할 때 사용자 지정 역할에서 선택 사항인 Microsoft Azure 리소스 작업
작업
Microsoft.KeyVault/*/read
Microsoft.KeyVault/vaults/*
Microsoft.KeyVault/vaults/secrets/*
풀 VM의 디스크 암호화에는 Key Vault 사용 권한이 필요합니다.
Microsoft.Network/natGateways/join/action
이 사용 권한은 Horizon Edge가 생성될 때 Azure Private Link 연결 유형을 선택하고 관리 서브넷에 NAT 게이트웨이가 연결된 경우에 필요합니다. 개인 끝점 리소스를 생성하려면 사용 권한이 필요합니다.
Microsoft.Network/natGateways/read
이 사용 권한은 클러스터 아웃바운드 유형이 Horizon Edge에 대한 NAT 게이트웨이로 선택될 때 관리 서브넷의 NAT 게이트웨이가 올바르게 구성되어 있는지 검증하는 데 필요합니다.
Microsoft.Network/privateEndpoints/write
Microsoft.Network/privateEndpoints/read
Azure Private Link를 사용하여 Horizon Edge를 배포하려면 개인 끝점 사용 권한이 필요합니다.
Microsoft.Network/publicIPAddresses/* 공용 IP 주소가 있는 로드 밸런서 뒤에 Unified Access Gateway 인스턴스가 있는 Horizon Edge 인스턴스를 배포하려면 공용 IP 사용 권한이 필요합니다. 또한 이 사용 권한은 이미지를 배포하고 공용 IP 주소를 추가하는 데 필수입니다.
Microsoft.Network/routeTables/join/action
이 사용 권한은 Horizon Edge가 생성될 때 Azure Private Link 연결 유형을 선택하고 관리 서브넷에 경로 테이블이 연결된 경우에 필요합니다. 개인 끝점 리소스를 생성하려면 사용 권한이 필요합니다.
Microsoft.Network/routeTables/read
이 사용 권한은 Horizon Edge에 대해 선택된 클러스터 아웃바운드 유형이 사용자 정의 경로인 경우에 필요합니다. 기본 경로가 올바르게 구성되었는지 확인하려면 관리 서브넷의 연결된 경로 테이블을 검증해야 합니다.
참고: Microsoft Entra ID 가입 풀 또는 VM을 삭제하는 경우 서비스 주체에게 Microsoft Entra ID에서 디바이스 항목을 삭제할 수 있는 사용 권한이 있어야 합니다.

사용 권한은 다음과 같습니다.

범위: https://graph.microsoft.com/

사용 권한: Device.ReadWrite.All Read and write devices

관리자 동의: Yes

다음 위치로 이동하여 사용 권한을 부여할 수 있습니다.

구독 > Azure Active Directory > 애플리케이션 등록 > 사용 권한을 부여해야 하는 애플리케이션 선택 > API 사용 권한 > Microsoft GRAPH 선택 > Device.ReadWriteAll 선택

Microsoft Azure 사용자 지정 역할 JSON 예

다음 JSON 코드 블록은 이전 필수 및 선택적 작업 집합이 있을 때 Horizon Cloud 사용자 지정 역할 - Titan이라는 사용자 지정 역할 정의의 모습을 보여 주는 예입니다. ID는 사용자 지정 역할의 고유 ID입니다. Azure PowerShell 또는 Azure CLI를 사용하여 사용자 지정 역할을 생성하면 프로세스에서 이 ID를 자동으로 생성합니다. 변수 my_subscription_ID의 경우 사용자 지정 역할이 사용될 구독의 ID로 대체합니다.

assignableScopes 섹션에서 여러 구독 ID인 "/subscriptions/my_subscription_ID"를 사용하여 여러 구독에서 사용자 지정 역할을 사용할 수 있습니다.

표 3. 구독 수준에서 사용 권한을 할당할 때 Horizon Cloud 필수 작업을 허용하는 역할에 대한 샘플 JSON
{
    “id”: “uuid”,
    “properties”: {
        “roleName”: “Horizon Cloud Custom Role - Titan”,
        “description”: “All permissions required for deployment and operation of a Horizon Edge in Azure”,
        “assignableScopes”: [
              “/subscriptions/my_subscription_ID”
        ],
        “permissions”: [
            {
                “actions”: [
                    “Microsoft.Authorization/*/read”,
                    “Microsoft.Compute/*/read”,
                    “Microsoft.Compute/availabilitySets/*“,
                    “Microsoft.Compute/disks/*“,
                    “Microsoft.Compute/galleries/read”,
                    “Microsoft.Compute/galleries/write”,
                    “Microsoft.Compute/galleries/delete”,
                    “Microsoft.Compute/galleries/images/*”,
                    “Microsoft.Compute/galleries/images/versions/*”,
                    “Microsoft.Compute/images/*”,
                    “Microsoft.Compute/locations/*”,
                    “Microsoft.Compute/snapshots/*”,
                    “Microsoft.ContainerService/managedClusters/delete”,
                    “Microsoft.ContainerService/managedClusters/read”,
                    “Microsoft.ContainerService/managedClusters/write”,        
                    “Microsoft.ContainerService/managedClusters/commandResults/read”,
                    “Microsoft.ContainerService/managedClusters/runcommand/action”,
                    “Microsoft.ContainerService/managedClusters/upgradeProfiles/read”,
                    “Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action”,
                    “Microsoft.ManagedIdentity/userAssignedIdentities/*/read”,
                    “Microsoft.Compute/virtualMachines/*”,
                    “Microsoft.Compute/virtualMachineScaleSets/*”,
                    “Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/read”,
                    “Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/write”,
                    “Microsoft.Network/loadBalancers/*”,           
                    “Microsoft.Network/networkInterfaces/*”,
                    “Microsoft.Network/networkSecurityGroups/*”,
                    “Microsoft.Network/virtualNetworks/read”,
                    “Microsoft.Network/virtualNetworks/write”,
                    “Microsoft.Network/virtualNetworks/checkIpAddressAvailability/read”,
                    “Microsoft.Network/virtualNetworks/subnets/*”,
                    “Microsoft.Network/virtualNetworks/virtualNetworkPeerings/read”,
                    “Microsoft.ResourceGraph/*”,
                    “Microsoft.Resources/deployments/*”,
                    “Microsoft.Resources/subscriptions/read”,
                    “Microsoft.Resources/subscriptions/resourceGroups/*”,
                    “Microsoft.ResourceHealth/availabilityStatuses/read”,
                    “Microsoft.Storage/*/read”,
                    “Microsoft.Storage/storageAccounts/*”,
                    “Microsoft.KeyVault/*/read”,
                    “Microsoft.KeyVault/vaults/*”,
                    “Microsoft.KeyVault/vaults/secrets/*”,
                    “Microsoft.Network/natGateways/join/action”,
                    “Microsoft.Network/natGateways/read”,
                    “Microsoft.Network/privateEndpoints/write”,
                    “Microsoft.Network/privateEndpoints/read”,
                    “Microsoft.Network/publicIPAddresses/*”,
                    “Microsoft.Network/routeTables/join/action",
                    "Microsoft.Network/routeTables/read"
                ],
                “notActions”: [],
                “dataActions”: [],
                “notDataActions”: []
            }
        ]
    }
}