Fiabilidade em Máquinas Virtuais

Este artigo contém recomendações específicas de confiabilidade para máquinas virtuais, bem como informações detalhadas sobre resiliência regional de VM com zonasde disponibilidade, recuperação de desastres entre regiões e continuidade de negócios.

Para obter uma visão geral da arquitetura da confiabilidade no Azure, consulte Confiabilidade do Azure.

Recomendações de fiabilidade

Esta seção contém recomendações para alcançar resiliência e disponibilidade. Cada recomendação enquadra-se numa de duas categorias:

  • Os itens de integridade abrangem áreas como itens de configuração e a função adequada dos principais componentes que compõem sua Carga de Trabalho do Azure, como definições de configuração de Recursos do Azure, dependências de outros serviços e assim por diante.

  • Os itens de risco abrangem áreas como requisitos de disponibilidade e recuperação, testes, monitoramento, implantação e outros itens que, se não forem resolvidos, aumentam as chances de problemas no ambiente.

Matriz de prioridades de recomendações de fiabilidade

Cada recomendação é assinalada de acordo com a seguinte matriz de prioridades:

Image Prioridade Description
Máximo Correção imediata necessária.
Meio Corrigir dentro de 3-6 meses.
Mínimo Precisa ser revisto.

Resumo das recomendações de fiabilidade

Category Prioridade Recomendação
Elevada Disponibilidade Executar cargas de trabalho de produção em duas ou mais VMs usando o Azure Virtual Machine Scale Sets Flex
Implantar VMs em zonas de disponibilidade ou usar Conjuntos de Escala de Máquina Virtual Flex com zonas
Migrar VMs usando conjuntos de disponibilidade para Conjuntos de Escala de Máquina Virtual Flex
Usar discos gerenciados para discos VM
Recuperação após Desastre Replicar VMs usando o Azure Site Recovery
Fazer backup de dados em suas VMs com o serviço de Backup do Azure
Desempenho Hospedar dados de aplicativos e bancos de dados em um disco de dados
As VMs de produção devem estar usando discos SSD
Habilitar rede acelerada (AccelNet)
Quando AccelNet está ativado, você deve atualizar manualmente a unidade NIC GuestOS
Gestão VM-9: Observar VMs no estado Interrompido
Usar configurações de manutenção para a VM
Segurança As VVMs não devem ter um IP público diretamente associado
As interfaces de rede virtual têm um NSG associado
O Reencaminhamento IP só deve ser ativado para Dispositivos Virtuais de Rede
O acesso à rede para o disco da VM deve ser definido como "Desativar o acesso público e habilitar o acesso privado"
Habilitar a criptografia de disco e a criptografia de dados em repouso por padrão
Rede Os Servidores DNS do Cliente devem ser configurados no nível da Rede Virtual
Armazenamento Os discos compartilhados só devem ser habilitados em servidores clusterizados
Conformidade Verifique se suas VMs estão em conformidade com as Políticas do Azure
Monitorização Habilitar o VM Insights
Definir definições de diagnóstico para todos os recursos do Azure

Elevada disponibilidade

Executar cargas de trabalho de produção em duas ou mais VMs usando o Virtual Machine Scale Sets Flex

Para proteger as cargas de trabalho de aplicativos contra o tempo de inatividade devido à indisponibilidade temporária de um disco ou VM, é recomendável executar cargas de trabalho de produção em duas ou mais VMs usando o Virtual Machine Scale Sets Flex.

Para executar cargas de trabalho de produção, você pode usar:

  • Conjuntos de Escala de Máquina Virtual do Azure para criar e gerenciar um grupo de VMs com balanceamento de carga. O número de instâncias de VM pode aumentar ou diminuir automaticamente como resposta à procura ou horário definido.

  • Zonas de disponibilidade. Para obter mais informações sobre zonas de disponibilidade e VMs, consulte Suporte à zona de disponibilidade.

// 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

Implantar VMs em zonas de disponibilidade ou usar Conjuntos de Escala de Máquina Virtual Flex com zonas*

Ao criar suas VMs, use zonas de disponibilidade para proteger seus aplicativos e dados contra falhas improváveis do datacenter. Para obter mais informações sobre zonas de disponibilidade para VMs, consulte Suporte à zona de disponibilidade neste documento.

Para obter informações sobre como habilitar o suporte a zonas de disponibilidade ao criar sua VM, consulte Criar suporte a zonas de disponibilidade.

Para obter informações sobre como migrar suas VMs existentes para o suporte à zona de disponibilidade, consulte migrar para o suporte à zona de disponibilidade.

// 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"

Migrar VMs usando conjuntos de disponibilidade para Conjuntos de Escala de Máquina Virtual Flex

Modernize suas cargas de trabalho migrando-as de VMs para o Virtual Machine Scale Sets Flex.

Com o Virtual Machine Scale Sets Flex, você pode implantar suas VMs de duas maneiras:

  • Entre zonas
  • Na mesma zona, mas entre domínios de falha (FDs) e domínios de atualização (UD) automaticamente.

Em um aplicativo de N camadas, é recomendável que você coloque cada camada de aplicativo em seus próprios Conjuntos de Escala de Máquina Virtual 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)

Usar discos gerenciados para discos VM*

Para fornecer melhor confiabilidade para VMs em um conjunto de disponibilidade, use discos gerenciados. Os discos gerenciados são suficientemente isolados uns dos outros para evitar pontos únicos de falha. Além disso, os discos gerenciados não estão sujeitos aos limites de IOPS dos VHDs criados em uma conta de armazenamento.

// 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

Recuperação após desastre

Replicar VMs usando o Azure Site Recovery

Quando você replica VMs do Azure usando o Site Recovery, todos os discos de VM são replicados continuamente para a região de destino de forma assíncrona. Os pontos de recuperação são criados a cada poucos minutos, o que lhe dá um RPO (Recovery Point Objetive, objetivo de ponto de recuperação) na ordem dos minutos. Você pode realizar exercícios de recuperação de desastres quantas vezes quiser, sem afetar o aplicativo de produção ou a replicação contínua.

Para saber como executar um drill de recuperação de desastres, consulte Executar um failover de teste.

// 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

Fazer backup de dados em suas VMs com o serviço de Backup do Azure

O serviço Azure Backup fornece soluções simples, seguras e económicas que lhe permitem fazer cópias de segurança dos seus dados e recuperá-los a partir da cloud do Microsoft Azure. Para obter mais informações, consulte O que é o Serviço de Backup do Azure.

// 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

Desempenho

Hospedar dados de aplicativos e bancos de dados em um disco de dados

Um disco de dados é um disco gerenciado conectado a uma VM. Use o disco de dados para armazenar dados de aplicativos ou outros dados que você precisa manter. Os discos de dados são registrados como unidades SCSI e são rotulados com uma letra que você escolher. Hospedar seus dados em um disco de dados facilita o backup ou a restauração de seus dados. Você também pode migrar o disco sem ter que mover toda a VM e o sistema operacional. Além disso, você pode selecionar um SKU de disco diferente, com tipo, tamanho e desempenho diferentes que atendam às suas necessidades. Para obter mais informações sobre discos de dados, consulte Discos de dados.

// 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

As VMs de produção devem estar usando discos SSD

Os discos SSD Premium oferecem suporte a discos de alto desempenho e baixa latência para aplicativos com uso intensivo de E/S e cargas de trabalho de produção. Os discos SSD padrão são uma opção de armazenamento econômica otimizada para cargas de trabalho que precisam de desempenho consistente em níveis de IOPS mais baixos.

Recomenda-se que:

  • Utilize discos HDD padrão para cenários de desenvolvimento/teste e cargas de trabalho menos críticas ao menor custo.
  • Utilize discos SSD Premium em vez de discos HDD padrão com as suas VMs com capacidade premium. Para qualquer VM de instância única que use armazenamento premium para todos os discos do sistema operacional e discos de dados, o Azure garante conectividade de VM de pelo menos 99,9%.

Se pretender atualizar de discos HDD padrão para discos SSD Premium, considere os seguintes problemas:

  • A atualização requer uma reinicialização da VM e esse processo leva de 3 a 5 minutos para ser concluído.
  • Se as VMs forem VMs de produção de missão crítica, avalie a disponibilidade aprimorada em relação ao custo dos discos premium.

Para obter mais informações sobre discos gerenciados do Azure e tipos de discos, consulte Tipos de disco gerenciado do 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)

Habilitar rede acelerada (AccelNet)

O AccelNet permite a virtualização de E/S de raiz única (SR-IOV) para uma VM, melhorando consideravelmente o desempenho da rede. Este percurso de alto desempenho ignora o anfitrião no caminho de dados, o que reduz a latência, a instabilidade e a utilização da CPU das cargas de trabalho da rede mais exigentes nos tipos de VM suportadas.

Para obter mais informações sobre rede acelerada, consulte Rede acelerada

// 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

Quando AccelNet está ativado, você deve atualizar manualmente o driver NIC GuestOS

Quando o AccelNet está habilitado, a interface padrão da Rede Virtual do Azure no GuestOS é substituída por uma interface Mellanox. Como resultado, o driver NIC GuestOS é fornecido pela Mellanox, um fornecedor de terceiros. Embora as imagens do Marketplace mantidas pela Microsoft sejam oferecidas com a versão mais recente dos drivers Mellanox, uma vez que a VM é implantada, você precisa atualizar manualmente o driver NIC GuestOS a cada seis meses.

// cannot-be-validated-with-arg

Gestão

Revisar VMs no estado interrompido

As instâncias de VM passam por estados diferentes, incluindo provisionamento e estados de energia. Se uma VM estiver em um estado interrompido, a VM pode estar enfrentando um problema ou não é mais necessária e pode ser removida para ajudar a reduzir custos.

// 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

Usar configurações de manutenção para a VM

Para garantir que as atualizações/interrupções da VM sejam feitas em um período de tempo planejado, use as definições de configuração de manutenção para agendar e gerenciar atualizações. Para obter mais informações sobre como gerenciar atualizações de VM com configurações de manutenção, consulte Gerenciando atualizações de VM com configurações de manutenção.

// 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

Segurança

As VMs não devem ter um IP público diretamente associado

Se uma VM exigir conectividade de saída com a Internet, é recomendável usar o Gateway NAT ou o Firewall do Azure. O Gateway NAT ou o Firewall do Azure ajudam a aumentar a segurança e a resiliência do serviço, uma vez que ambos os serviços têm maior disponibilidade e portas SNAT (Source Network Address Translation). Para conectividade de entrada com a Internet, é recomendável usar uma solução de balanceamento de carga, como o Azure Load Balancer e o 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

As interfaces de rede VM têm um NSG (Network Security Group) associado*

É recomendável associar um NSG a uma sub-rede ou a uma interface de rede, mas não a ambas. Como as regras em um NSG associado a uma sub-rede podem entrar em conflito com as regras em um NSG associado a uma interface de rede, você pode ter problemas de comunicação inesperados que exigem solução de problemas. Para obter mais informações, consulte Tráfego intra-sub-rede.

// 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)

O encaminhamento de IP só deve ser habilitado para dispositivos virtuais de rede

O encaminhamento IP permite que a interface de rede da máquina virtual:

  • Receba tráfego de rede não destinado a um dos endereços IP atribuídos a qualquer uma das configurações IP atribuídas à interface de rede.

  • Envie tráfego de rede com um endereço IP de origem diferente daquele atribuído a uma das configurações IP de uma interface de rede.

A configuração de encaminhamento IP deve ser habilitada para que cada interface de rede conectada ao tráfego de recebimento da VM seja encaminhada. Uma VM pode encaminhar o tráfego quer tenha várias interfaces de rede ou uma única interface de rede conectada a ela. Embora o encaminhamento de IP seja uma configuração do Azure, a VM também deve executar um aplicativo capaz de encaminhar o tráfego, como firewall, otimização de WAN e aplicativos de balanceamento de carga.

Para saber como habilitar ou desabilitar o encaminhamento de IP, consulte Habilitar ou desabilitar o encaminhamento de 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

O acesso à rede para o disco da VM deve ser definido como "Desativar o acesso público e habilitar o acesso privado"

É recomendável definir o acesso à rede do disco da VM como "Desabilitar o acesso público e habilitar o acesso privado" e criar um ponto de extremidade privado. Para saber como criar um ponto de extremidade privado, consulte Criar um ponto de extremidade privado.

// 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

Habilitar a criptografia de disco e a criptografia de dados em repouso por padrão

Há vários tipos de criptografia disponíveis para seus discos gerenciados, incluindo Azure Disk Encryption (ADE), Server-Side Encryption (SSE) e criptografia no host.

  • A Azure Disk Encryption ajuda a proteger e a salvaguardar os seus dados para cumprir as obrigações de conformidade e segurança da sua organização.
  • A Criptografia do Lado do Servidor do Armazenamento em Disco do Azure (também conhecida como criptografia em repouso ou criptografia do Armazenamento do Azure) criptografa automaticamente os dados armazenados nos discos gerenciados do Azure (SO e discos de dados) ao persistir nos Clusters de Armazenamento.
  • A criptografia no host garante que os dados armazenados no host da VM que hospeda sua VM sejam criptografados em repouso e fluam criptografados para os clusters de armazenamento.
  • A criptografia de disco confidencial vincula as chaves de criptografia de disco ao TPM da VM e torna o conteúdo do disco protegido acessível apenas à VM.

Para obter mais informações sobre opções de criptografia de disco gerenciado, consulte Visão geral das opções de criptografia de disco gerenciado.

// under-development

Rede

Os Servidores DNS devem ser configurados no nível de Rede Virtual

Configure o servidor DNS na rede virtual para evitar inconsistência na resolução de nomes em todo o ambiente. Para obter mais informações sobre a resolução de nomes para recursos em redes virtuais do Azure, consulte Resolução de nomes para VMs e serviços de nuvem.

// 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

Armazenamento

Os discos compartilhados só devem ser habilitados em servidores clusterizados

Os discos partilhados do Azure são uma funcionalidade dos discos geridos do Azure que lhe permite anexar um disco gerido a várias VMs em simultâneo. Ao anexar um disco gerenciado a várias VMs, você pode implantar aplicativos clusterizados novos ou migrar existentes para o Azure. Os discos compartilhados só devem ser usados nas situações em que o disco é atribuído a mais de um membro da VM de um cluster.

Para saber mais sobre como habilitar discos compartilhados para discos gerenciados, consulte Habilitar disco compartilhado.

// 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

Conformidade

Verifique se suas VMs estão em conformidade com as Políticas do Azure

É importante manter sua máquina virtual (VM) segura para os aplicativos que você executa. Proteger suas VMs pode incluir um ou mais serviços e recursos do Azure que abrangem o acesso seguro às suas VMs e o armazenamento seguro de seus dados. Para obter mais informações sobre como manter sua VM e aplicativos seguros, consulte Controles de conformidade regulatória da política do Azure para máquinas virtuais do Azure.

// 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

Monitorização

Habilitar o VM Insights

Habilite o VM Insights para obter mais visibilidade sobre a integridade e o desempenho de sua máquina virtual. O VM Insights fornece informações sobre o desempenho e a integridade de suas VMs e conjuntos de dimensionamento de máquinas virtuais, monitorando seus processos em execução e dependências de outros recursos. O VM Insights pode ajudar a fornecer desempenho e disponibilidade previsíveis de aplicativos vitais, identificando gargalos de desempenho e problemas de rede. Os insights também podem ajudá-lo a entender se um problema está relacionado a outras dependências.

// 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)

Definir definições de diagnóstico para todos os recursos do Azure

As métricas da plataforma são enviadas automaticamente para o Azure Monitor Metrics por padrão e sem configuração. Os logs da plataforma fornecem informações detalhadas de diagnóstico e auditoria para os recursos do Azure e a plataforma do Azure da qual eles dependem e são um dos seguintes tipos:

  • Logs de recursos que não são coletados até serem roteados para um destino.
  • Logs de atividades que existem por conta própria, mas podem ser roteados para outros locais.

Cada recurso do Azure requer sua própria configuração de diagnóstico, que define os seguintes critérios:

  • Fontes O tipo de métrica e dados de log a serem enviados para os destinos definidos na configuração. Os tipos disponíveis variam de acordo com o tipo de recurso.
  • Destinos: Um ou mais destinos para enviar.

Uma única configuração de diagnóstico não pode definir mais do que um de cada um dos destinos. Se você quiser enviar dados para mais de um tipo de destino específico (por exemplo, dois espaços de trabalho diferentes do Log Analytics), crie várias configurações. Cada recurso pode ter até cinco configurações de diagnóstico.

Para obter informações, consulte Configurações de diagnóstico no 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

Suporte à zona de disponibilidade

As zonas de disponibilidade do Azure são pelo menos três grupos fisicamente separados de datacenters em cada região do Azure. Os datacenters dentro de cada zona são equipados com infraestrutura independente de energia, resfriamento e rede. No caso de uma falha de zona local, as zonas de disponibilidade são projetadas de modo que, se uma zona for afetada, os serviços regionais, a capacidade e a alta disponibilidade sejam suportados pelas duas zonas restantes.

As falhas podem variar de falhas de software e hardware a eventos como terremotos, inundações e incêndios. A tolerância a falhas é alcançada com redundância e isolamento lógico dos serviços do Azure. Para obter informações mais detalhadas sobre zonas de disponibilidade no Azure, consulte Regiões e zonas de disponibilidade.

Os serviços habilitados para zonas de disponibilidade do Azure são projetados para fornecer o nível certo de confiabilidade e flexibilidade. Eles podem ser configurados de duas maneiras. Eles podem ser redundantes de zona, com replicação automática entre zonas, ou zonais, com instâncias fixadas a uma zona específica. Você também pode combinar essas abordagens. Para obter mais informações sobre arquitetura zonal versus arquitetura com redundância de zona, consulte Recomendações para usar zonas e regiões de disponibilidade.

As máquinas virtuais dão suporte a zonas de disponibilidade com três zonas de disponibilidade por região do Azure com suporte e também são redundantes de zona e zonais. Para obter mais informações, consulte Suporte a zonas de disponibilidade. O cliente é responsável por configurar e migrar suas máquinas virtuais para disponibilidade.

Para saber mais sobre as opções de preparação da zona de disponibilidade, consulte:

Pré-requisitos

  • As SKUs da máquina virtual devem estar disponíveis nas zonas da sua região. Para analisar quais regiões oferecem suporte a zonas de disponibilidade, consulte a lista de regiões suportadas.

  • Suas SKUs de VM devem estar disponíveis nas zonas da sua região. Para verificar a disponibilidade de SKU da VM, use um dos seguintes métodos:

    • Use o PowerShell para verificar a disponibilidade de SKU da VM.
    • Use a CLI do Azure para verificar a disponibilidade de SKU da VM.
    • Vá para Serviços Fundacionais.

Melhorias no SLA

Como as zonas de disponibilidade são fisicamente separadas e fornecem fonte de alimentação, rede e resfriamento distintos, os SLAs (contratos de nível de serviço) aumentam. Para obter mais informações, veja SLA para Máquinas Virtuais.

Criar um recurso com zonas de disponibilidade ativadas

Comece criando uma máquina virtual (VM) com zona de disponibilidade habilitada nas seguintes opções de implantação abaixo:

Suporte a failover zonal

Você pode configurar máquinas virtuais para failover para outra zona usando o serviço de Recuperação de Site. Para obter mais informações, consulte Recuperação de site.

Tolerância a falhas

As máquinas virtuais podem fazer failover para outro servidor em um cluster, com o sistema operacional da VM sendo reiniciado no novo servidor. Você deve consultar o processo de failover para recuperação de desastres, reunindo máquinas virtuais no planejamento de recuperação e executando exercícios de recuperação de desastres para garantir que sua solução de tolerância a falhas seja bem-sucedida.

Para obter mais informações, consulte os processos de recuperação de site.

Experiência de zoneamento

Durante uma interrupção em toda a zona, você deve esperar uma breve degradação do desempenho até que a autorrecuperação do serviço de máquina virtual reequilibre a capacidade subjacente de se ajustar a zonas íntegras. A autorrecuperação não depende da restauração da zona; espera-se que o estado de autorrecuperação do serviço gerenciado pela Microsoft compense uma zona perdida, usando a capacidade de outras zonas.

Você também deve se preparar para a possibilidade de haver uma interrupção de toda uma região. Se houver uma interrupção do serviço para uma região inteira, as cópias localmente redundantes dos seus dados ficarão temporariamente indisponíveis. Se a replicação geográfica estiver habilitada, três outras cópias dos blobs e tabelas do Armazenamento do Azure serão armazenadas em uma região diferente. Quando há uma interrupção regional completa ou um desastre no qual a região primária não é recuperável, o Azure remapeia todas as entradas DNS para a região replicada geograficamente.

Preparação e recuperação de interrupções de zona

As diretrizes a seguir são fornecidas para máquinas virtuais do Azure durante uma interrupção de serviço de toda a região onde seu aplicativo de máquina virtual do Azure é implantado:

Design de baixa latência

Cross Region (região secundária), Cross Subscription (visualização) e Cross Zonal (visualização) são opções disponíveis a serem consideradas ao projetar uma solução de máquina virtual de baixa latência. Para obter mais informações sobre essas opções, consulte os métodos de restauração suportados.

Importante

Ao desativar a implantação com reconhecimento de zona, você renuncia à proteção contra o isolamento de falhas subjacentes. O uso de SKUs que não oferecem suporte a zonas de disponibilidade ou a exclusão da configuração da zona de disponibilidade força a dependência de recursos que não obedecem ao posicionamento e à separação da zona (incluindo dependências subjacentes desses recursos). Não se deve esperar que esses recursos sobrevivam a cenários de zone-down. As soluções que aproveitam esses recursos devem definir uma estratégia de recuperação de desastres e configurar uma recuperação da solução em outra região.

Técnicas de implementação seguras

Ao optar pelo isolamento de zonas de disponibilidade, você deve utilizar técnicas de implantação seguras para o código do aplicativo e atualizações do aplicativo. Além de configurar o Azure Site Recovery e implementar qualquer uma das seguintes técnicas de implantação segura para VMs:

Como a Microsoft executa periodicamente atualizações de manutenção planejadas, pode haver casos raros em que essas atualizações exigem uma reinicialização da máquina virtual para aplicar as atualizações necessárias à infraestrutura subjacente. Para saber mais, consulte Considerações sobre disponibilidade durante a manutenção agendada.

Antes de atualizar seu próximo conjunto de nós em outra zona, você deve executar as seguintes tarefas:

Migrar para o suporte à zona de disponibilidade

Para saber como migrar uma VM para o suporte à zona de disponibilidade, consulte Migrar máquinas virtuais e conjuntos de dimensionamento de máquinas virtuais para suporte à zona de disponibilidade.

Recuperação de desastres entre regiões e continuidade de negócios

A recuperação de desastres (DR) consiste na recuperação de eventos de alto impacto, como desastres naturais ou implantações com falha que resultam em tempo de inatividade e perda de dados. Independentemente da causa, a melhor solução para um desastre é um plano de DR bem definido e testado e um design de aplicativo que suporte ativamente a DR. Antes de começar a pensar em criar seu plano de recuperação de desastres, consulte Recomendações para projetar uma estratégia de recuperação de desastres.

Quando se trata de DR, a Microsoft usa o modelo de responsabilidade compartilhada. Em um modelo de responsabilidade compartilhada, a Microsoft garante que a infraestrutura de linha de base e os serviços da plataforma estejam disponíveis. Ao mesmo tempo, muitos serviços do Azure não replicam dados automaticamente ou recorrem de uma região com falha para replicação cruzada para outra região habilitada. Para esses serviços, você é responsável por configurar um plano de recuperação de desastres que funcione para sua carga de trabalho. A maioria dos serviços executados nas ofertas de plataforma como serviço (PaaS) do Azure fornecem recursos e orientação para dar suporte à DR e você pode usar recursos específicos do serviço para dar suporte à recuperação rápida para ajudar a desenvolver seu plano de DR.

Você pode usar a restauração entre regiões para restaurar VMs do Azure por meio de regiões emparelhadas. Com a restauração entre regiões, você pode restaurar todas as VMs do Azure para o ponto de recuperação selecionado se o backup for feito na região secundária. Para obter mais informações sobre a restauração entre regiões, consulte a entrada de linha da tabela entre regiões em nossas opções de restauração.

Recuperação de desastres em geografia de várias regiões

No caso de uma interrupção de serviço em toda a região, a Microsoft trabalha diligentemente para restaurar o serviço de máquina virtual. No entanto, você ainda precisa confiar em outras estratégias de backup específicas do aplicativo para alcançar o mais alto nível de disponibilidade. Para obter mais informações, consulte a seção sobre Estratégias de dados para recuperação de desastres.

Deteção, notificação e gerenciamento de interrupções

O hardware ou a infraestrutura física da máquina virtual pode falhar inesperadamente. Falhas inesperadas podem incluir falhas de rede local, falhas de disco local ou outras falhas no nível de rack. Quando detetada, a plataforma Azure migra automaticamente (recupera) sua máquina virtual para uma máquina física íntegra no mesmo data center. Durante o procedimento de recuperação, as máquinas virtuais sofrem um período de indisponibilidade (reinício) e, em alguns casos, a perda da unidade temporária. O SO anexado e os discos de dados são sempre preservados.

Para obter informações mais detalhadas sobre interrupções do serviço de máquina virtual, consulte as diretrizes de recuperação de desastres.

Configurar a recuperação de desastres e a deteção de interrupções

Ao configurar a recuperação de desastres para máquinas virtuais, entenda o que o Azure Site Recovery fornece. Habilite a recuperação de desastres para máquinas virtuais com os métodos abaixo:

Recuperação de desastres em geografia de uma única região

Com a configuração de recuperação de desastres, as VMs do Azure replicam continuamente para uma região de destino diferente. Se ocorrer uma interrupção, você poderá fazer failover de VMs para a região secundária e acessá-las a partir daí.

Quando você replica VMs do Azure usando o Site Recovery, todos os discos de VM são replicados continuamente para a região de destino de forma assíncrona. Os pontos de recuperação são criados a cada poucos minutos, o que concede um RPO (Recovery Point Objetive, objetivo de ponto de recuperação) na ordem dos minutos. Você pode realizar exercícios de recuperação de desastres quantas vezes quiser, sem afetar o aplicativo de produção ou a replicação contínua. Para obter mais informações, consulte Executar um drill de recuperação de desastres no Azure.

Para obter mais informações, consulte Componentes de arquitetura de VMs do Azure e emparelhamento de região.

Capacidade e resiliência proativa de recuperação de desastres

A Microsoft e seus clientes operam sob o Modelo de Responsabilidade Compartilhada. Responsabilidade compartilhada significa que, para DR (serviços de responsabilidade do cliente) habilitados para o cliente, você deve abordar a DR para qualquer serviço que eles implantem e controlem. Para garantir que a recuperação seja proativa, você deve sempre pré-implantar secundários porque não há garantia de capacidade no momento do impacto para aqueles que não foram pré-alocados.

Para implantar máquinas virtuais, você pode usar o modo de orquestração flexível em Conjuntos de Dimensionamento de Máquina Virtual. Todos os tamanhos de VM podem ser usados com o modo de orquestração flexível. O modo de orquestração flexível também oferece garantias de alta disponibilidade (até 1000 VMs) espalhando VMs entre domínios de falha dentro de uma região ou dentro de uma zona de disponibilidade.

Próximos passos