Share via


Virtual Machines의 안정성

이 문서에는 Virtual Machines에 대한 특정 안정성 권장 사항가용성 영역이 있는 VM 지역 복원력 및 지역 간 재해 복구 및 비즈니스 연속성에 대한 자세한 정보가 포함되어 있습니다.

Azure의 안정성에 대한 아키텍처 개요는 Azure 안정성을 참조하세요.

안정성 권장 사항

이 섹션에는 복원력과 가용성을 달성하기 위한 권장 사항이 포함되어 있습니다. 각 권장 사항은 다음 두 가지 범주 중 하나에 속합니다.

  • 상태 항목은 Azure 리소스 구성 설정, 다른 서비스에 대한 종속성 등 Azure 워크로드를 구성하는 주요 구성 요소의 적절한 기능 및 구성 항목과 같은 영역을 다룹니다.

  • 위험 항목은 가용성 및 복구 요구 사항, 테스트, 모니터링, 배포 및 해결되지 않은 상태로 둘 경우 환경에서 문제가 될 가능성이 큰 기타 항목과 같은 영역을 다룹니다.

안정성 권장 사항 우선 순위 매트릭스

각 권장 사항은 다음 우선 순위 매트릭스에 따라 표시됩니다.

이미지 우선 순위 설명
높음 즉시 수정 필요.
중간 3-6개월 이내에 수정.
낮음 검토 필요.

안정성 권장 사항 요약

범주 우선 순위 권장
고가용성 Azure Virtual Machine Scale Sets Flex를 사용하여 둘 이상의 VM에서 프로덕션 워크로드 실행
가용성 영역 전체에 VM 배포 또는 영역에서 Virtual Machine Scale Sets Flex 사용
가용성 집합을 사용하여 VM을 Virtual Machine Scale Sets Flex로 마이그레이션
VM 디스크에 관리 디스크 사용
재해 복구 Azure Site Recovery를 사용하여 VM 복제
Azure Backup 서비스를 사용하여 VM에 데이터 백업
성능 데이터 디스크에 애플리케이션 및 데이터베이스 데이터 호스트
프로덕션 VM은 SSD 디스크를 사용해야 함
가속화된 네트워킹(AccelNet) 사용
AccelNet을 사용하도록 설정한 경우 GuestOS NIC 드라이버를 수동으로 업데이트해야 함
관리 VM-9: 중지된 상태에서 VM 감시
VM에 대한 유지 관리 구성 사용
보안 VM에 공용 IP가 직접 연결되어 있지 않아야 함
Virtual Network 인터페이스에 NSG가 연결되어 있음
네트워크 가상 어플라이언스에 대해서만 IP 전달을 사용하도록 설정해야 함
VM 디스크에 대한 네트워크 액세스를 "퍼블릭 액세스 사용 안 함 및 프라이빗 액세스 사용"으로 설정해야 함
기본적으로 디스크 암호화 및 미사용 데이터 암호화 사용
네트워킹 고객 DNS 서버는 Virtual Network 수준에서 구성해야 함
스토리지 공유 디스크는 클러스터형 서버에서만 사용하도록 설정해야 함
규정 준수 VM이 Azure 정책을 준수하는지 확인
Monitoring VM Insights 사용
모든 Azure 리소스에 대한 진단 설정 구성

고가용성

Virtual Machine Scale Sets Flex를 사용하여 둘 이상의 VM에서 프로덕션 워크로드 실행

디스크 또는 VM을 일시적으로 사용할 수 없어 발생하는 가동 중지 시간으로부터 애플리케이션 워크로드를 보호하려면 Virtual Machine Scale Sets Flex를 사용하여 둘 이상의 VM에서 프로덕션 워크로드를 실행하는 것이 좋습니다.

프로덕션 워크로드를 실행하려면 다음을 사용하면 됩니다.

  • Azure Virtual Machine Scale Sets을 사용하면 부하 분산된 VM 그룹을 만들고 관리할 수 있습니다. VM 인스턴스의 수는 요구 또는 정의된 일정에 따라 자동으로 늘리거나 줄일 수 있습니다.

  • 가용성 영역. 가용성 영역 및 VM에 대한 자세한 내용은 지원을 참조하세요.

// Azure Resource Graph Query
// Find all VMs that are not associated with a VMSS Flex instance
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(properties.virtualMachineScaleSet.id)
| project recommendationId="vm-1", name, id, tags

가용성 영역 전체에 VM 배포 또는 영역에서 Virtual Machine Scale Sets Flex 사용*

VM을 만들 때 예상치 못한 데이터 센터 오류로부터 애플리케이션과 데이터를 보호하려면 가용성 영역을 사용합니다. VM의 가용성 영역에 대한 자세한 내용은 이 문서의 가용성 영역 지원을 참조하세요.

VM을 만들 때 가용성 영역 지원을 사용하도록 설정하는 방법에 대한 자세한 내용은 가용성 영역 지원 만들기를 참조하세요.

기존 VM을 가용성 영역 지원으로 마이그레이션하는 방법에 대한 자세한 내용은 가용성 영역 지원으로 마이그레이션을 참조하세요.

// Azure Resource Graph Query
// Find all VMs that are not assigned to a Zone
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(zones)
| project recommendationId="vm-2", name, id, tags, param1="No Zone"

가용성 집합을 사용하여 VM을 Virtual Machine Scale Sets Flex로 마이그레이션

워크로드를 VM에서 Virtual Machine Scale Sets Flex로 마이그레이션하여 워크로드를 현대화합니다.

Virtual Machine Scale Sets Flex를 사용하면 다음 두 가지 방법 중 하나로 VM을 배포할 수 있습니다.

  • 영역 간
  • 동일한 영역에 있지만 FD(장애 도메인) 및 UD(업데이트 도메인) 간에 자동으로

N 계층 애플리케이션에서는 각 애플리케이션 계층을 자체 Virtual Machine Scale Sets Flex에 배치하는 것이 좋습니다.

// Azure Resource Graph Query
// Find all VMs using Availability Sets
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.availabilitySet)
| project recommendationId = "vm-3", name, id, tags, param1=strcat("availabilitySet: ",properties.availabilitySet.id)

VM 디스크에 관리 디스크 사용*

가용성 집합의 VM에 더 나은 안정성을 제공하려면 관리 디스크를 사용합니다. 관리 디스크는 단일 실패 지점을 피할 만큼 서로 충분히 격리됩니다. 또한 관리 디스크에는 스토리지 계정에서 만든 VHD의 IOPS 제한이 적용되지 않습니다.

// Azure Resource Graph Query
// Find all VMs that are not using Managed Disks
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(properties.storageProfile.osDisk.managedDisk)
| project recommendationId = "vm-5", name, id, tags

재해 복구

Azure Site Recovery를 사용하여 VM 복제

Site Recovery를 사용하여 Azure VM을 복제하면 모든 VM 디스크가 지속적으로 대상 지역에 비동기적으로 복제됩니다. 복구 지점은 몇 분마다 만들어지므로 몇 분 단위로 RPO(복구 지점 목표)가 제공됩니다. 프로덕션 애플리케이션 또는 진행 중인 복제에 영향을 주지 않고 재해 복구 훈련을 원하는 만큼 수행할 수 있습니다.

재해 복구 훈련을 실행하는 방법을 알아보려면 테스트 장애 조치(failover) 실행을 참조하세요.

// Azure Resource Graph Query
// Find all VMs that do NOT have replication with ASR enabled
// Run query to see results.
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, id, tags
| join kind=leftouter (
    recoveryservicesresources
    | where type =~ 'Microsoft.RecoveryServices/vaults/replicationFabrics/replicationProtectionContainers/replicationProtectedItems'
    | where properties.providerSpecificDetails.dataSourceInfo.datasourceType =~ 'AzureVm'
    | project id=properties.providerSpecificDetails.dataSourceInfo.resourceId
    | extend name=strcat_array(array_slice(split(id, '/'), 8, -1), '/')
) on name
| where isnull(id1)
| project-away id1
| project-away name1
| project recommendationId = "vm-4", name, id, tags
| order by id asc

Azure Backup 서비스를 사용하여 VM에 데이터 백업

Azure Backup 서비스는 데이터를 백업하고 Microsoft Azure 클라우드에서 복구할 수 있는 간단하고, 안전하며, 비용 효율적인 솔루션을 제공합니다. 자세한 내용은 Azure Backup 서비스란?을 참조하세요.

// Azure Resource Graph Query
// Find all VMs that do NOT have Backup enabled
// Run query to see results.
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, id, tags
| join kind=leftouter (
    recoveryservicesresources
    | where type =~ 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems'
    | where properties.dataSourceInfo.datasourceType =~ 'Microsoft.Compute/virtualMachines'
    | project idBackupEnabled=properties.sourceResourceId
    | extend name=strcat_array(array_slice(split(idBackupEnabled, '/'), 8, -1), '/')
) on name
| where isnull(idBackupEnabled)
| project-away idBackupEnabled
| project-away name1
| project recommendationId = "vm-7", name, id, tags
| order by id asc

성능

데이터 디스크에 애플리케이션 및 데이터베이스 데이터 호스트

데이터 디스크는 VM에 연결된 관리 디스크입니다. 애플리케이션 데이터 또는 보관해야 하는 기타 데이터를 저장할 때 이 데이터 디스크를 사용합니다. 데이터 디스크는 SCSI 드라이브로 등록되며 사용자가 선택한 문자로 레이블이 지정됩니다. 데이터 디스크에 데이터를 호스트하면 데이터를 쉽게 백업하거나 복원할 수 있습니다. 전체 VM 및 운영 체제를 이동하지 않고 디스크를 마이그레이션할 수도 있습니다. 또한 요구 사항을 충족하는 다양한 유형, 크기 및 성능을 갖춘 다양한 디스크 SKU를 선택할 수 있습니다. 데이터 디스크에 대한 자세한 내용은 데이터 디스크를 참조하세요.

// Azure Resource Graph Query
// Find all VMs that only have OS Disk
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where array_length(properties.storageProfile.dataDisks) < 1
| project recommendationId = "vm-6", name, id, tags

프로덕션 VM은 SSD 디스크를 사용해야 함

프리미엄 SSD 디스크는 I/O 집약적인 애플리케이션 및 프로덕션 워크로드에 대해 대기 시간이 짧은 고성능 디스크 지원을 제공합니다. 표준 SSD 디스크는 더 낮은 IOPS 수준에서 일관된 성능이 필요한 워크로드에 최적화된 비용 효율적 스토리지 옵션입니다.

다음과 같이 하는 것이 좋습니다.

  • 개발/테스트 시나리오 및 덜 중요한 워크로드에 표준 HDD 디스크를 최저 비용으로 사용합니다.
  • 프리미엄 기능의 VM에서 표준 HDD 디스크 대신 프리미엄 SSD 디스크를 사용합니다. 모든 운영 체제 디스크 및 데이터 디스크에 프리미엄 스토리지를 사용하는 단일 인스턴스 VM의 경우 99.9% 이상의 VM 연결을 보장합니다.

표준 HDD에서 프리미엄 SSD 디스크로 업그레이드하려면 다음 문제를 고려하세요.

  • 업그레이드하려면 VM을 다시 부팅해야 하며, 이 프로세스가 완료될 때까지 3-5분이 소요됩니다.
  • VM이 중요 업무용 프로덕션 VM인 경우 프리미엄 디스크 비용과 비교하여 가용성이 얼마나 향상되었는지 평가합니다.

Azure 관리 디스크 및 디스크 유형에 대한 자세한 내용은 Azure 관리 디스크 유형을 참조하세요.

// Azure Resource Graph Query
// Find all disks with StandardHDD sku attached to VMs
Resources
| where type =~ 'Microsoft.Compute/disks'
| where sku.name == 'Standard_LRS' and sku.tier == 'Standard'
| where managedBy != ""
| project recommendationId = "vm-8", name, id, tags, param1=strcat("managedBy: ", managedBy)

가속화된 네트워킹(AccelNet) 사용

AccelNet을 사용하면 VM에 대한 SR-IOV(단일 루트 I/O 가상화)를 구현할 수 있어 네트워킹 성능이 크게 향상됩니다. 이 고성능 경로는 데이터 경로에서 호스트를 우회함으로써 지원되는 VM 유형에서 가장 까다로운 네트워크 워크로드에 대한 대기 시간, 지터 및 CPU 사용률을 줄입니다.

가속화된 네트워킹에 대한 자세한 내용은 가속화된 네트워킹을 참조하세요.

// Azure Resource Graph Query
// Find all VM NICs that do not have Accelerated Networking enabled
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| mv-expand nic = properties.networkProfile.networkInterfaces
| project name, id, tags, lowerCaseNicId = tolower(nic.id), vmSize = tostring(properties.hardwareProfile.vmSize)
| join kind = inner (
    resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where properties.enableAcceleratedNetworking == false
    | project nicName = split(id, "/")[8], lowerCaseNicId = tolower(id)
    )
    on lowerCaseNicId
| summarize nicNames = make_set(nicName) by name, id, tostring(tags), vmSize
| extend param1 = strcat("NicName: ", strcat_array(nicNames, ", ")), param2 = strcat("VMSize: ", vmSize)
| project recommendationId = "vm-10", name, id, tags, param1, param2
| order by id asc

AccelNet을 사용하도록 설정한 경우 GuestOS NIC 드라이버를 수동으로 업데이트해야 함

AccelNet을 사용하도록 설정한 경우 GuestOS의 기본 Azure Virtual Network 인터페이스가 Mellanox 인터페이스로 대체됩니다. 결과적으로 GuestOS NIC 드라이버는 타사 공급업체인 Mellanox에서 제공합니다. Microsoft에서 유지 관리하는 Marketplace 이미지는 최신 버전의 Mellanox 드라이버와 함께 제공되지만, VM이 배포되면 6개월마다 GuestOS NIC 드라이버를 수동으로 업데이트해야 합니다.

// cannot-be-validated-with-arg

관리

중지된 상태에서 VM 검토

VM 인스턴스는 프로비전 및 전원 상태를 포함하여 다양한 상태로 진행됩니다. VM이 중지된 상태인 경우 VM에 문제가 있거나 더 이상 필요하지 않아 비용을 줄이기 위해 제거할 수 있습니다.

// Azure Resource Graph Query
// Find all VMs that are NOT running
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where properties.extended.instanceView.powerState.displayStatus != 'VM running'
| project recommendationId = "vm-9", name, id, tags

VM에 대한 유지 관리 구성 사용

VM 업데이트/중단이 계획된 시간 프레임에서 수행되도록 하려면 유지 관리 구성 설정을 사용하여 업데이트를 예약하고 관리합니다. 유지 관리 구성을 사용하여 VM 업데이트를 관리하는 방법에 대한 자세한 내용은 유지 관리 구성을 사용하여 VM 업데이트 관리를 참조하세요.

// Azure Resource Graph Query
// Find VMS that do not have maintenance configuration assigned
Resources
| extend resourceId = tolower(id)
| project name, location, type, id, tags, resourceId, properties
| where type =~ 'Microsoft.Compute/virtualMachines'
| join kind=leftouter (
maintenanceresources
| where type =~ "microsoft.maintenance/configurationassignments"
| project planName = name, type, maintenanceProps = properties
| extend resourceId = tostring(maintenanceProps.resourceId)
) on resourceId
| where isnull(maintenanceProps)
| project recommendationId = "vm-22",name, id, tags
| order by id asc

보안

VM에 공용 IP가 직접 연결되어 있지 않아야 함

VM에 아웃바운드 인터넷 연결이 필요한 경우 NAT Gateway 또는 Azure Firewall을 사용하는 것이 좋습니다. NAT Gateway 또는 Azure Firewall 두 서비스 모두 가용성이 높고 SNAT(Source Network Address Translation) 포트가 있기 때문에 서비스의 보안 및 복원력을 높이는 데 도움이 됩니다. 인바운드 인터넷 연결의 경우 Azure Load Balancer 및 Application Gateway 같은 부하 분산 솔루션을 사용하는 것이 좋습니다.

// Azure Resource Graph Query
// Find all VMs with PublicIPs directly associated with them
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where isnotnull(properties.ipConfigurations)
    | mv-expand ipconfig=properties.ipConfigurations
    | extend publicIp = tostring(ipconfig.properties.publicIPAddress.id)
    | where publicIp != ""
    | project name, nicId = tostring(id), publicIp
) on nicId
| project recommendationId = "vm-12", name, id, tags
| order by id asc

VM 네트워크 인터페이스에는 NSG(네트워크 보안 그룹)가 연결되어 있음*

NSG를 서브넷 또는 네트워크 인터페이스 중 하나에만 연결하는 것이 좋습니다. 서브넷에 연결된 NSG의 규칙이 네트워크 인터페이스에 연결된 NSG의 규칙과 충돌할 수 있으므로 해결해야 하는 예기치 않은 통신 문제가 발생할 수 있습니다. 자세한 내용은 서브넷 간 트래픽을 참조하세요.

// Azure Resource Graph Query
// Provides a list of virtual machines and associated NICs that do have an NSG associated to them and also an NSG associated to the subnet.
Resources
| where type =~ 'Microsoft.Network/networkInterfaces'
| where isnotnull(properties.networkSecurityGroup)
| mv-expand ipConfigurations = properties.ipConfigurations, nsg = properties.networkSecurityGroup
| project nicId = tostring(id), subnetId = tostring(ipConfigurations.properties.subnet.id), nsgName=split(nsg.id, '/')[8]
| parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet
    | join kind=inner (
        Resources
        | where type =~ 'Microsoft.Network/NetworkSecurityGroups' and isnotnull(properties.subnets)
        | project name, resourceGroup, subnet=properties.subnets
        | mv-expand subnet
        | project subnetId=tostring(subnet.id)
    ) on subnetId
    | project nicId
| join kind=leftouter (
    Resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | where isnotnull(properties.networkProfile.networkInterfaces)
    | mv-expand nic=properties.networkProfile.networkInterfaces
    | project vmName = name, vmId = id, tags, nicId = nic.id, nicName=split(nic.id, '/')[8]
    | extend nicId = tostring(nicId)
) on nicId
| project recommendationId = "vm-13", name=vmName, id = vmId, tags, param1 = strcat("nic-name=", nicName)

네트워크 가상 어플라이언스에 대해서만 IP 전달을 사용하도록 설정해야 함

IP 전달을 사용하면 가상 머신 네트워크 인터페이스에서 다음 작업을 수행할 수 있습니다.

  • 네트워크 인터페이스에 할당된 IP 구성에 할당되어 있는 IP 주소 중 하나를 대상으로 하지 않는 네트워크 트래픽을 받습니다.

  • 네트워크 인터페이스의 IP 구성 중 하나에 할당된 것과 소스 IP 주소가 다른 네트워크 트래픽을 보냅니다.

전달해야 하는 트래픽을 받는 VM에 연결된 모든 네트워크 인터페이스에서 IP 전달 설정을 사용하도록 설정해야 합니다. VM은 네트워크 인터페이스가 하나만 연결되어 있든, 여러 개 연결되어 있든 관계없이 트래픽을 전달할 수 있습니다. IP 전달은 Azure 설정이지만, VM은 방화벽, WAN 최적화 및 부하 분산 애플리케이션과 같이 트래픽을 전달할 수 있는 애플리케이션도 실행해야 합니다.

IP 전달을 사용하거나 사용하지 않도록 설정하는 방법을 알아보려면 IP 전달 사용 또는 사용 안 함을 참조하세요.

// Azure Resource Graph Query
// Find all VM NICs that have IPForwarding enabled. This feature is usually only required for Network Virtual Appliances
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where properties.enableIPForwarding == true
    | project nicId = tostring(id)
) on nicId
| project recommendationId = "vm-14", name, id, tags
| order by id asc

VM 디스크에 대한 네트워크 액세스를 "퍼블릭 액세스 사용 안 함 및 프라이빗 액세스 사용"으로 설정해야 함

VM 디스크 네트워크 액세스를 “퍼블릭 액세스 사용 안 함 및 프라이빗 액세스 사용”으로 설정하고 프라이빗 엔드포인트를 만드는 것이 좋습니다. 프라이빗 엔드포인트를 만드는 방법을 알아보려면 프라이빗 엔드포인트 만들기를 참조하세요.

// Azure Resource Graph Query
// Find all Disks with "Enable public access from all networks" enabled
resources
| where type =~ 'Microsoft.Compute/disks'
| where properties.publicNetworkAccess == "Enabled"
| project id, name, tags, lowerCaseDiskId = tolower(id)
| join kind = leftouter (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project osDiskVmName = name, lowerCaseOsDiskId = tolower(properties.storageProfile.osDisk.managedDisk.id)
    | join kind = fullouter (
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | mv-expand dataDisks = properties.storageProfile.dataDisks
        | project dataDiskVmName = name, lowerCaseDataDiskId = tolower(dataDisks.managedDisk.id)
        )
        on $left.lowerCaseOsDiskId == $right.lowerCaseDataDiskId
    | project lowerCaseDiskId = coalesce(lowerCaseOsDiskId, lowerCaseDataDiskId), vmName = coalesce(osDiskVmName, dataDiskVmName)
    )
    on lowerCaseDiskId
| summarize vmNames = make_set(vmName) by name, id, tostring(tags)
| extend param1 = iif(isempty(vmNames[0]), "VMName: n/a", strcat("VMName: ", strcat_array(vmNames, ", ")))
| project recommendationId = "vm-17", name, id, tags, param1
| order by id asc

기본적으로 디스크 암호화 및 미사용 데이터 암호화 사용

ADE(Azure Disk Encryption), SSE(서버 쪽 암호화) 및 호스트의 암호화를 포함하여 관리 디스크에 사용할 수 있는 여러 유형의 암호화가 있습니다.

  • Azure Disk Encryption은 조직의 보안 및 규정 준수 약정에 따라 데이터를 안전하게 보호하는 데 도움이 됩니다.
  • Azure Disk Storage 서버 쪽 암호화(미사용 암호화 또는 Azure Storage 암호화라고도 함)는 스토리지 클러스터에 유지할 때 Azure 관리 디스크(OS 및 데이터 디스크)에 저장된 데이터를 자동으로 암호화합니다.
  • 호스트에서 암호화를 사용하면 VM을 호스팅하는 VM 호스트에 저장된 데이터는 미사용 시 암호화되고 스토리지 클러스터에 암호화된 상태로 전송됩니다.
  • 기밀 디스크 암호화는 디스크 암호화 키를 VM의 TPM에 바인딩하고, 보호된 디스크 콘텐츠를 VM에서만 액세스할 수 있도록 합니다.

관리 디스크 암호화 옵션에 대한 자세한 내용은 관리 디스크 암호화 옵션 개요를 참조하세요.

// under-development

네트워킹

고객 DNS 서버는 Virtual Network 수준에서 구성해야 함

환경 전반에 걸쳐 이름 확인 불일치가 발생하지 않도록 가상 네트워크에 DNS 서버를 구성합니다. Azure Virtual Network의 리소스 이름 확인에 대한 자세한 내용은 VM 및 클라우드 서비스에 대한 이름 확인을 참조하세요.

// Azure Resource Graph Query
// Find all VM NICs that have DNS Server settings configured in any of the NICs
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | project name, id, dnsServers = properties.dnsSettings.dnsServers
    | extend hasDns = array_length(dnsServers) >= 1
    | where hasDns != 0
    | project name, nicId = tostring(id)
) on nicId
| project recommendationId = "vm-15", name, id, tags
| order by id asc

스토리지

공유 디스크는 클러스터형 서버에서만 사용하도록 설정해야 함

Azure 공유 디스크는 여러 VM에 관리 디스크를 동시에 연결할 수 있는 Azure 관리 디스크의 기능입니다. 관리 디스크를 여러 VM에 연결하면 새로 배포하거나 기존 클러스터형애플리케이션을 Azure로 마이그레이션할 수 있습니다. 공유 디스크는 디스크가 클러스터의 둘 이상의 VM 멤버에 할당되는 경우에만 사용해야 합니다.

관리 디스크에 공유 디스크를 사용하도록 설정하는 방법에 대한 자세한 내용은 공유 디스크 사용을 참조하세요.

// Azure Resource Graph Query
// Find all Disks configured to be Shared. This is not an indication of an issue, but if a disk with this configuration is assigned to two or more VMs without a proper disk control mechanism (like a WSFC) it can lead to data loss
resources
| where type =~ 'Microsoft.Compute/disks'
| where isnotnull(properties.maxShares)
| project id, name, tags, lowerCaseDiskId = tolower(id), diskState = tostring(properties.diskState)
| join kind = leftouter (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project osDiskVmName = name, lowerCaseOsDiskId = tolower(properties.storageProfile.osDisk.managedDisk.id)
    | join kind = fullouter (
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | mv-expand dataDisks = properties.storageProfile.dataDisks
        | project dataDiskVmName = name, lowerCaseDataDiskId = tolower(dataDisks.managedDisk.id)
        )
        on $left.lowerCaseOsDiskId == $right.lowerCaseDataDiskId
    | project lowerCaseDiskId = coalesce(lowerCaseOsDiskId, lowerCaseDataDiskId), vmName = coalesce(osDiskVmName, dataDiskVmName)
    )
    on lowerCaseDiskId
| summarize vmNames = make_set(vmName) by name, id, tostring(tags), diskState
| extend param1 = strcat("DiskState: ", diskState), param2 = iif(isempty(vmNames[0]), "VMName: n/a", strcat("VMName: ", strcat_array(vmNames, ", ")))
| project recommendationId = "vm-16", name, id, tags, param1, param2
| order by id asc

규정 준수

VM이 Azure 정책을 준수하는지 확인

실행하는 애플리케이션에 대해 VM을 안전하게 유지하는 것은 중요합니다. VM 보안은 VM에 대한 보안 액세스 및 데이터의 보안 스토리지를 포함하는 하나 이상의 Azure 서비스 및 기능을 포함할 수 있습니다. VM 및 애플리케이션을 안전하게 유지하는 방법에 대한 자세한 내용은 Azure Virtual Machines에 대한 Azure Policy 규정 준수 제어를 참조하세요.

// Azure Resource Graph Query
// Find all VMs in "NonCompliant" state with Azure Policies
PolicyResources
| where type =~ "Microsoft.PolicyInsights/policyStates" and properties.resourceType =~ "Microsoft.Compute/virtualMachines" and properties.complianceState =~ "NonCompliant"
| project
    policyAssignmentName = properties.policyAssignmentName,
    policyDefinitionName = properties.policyDefinitionName,
    lowerCasePolicyDefinitionIdOfPolicyState = tolower(properties.policyDefinitionId),
    lowerCaseVmIdOfPolicyState = tolower(properties.resourceId)
| join kind = leftouter (
    PolicyResources
    | where type =~ "Microsoft.Authorization/policyDefinitions"
    | project lowerCasePolicyDefinitionId = tolower(id), policyDefinitionDisplayName = properties.displayName
    )
    on $left.lowerCasePolicyDefinitionIdOfPolicyState == $right.lowerCasePolicyDefinitionId
| project policyAssignmentName, policyDefinitionName, policyDefinitionDisplayName, lowerCaseVmIdOfPolicyState
| join kind = leftouter (
    Resources
    | where type =~ "Microsoft.Compute/virtualMachines"
    | project vmName = name, vmId = id, vmTags = tags, lowerCaseVmId = tolower(id)
    )
    on $left.lowerCaseVmIdOfPolicyState == $right.lowerCaseVmId
| extend
    param1 = strcat("AssignmentName: ", policyAssignmentName),
    param2 = strcat("DefinitionName: ", policyDefinitionDisplayName),  // Align to Azure portal's term.
    param3 = strcat("DefinitionID: ", policyDefinitionName)            // Align to Azure portal's term.
| project recommendationId = "vm-18", name = vmName, id = vmId, tags = vmTags, param1, param2, param3

모니터링

VM 인사이트 사용

가상 머신의 상태 및 성능에 대해 자세히 알아보려면 VM Insights를 사용합니다. VM Insights는 실행 중인 프로세스와 다른 리소스에 대한 종속성을 모니터링하여 VM 및 가상 머신 확장 집합의 성능 및 상태에 대한 정보를 제공합니다. VM Insights는 성능 병목 상태 및 네트워크 문제를 식별하여 중요한 애플리케이션의 예측 가능한 성능 및 가용성을 제공하는 데 도움이 될 수 있습니다. 또한 문제가 다른 종속성과 관련이 있는지 여부를 이해하는 데도 도움이 됩니다.

// Azure Resource Graph Query
// Check for VMs without Azure Monitoring Agent extension installed, missing Data Collection Rule or Data Collection Rule without performance enabled.
Resources
| where type == 'microsoft.compute/virtualmachines'
| project idVm = tolower(id), name, tags
| join kind=leftouter (
    InsightsResources
    | where type =~ "Microsoft.Insights/dataCollectionRuleAssociations" and id has "Microsoft.Compute/virtualMachines"
    | project idDcr = tolower(properties.dataCollectionRuleId), idVmDcr = tolower(substring(id, 0, indexof(id, "/providers/Microsoft.Insights/dataCollectionRuleAssociations/"))))
on $left.idVm == $right.idVmDcr
| join kind=leftouter (
    Resources
    | where type =~ "Microsoft.Insights/dataCollectionRules"
    | extend
        isPerformanceEnabled = iif(properties.dataSources.performanceCounters contains "Microsoft-InsightsMetrics" and properties.dataFlows contains "Microsoft-InsightsMetrics", true, false),
        isMapEnabled = iif(properties.dataSources.extensions contains "Microsoft-ServiceMap" and properties.dataSources.extensions contains "DependencyAgent" and properties.dataFlows contains "Microsoft-ServiceMap", true, false)//,
    | where isPerformanceEnabled or isMapEnabled
    | project dcrName = name, isPerformanceEnabled, isMapEnabled, idDcr = tolower(id))
on $left.idDcr == $right.idDcr
| join kind=leftouter (
    Resources
        | where type == 'microsoft.compute/virtualmachines/extensions' and (name contains 'AzureMonitorWindowsAgent' or name contains 'AzureMonitorLinuxAgent')
        | extend idVmExtension = tolower(substring(id, 0, indexof(id, '/extensions'))), extensionName = name)
on $left.idVm == $right.idVmExtension
| where isPerformanceEnabled != 1 or (extensionName != 'AzureMonitorWindowsAgent' and extensionName != 'AzureMonitorLinuxAgent')
| project recommendationId = "vm-20", name, id = idVm, tags, param1 = strcat('MonitoringExtension:', extensionName), param2 = strcat('DataCollectionRuleId:', idDcr), param3 = strcat('isPerformanceEnabled:', isPerformanceEnabled)

모든 Azure 리소스에 대한 진단 설정 구성

플랫폼 메트릭은 기본적으로 구성 없이 자동으로 Azure Monitor 메트릭으로 전송됩니다. 플랫폼 로그는 Azure 리소스 및 해당 리소스가 종속된 Azure 플랫폼에 대한 세부 진단 및 감사 정보를 제공하며, 다음 유형 중 하나입니다.

  • 리소스 로그는 대상으로 라우팅될 때까지 수집되지 않습니다.
  • 활동 로그는 자체적으로 존재하지만 다른 위치로 라우팅될 수 있습니다.

각 Azure 리소스에는 다음 기준을 정의하는 자체 진단 설정이 필요합니다.

  • 원본: 설정에 정의된 대상으로 보낼 메트릭 및 로그 데이터의 유형입니다. 사용 가능한 형식은 리소스 종류에 따라 다릅니다.
  • 대상: 보내려는 하나 이상의 대상입니다.

단일 진단 설정으로 각 대상 중 하나만 정의할 수 있습니다. 데이터를 2개 이상의 특정 대상 유형(예: 두 개의 다른 Log Analytics 작업 영역)으로 보내려면 여러 개의 설정을 만듭니다. 각 리소스에는 최대 5개의 진단 설정이 있을 수 있습니다.

자세한 내용은 Azure Monitor의 진단 설정을 참조하세요.

// Azure Resource Graph Query
// Find all Virtual Machines without diagnostic settings enabled/with diagnostic settings enabled but not configured both performance counters and event logs/syslogs.
resources
| where type =~ "microsoft.compute/virtualmachines"
| project name, id, tags, lowerCaseVmId = tolower(id)
| join kind = leftouter (
    resources
    | where type =~ "Microsoft.Compute/virtualMachines/extensions" and properties.publisher =~ "Microsoft.Azure.Diagnostics"
    | project
        lowerCaseVmIdOfExtension = tolower(substring(id, 0, indexof(id, "/extensions/"))),
        extensionType = properties.type,
        provisioningState = properties.provisioningState,
        storageAccount = properties.settings.StorageAccount,
        // Windows
        wadPerfCounters = properties.settings.WadCfg.DiagnosticMonitorConfiguration.PerformanceCounters.PerformanceCounterConfiguration,
        wadEventLogs = properties.settings.WadCfg.DiagnosticMonitorConfiguration.WindowsEventLog,
        // Linux
        ladPerfCounters = properties.settings.ladCfg.diagnosticMonitorConfiguration.performanceCounters.performanceCounterConfiguration,
        ladSyslog = properties.settings.ladCfg.diagnosticMonitorConfiguration.syslogEvents
    | extend
        // Windows
        isWadPerfCountersConfigured = iif(array_length(wadPerfCounters) > 0, true, false),
        isWadEventLogsConfigured = iif(isnotnull(wadEventLogs) and array_length(wadEventLogs.DataSource) > 0, true, false),
        // Linux
        isLadPerfCountersConfigured = iif(array_length(ladPerfCounters) > 0, true, false),
        isLadSyslogConfigured = isnotnull(ladSyslog)
    | project
        lowerCaseVmIdOfExtension,
        extensionType,
        provisioningState,
        storageAccount,
        isPerfCountersConfigured = case(extensionType =~ "IaaSDiagnostics", isWadPerfCountersConfigured, extensionType =~ "LinuxDiagnostic", isLadPerfCountersConfigured, false),
        isEventLogsConfigured = case(extensionType =~ "IaaSDiagnostics", isWadEventLogsConfigured, extensionType =~ "LinuxDiagnostic", isLadSyslogConfigured, false)
    )
    on $left.lowerCaseVmId == $right.lowerCaseVmIdOfExtension
| where isempty(lowerCaseVmIdOfExtension) or provisioningState !~ "Succeeded" or not(isPerfCountersConfigured and isEventLogsConfigured)
| extend
    param1 = strcat("DiagnosticSetting: ", iif(isnotnull(extensionType), strcat("Enabled, partially configured (", extensionType, ")"), "Not enabled")),
    param2 = strcat("ProvisioningState: ", iif(isnotnull(provisioningState), provisioningState, "n/a")),
    param3 = strcat("storageAccount: ", iif(isnotnull(storageAccount), storageAccount, "n/a")),
    param4 = strcat("PerformanceCounters: ", case(isnull(isPerfCountersConfigured), "n/a", isPerfCountersConfigured, "Configured", "Not configured")),
    param5 = strcat("EventLogs/Syslogs: ", case(isnull(isEventLogsConfigured), "n/a", isEventLogsConfigured, "Configured", "Not configured"))
| project recommendationId = "vm-21", name, id, tags, param1, param2, param3, param4, param5

가용성 영역 지원

Azure 가용성 영역은 각 Azure 지역 내에서 물리적으로 분리된 세 개 이상의 데이터 센터 그룹입니다. 각 영역 내의 데이터 센터에는 독립적인 전원, 냉각, 네트워킹 인프라가 장착되어 있습니다. 가용성 영역은 로컬 영역이 실패한 경우에 한 영역이 영향을 받는 경우 나머지 두 영역에서 지역 서비스, 용량 및 고가용성을 지원하도록 설계되었습니다.

오류는 소프트웨어 및 하드웨어 오류에서 지진, 홍수 및 화재와 같은 이벤트에 이르기까지 다양합니다. Azure 서비스의 중복성과 논리적 격리로 인해 오류 허용성에 도달합니다. Azure의 가용성 영역에 대한 자세한 내용은 지역 및 가용성 영역을 참조하세요.

Azure 가용성 영역 지원 서비스는 적절한 수준의 복원력과 유연성을 제공하도록 설계되었습니다. 두 가지 방법으로 구성할 수 있습니다. 영역 간 자동 복제를 사용하는 영역 중복 또는 특정 영역에 고정된 인스턴스를 사용하는 영역일 수 있습니다. 이러한 방식을 결합할 수도 있습니다. 영역 및 영역 중복 아키텍처에 대한 자세한 내용은 가용성 영역 및 지역 사용에 대한 권장 사항을 참조하세요.

가상 머신은 지원되는 Azure 지역당 세 개의 가용성 영역이 있는 가용성 영역을 지원하며, 이는 영역 중복 및 영역이기도 합니다. 자세한 내용은 가용성 영역 지원을 참조하세요. 고객은 가용성을 위해 가상 머신을 구성하고 마이그레이션할 책임이 있습니다.

가용성 영역 준비 옵션에 대한 자세한 내용은 다음을 참조하세요.

필수 조건

  • 가상 머신 SKU는 해당 지역의 영역에서 사용할 수 있어야 합니다. 가용성 영역을 지원하는 지역을 검토하려면 지원되는 지역 목록을 참조하세요.

  • VM SKU는 해당 지역의 영역에서 사용할 수 있어야 합니다. VM SKU 가용성을 확인하려면 다음 방법 중 하나를 사용합니다.

SLA 개선 사항

가용성 영역은 물리적으로 분리되어 있고 고유한 전원, 네트워크 및 냉각을 제공하기 때문에 SLA(서비스 수준 계약)가 증가합니다. 자세한 내용은 Virtual Machines에 대한 SLA를 참조하세요.

가용성 영역을 사용하도록 설정된 리소스 만들기

다음 배포 옵션에서 가용성 영역이 사용하도록 설정된 VM(가상 머신)을 만들어 시작합니다.

영역 장애 조치 지원

Site Recovery 서비스를 사용하여 다른 영역으로 장애 조치(failover)되도록 가상 머신을 설정할 수 있습니다. 자세한 내용은 Site Recovery를 참조하세요.

내결함성

가상 머신은 클러스터의 다른 서버로 장애 조치할 수 있으며, 새 서버에서 VM의 운영 체제가 다시 시작됩니다. 재해 복구를 위한 장애 조치(failover) 프로세스, 복구 계획에서 가상 머신 수집 및 재해 복구 훈련을 실행하여 내결함성 솔루션이 성공하도록 해야 합니다.

자세한 내용은 사이트 복구 프로세스를 참조하세요.

영역 다운 환경

영역 전체가 중단되는 동안 가상 머신 서비스의 자체 복구가 기본 용량의 균형을 유지하여 정상 영역으로 조정될 때까지 잠시 성능이 저하될 수 있음을 예상해야 합니다. 자동 복구는 영역 복원에 의존하지 않습니다. Microsoft 관리형 서비스 자동 복구 상태는 다른 영역의 용량을 사용하여 손실된 영역을 보완합니다.

또한 전체 지역의 가동 중단 가능성에 대비해야 합니다. 전체 지역에 서비스 중단이 발생하는 경우 데이터의 로컬 중복 복사본을 일시적으로 사용할 수 없게 됩니다. 지역 복제를 사용하는 경우 Azure Storage Blob 및 테이블의 다른 사본 3개는 다른 지역에 저장됩니다. 전체 지역 가동 중단 또는 주 지역을 복구할 수 없는 재해가 발생하는 경우 Azure는 지역 복제 영역에 모든 DNS 항목을 다시 매핑합니다.

영역 중단 준비 및 복구

Azure 가상 머신 애플리케이션이 배포된 전체 지역의 서비스가 중단되는 동안 Azure 가상 머신에 대해 다음 지침이 제공됩니다.

짧은 대기 시간 디자인

지역 간(보조 지역), 구독 간(미리 보기) 및 영역 간(미리 보기)은 대기 시간이 짧은 가상 머신 솔루션을 설계할 때 고려할 수 있는 옵션입니다. 이러한 옵션에 대한 자세한 내용은 지원되는 복원 방법을 참조하세요.

Important

영역 인식 배포를 옵트아웃하여 기본 오류의 격리로부터 보호를 포기합니다. 가용성 영역을 지원하지 않거나 가용성 영역 구성에서 옵트아웃하는 SKU를 사용하면 영역 배치 및 분리를 준수하지 않는 리소스(이러한 리소스의 기본 종속성 포함)에 의존하게 됩니다. 이러한 리소스는 영역 다운 시나리오에서 살아남을 것으로 예상되지 않아야 합니다. 이러한 리소스를 활용하는 솔루션은 재해 복구 전략을 정의하고 다른 지역에서 솔루션의 복구를 구성해야 합니다.

안전한 배포 기술

가용성 영역 격리를 선택하는 경우 애플리케이션 코드와 애플리케이션 업그레이드에 안전한 배포 기술을 활용해야 합니다. Azure Site Recovery 구성 외에도 VM에 대해 다음과 같은 안전한 배포 기술 중 하나를 구현합니다.

Microsoft는 계획된 유지 관리 업데이트를 주기적으로 수행하므로 기본 인프라에 필요한 업데이트를 적용하기 위해 가상 머신을 다시 부팅해야 하는 경우는 드물 수 있습니다. 더 자세히 알아보려면 예약된 유지 관리 중 가용성 고려 사항을 참조하세요.

다른 영역에서 다음 노드 집합을 업그레이드하기 전에 다음 작업을 수행해야 합니다.

가용성 영역 지원으로 마이그레이션

VM을 가용성 영역 지원으로 마이그레이션하는 방법을 알아보려면 Virtual Machines 및 Virtual Machine Scale Sets를 가용성 영역 지원으로 마이그레이션을 참조하세요.

지역 간 재해 복구 및 비즈니스 연속성

DR(재해 복구)은 가동 중지 시간 및 데이터 손실을 초래하는 자연 재해 또는 실패한 배포와 같은 영향이 큰 이벤트로부터 복구하는 것입니다. 원인에 관계없이 최상의 재해 해결책은 잘 정의되고 테스트된 DR 계획과 DR을 적극적으로 지원하는 애플리케이션 디자인입니다. 재해 복구 계획을 만들기 전에 재해 복구 전략을 디자인하기 위한 권장 사항을 참조하세요.

DR과 관련하여 Microsoft는 공동 책임 모델을 사용합니다. 공동 책임 모델에서 Microsoft는 기준 인프라 및 플랫폼 서비스를 사용할 수 있도록 합니다. 동시에 많은 Azure 서비스는 데이터를 자동으로 복제하거나 실패한 지역에서 대체하여 사용하도록 설정된 다른 지역으로 교차 복제하지 않습니다. 이러한 서비스의 경우 자신의 워크로드에 적합한 재해 복구 계획을 설정할 책임이 있습니다. Azure PaaS(Platform as a Service) 제품에서 실행되는 대부분의 서비스는 DR을 지원하는 기능과 지침을 제공하며, 서비스별 기능을 사용하여 빠른 복구를 지원하여 DR 계획을 개발하는 데 도움이 될 수 있습니다.

지역 간 복원을 사용하여 쌍을 이루는 지역을 통해 Azure VM을 복원할 수 있습니다. 지역 간 복원을 사용하면 백업이 보조 지역에서 수행되는 경우 선택한 복구 지점에 대한 모든 Azure VM을 복원할 수 있습니다. 지역 간 복원에 대한 자세한 내용은 복원 옵션에서 지역 간 테이블 행 항목을 참조하세요.

다중 지역 지리의 재해 복구

지역 전체의 서비스 중단이 발생하는 경우 Microsoft는 가상 머신 서비스를 복원하기 위해 성실히 작업합니다. 그러나 가장 높은 수준의 가용성을 달성하려면 다른 애플리케이션별 백업 전략에 의존해야 합니다. 자세한 내용은 재해 복구를 위한 데이터 전략의 섹션을 참조하세요.

중단 검색, 알림 및 관리

가상 머신의 하드웨어 또는 물리적 인프라가 예기치 않게 실패할 수 있습니다. 예기치 않은 오류에는 로컬 네트워크 오류, 로컬 디스크 오류 또는 기타 랙 수준 오류가 포함될 수 있습니다. 이러한 오류가 감지되면 Azure 플랫폼에서 가상 머신을 동일한 데이터 센터의 정상적인 물리적 컴퓨터로 자동으로 마이그레이션(복구)합니다. 복구 과정 중에 가상 머신에서 가동 중지(재부팅)가 발생하고 경우에 따라 임시 드라이브가 손실됩니다. 연결된 OS 및 데이터 디스크는 항상 유지됩니다.

가상 머신 서비스 중단에 대한 자세한 내용은 재해 복구 지침을 참조하세요.

재해 복구 및 중단 검색 설정

가상 머신에 대한 재해 복구를 설정할 때 Azure Site Recovery에서 제공하는 내용을 이해합니다. 아래 방법을 사용하여 가상 머신에 대한 재해 복구를 사용하도록 설정합니다.

단일 지역 지리의 재해 복구

재해 복구를 설정하면 Azure VM이 다른 대상 지역에 지속적으로 복제됩니다. 중단이 발생하는 경우 VM을 보조 지역으로 장애 조치하고, 해당 지역에서 액세스할 수 있습니다.

Site Recovery를 사용하여 Azure VM을 복제할 때 모든 VM 디스크가 지속적으로 대상 지역에 비동기적으로 복제됩니다. 복구 지점은 몇 분마다 만들어지므로 몇 분 단위로 RPO(복구 지점 목표)가 부여됩니다. 프로덕션 애플리케이션 또는 진행 중인 복제에 영향을 주지 않고 재해 복구 훈련을 원하는 만큼 수행할 수 있습니다. 자세한 내용은 Azure로 재해 복구 훈련 실행을 참조하세요.

자세한 내용은 Azure VM 아키텍처 구성 요소지역 페어링을 참조하세요.

용량과 사전 예방적 재해 복구 복원력

Microsoft와 해당 고객은 공동 책임 모델에 따라 운영됩니다. 공동 책임은 고객 지원 DR(고객 책임 서비스)의 경우 배포 및 제어하는 모든 서비스에 대한 DR을 처리해야 한다는 의미입니다. 복구가 사전 예방적으로 수행되도록 하려면, 사전 할당되지 않은 사용자에게 영향을 미치는 시점에 용량이 보장되지 않으므로 항상 보조 기능을 미리 배포해야 합니다.

가상 머신을 배포하기 위해 Virtual Machine Scale Sets에서 유연한 오케스트레이션 모드를 사용할 수 있습니다. 유연한 오케스트레이션 모드는 모든 VM 크기에 사용할 수 있습니다. 유연한 오케스트레이션 모드는 또한 지역 내 또는 가용성 영역 내의 장애 도메인에 VM을 분산하여 고가용성 보장(최대 1000개 VM)을 제공합니다.

다음 단계