次の方法で共有


Virtual Machines の信頼性

この記事には、Virtual Machines の固有の信頼性に関する推奨事項可用性ゾーンを使用した VM リージョンの回復性、およびリージョン間のディザスター リカバリーとビジネス継続性に関する詳細情報が含まれています。

Azure における信頼性のアーキテクチャ概要については、「Azure の信頼性」を参照してください。

信頼性に関する推奨事項

このセクションには、Azure Virtual Machines の回復性と可用性を実現するためのレコメンデーションが含まれています。 各レコメンデーションは、次の 2 つのカテゴリのいずれかに分類されます:

  • 正常性項目には、構成項目などの領域と、Azure リソースの構成設定、他のサービスへの依存関係など、Azure ワークロードを構成する主要コンポーネントの適切な機能をカバーします。

  • リスク項目は、可用性と回復の要件、テスト、監視、デプロイ、その他の項目など、未解決のままである場合に環境で問題が発生する可能性が高まる領域をカバーします。

信頼性に関する推奨事項の優先順位マトリックス

各推奨事項は、次の優先順位マトリックスに従ってマークされます。

Image 優先度 説明
直ちに修正が必要です。
Medium 3 から 6 か月以内に修正してください。
確認が必要です。

信頼性に関する推奨事項の概要

カテゴリ Priority 推奨
高可用性 Azure Virtual Machine Scale Sets Flex を使用して 2 つ以上の 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 のメンテナンス構成を使用する
Security VM にパブリック IP を直接関連付けないようにする
Virtual Network インターフェイスに NSG が関連付けられている
IP 転送はネットワーク仮想アプライアンスに対してのみ有効にする必要がある
VM ディスクへのネットワーク アクセスを "パブリック アクセスを無効にしてプライベート アクセスを有効にする" に設定する必要がある
既定でディスク暗号化と保存データの暗号化を有効にする
ネットワーク 顧客 DNS サーバーは Virtual Network レベルで構成する必要がある
Storage 共有ディスクはクラスター化されたサーバーでのみ有効にする必要がある
準拠 VM が Azure ポリシーに準拠していることを確認する
Monitoring VM Insights を有効にする
すべての Azure リソースの診断設定を構成する

高可用性

Virtual Machine Scale Sets Flex を使用して 2 つ以上の VM で運用ワークロードを実行する

ディスクまたは VM が一時的に使用できないダウンタイムからアプリケーション ワークロードを保護するには、Virtual Machine Scale Sets Flex を使用して 2 つ以上の VM で運用ワークロードを実行することをお勧めします。

運用ワークロードを実行するには、次の機能を使用できます。

  • 負荷分散が行われる VM のグループを作成して管理するための Azure Virtual Machine スケール セット。 需要または定義されたスケジュールに応じて、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 を使用すると、次の 2 つの方法のいずれかで 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) が分単位で作成されます。 ディザスター リカバリー訓練を、運用環境のアプリケーションまたは実行中のレプリケーションに影響を与えることなく、必要な回数だけ実施できます。

ディザスター リカバリーのテストを実行する方法については、「テスト フェールオーバーを実行する」を参照してください。

// 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 ディスクを使用する必要がある

Premium SSD ディスクでは、I/O 集中型アプリケーションと運用ワークロード向けの、高パフォーマンスで待ち時間の短いディスク サポートが提供されます。 Standard SSD ディスクは、比較的低い IOPS レベルで一貫したパフォーマンスを必要とするワークロード向けに最適化された、コスト効果に優れたストレージ オプションです。

次のようにすることをお勧めします。

  • 最低コストの Dev/Test のシナリオや重要度の低いワークロードには、Standard HDD ディスクを使用できます。
  • Premium 対応 VM で Standard HDD ディスクの代わりに Premium SSD ディスクを使用します。 すべてのオペレーティング システム ディスクとデータ ディスクに Premium Storage を使用する単一インスタンスの VM の場合、Azure では 99.9% 以上の VM 接続が保証されます。

Standard HDD から Premium SSD ディスクにアップグレードする場合は、次の問題を考慮してください。

  • アップグレードには VM の再起動が必要であり、このプロセスが完了するまでに 3 分から 5 分かかります。
  • VM がミッション クリティカルな運用 VM である場合には、向上する可用性と、Premium ディスクのコストを比較してください。

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 へのシングル ルート I/O 仮想化 (SR-IOV) を可能にします。これにより、ネットワークのパフォーマンスが大幅に向上します。 この高パフォーマンスのパスによってデータ パスからホストがバイパスされ、サポートされている 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 で問題が発生しているか、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

Security

VM にパブリック IP を直接関連付けないようにする

VM で送信インターネット接続性が必要な場合は、NAT ゲートウェイまたは Azure Firewall を使用することをお勧めします。 NAT Gateway または Azure Firewall は、両方のサービスに高可用性とソース ネットワーク アドレス変換 (SNAT) ポートがあるため、サービスのセキュリティと回復性を高めるのに役立ちます。 受信インターネット接続性の場合は、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 アドレスの 1 つではないネットワーク トラフィックを受信します。

  • ネットワーク トラフィックの送信は、ネットワーク インターフェイスの IP 構成のいずれかに割り当てられているものとは異なる送信元 IP アドレスを使用して行います。

IP 転送設定は、転送するトラフィックを受け取る VM にアタッチされているすべてのネットワーク インターフェイスで有効にする必要があります。 VM は、複数のネットワーク インターフェイスがあるか、それにアタッチされているのが 1 つのネットワーク インターフェイスであるかを問わず、トラフィックを転送できます。 IP 転送は Azure の設定ですが、ファイアウォール、WAN 最適化、負荷分散アプリケーションなど、トラフィックを転送できるアプリケーションを VM が実行する必要があります。

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

既定でディスク暗号化と保存データの暗号化を有効にする

マネージド ディスクに使用できる暗号化には、Azure Disk Encryption (ADE)、Server-Side Encryption (SSE)、ホストでの暗号化など、いくつかの種類があります。

  • Azure Disk Encryption は、データを保護して、組織のセキュリティおよびコンプライアンス コミットメントを満たすのに役立ちます。
  • Azure Disk Storage のサーバー側暗号化 (保存時の暗号化または Azure Storage 暗号化とも呼ばれます) により、Azure マネージド ディスク (OS およびデータ ディスク) 上の格納データは、記憶域クラスターに保持されるときに自動的に暗号化されます。
  • ホストでの暗号化により、VM をホストする VM ホスト上の格納データは、保存時に暗号化され、暗号化された状態で記憶域クラスターに送られます。
  • 機密のディスク暗号化では、ディスク暗号化キーを VM の TPM にバインドし、保護されたディスク コンテンツを VM のみがアクセスできるようにします。

マネージド ディスク暗号化オプションの詳細については、「マネージド ディスク暗号化オプションの概要」を参照してください。

// under-development

ネットワーク

DNS サーバーは Virtual Network レベルで構成する必要がある

環境全体で名前解決の不整合が発生しないように、Virtual Network で DNS サーバーを構成します。 Azure 仮想ネットワーク内のリソースの名前解決に関する詳細については、「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 の安全を確保する手段としては、Azure のサービスや機能を通じて、VM へのアクセスやデータのストレージにセキュリティを確保する方法が挙げられます。 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 Insights を有効にする

VM insights を有効にして、仮想マシンの正常性とパフォーマンスをより詳細に可視化します。 VM insights により、実行中のプロセスや他のリソースへの依存関係などを監視することで、VM と仮想マシン スケール セットのパフォーマンスと正常性に関する情報が提供されます。 VM insights は、パフォーマンスのボトルネックとネットワークの問題を識別することによって、重要なアプリケーションのパフォーマンスと可用性を予測するのに役立ちます。 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 リソースには、次の条件を定義する独自の診断設定が必要です。

  • ソースは、設定に定義された宛先に送信するメトリックとログ データの種類です。 使用可能な種類は、リソースの種類によって異なります。
  • 宛先: 1 つ以上の宛先。

1 つの診断設定では、各宛先を 1 つだけ定義することができます。 特定の種類の複数の宛先 (たとえば、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 リージョン内にある、3 つ以上に物理的に分離されたデータセンターのグループです。 各ゾーン内のデータセンターには、独立した電源、冷却手段、ネットワーク インフラストラクチャが備わっています。 ローカル ゾーンの障害が発生した場合、可用性ゾーンは、1 つのゾーンが影響を受けたときに、リージョンのサービス、容量、高可用性が残りの 2 つのゾーンによってサポートされるように設計されています。

障害の範囲は、ソフトウェアやハードウェアの障害から、地震、水害、火災などの事象に至る可能性があります。 Azure サービスの冗長と論理的な分離により、障害に対するトレランスが実現されます。 Azure の可用性ゾーンの詳細については、リージョンと可用性ゾーンに関する記事を参照してください。

Azure の可用性ゾーン対応サービスは、適切なレベルの信頼性と柔軟性を提供するように設計されています。 それらは 2 つの方法で構成できます。 それらは、ゾーン間の自動レプリケーションによるゾーン冗長、またはインスタンスを特定のゾーンにピン留めするゾーンベースのいずれかになります。 これらのアプローチを組み合わせることもできます。 ゾーン ベースとゾーン冗長のアーキテクチャを比較した詳細については、「可用性ゾーンとリージョンの使用に関する推奨事項」を参照してください。

仮想マシンは、サポートされている Azure リージョンごとに 3 つの可用性ゾーンを持つ可用性ゾーンをサポートし、ゾーン冗長およびゾーンにも対応しています。 詳細については、可用性ゾーンのサポートに関するページをご覧ください。 可用性のために仮想マシンを構成および移行する責任はお客様が負います。

可用性ゾーンの対応オプションの詳細については、次を参照してください。

前提条件

SLA の機能強化

可用性ゾーンは物理的に分離されており、電源、ネットワーク、冷却を個別に提供するため、SLA (サービス レベル アグリーメント) が向上します。 詳細については、「 Virtual Machines の SLA」を参照してください。

可用性ゾーンが有効になっているリソースを作成する

次のデプロイ オプションから、可用性ゾーンが有効になっている仮想マシン (VM) の作成を開始します。

ゾーン フェールオーバーのサポート

お客様は、Site Recovery サービスを使用して別のゾーンにフェールオーバーするように仮想マシンを設定できます。 詳細については、Site Recovery に関する記事を参照してください。

フォールト トレランス

仮想マシンはクラスター内の別のサーバーにフェールオーバーでき、VM のオペレーティング システムは新しいサーバーで再起動されます。 お客様は、ディザスター リカバリー、復旧計画での仮想マシンの集約、ディザスター リカバリー訓練の実行に関するフェールオーバー プロセスを参照して、フォールト トレランス ソリューションが成功することを確認する必要があります。

詳細については、サイトの回復プロセスに関するページを参照してください。

ゾーン ダウン エクスペリエンス

ゾーン全体の停止中、仮想マシン サービスの自己復旧によって基になる容量が再調整され正常なゾーンになるまで、パフォーマンスの短期間の低下を覚悟する必要があります。 自己復旧はゾーンの復元には依存しません。Microsoft が管理するサービスの自己修復状態では、他のゾーンの容量を使用して失われたゾーンを補うことが期待されます。

また、お客様は、リージョン全体が停止する可能性に備える必要があります。 リージョン全体でサービス中断が発生した場合、データのローカル冗長コピーは、一時的に使用できなくなります。 geo レプリケーションが有効になっている場合は、Azure Storage の BLOB とテーブルのコピーがさらに 3 つ、別のリージョンに格納されます。 地域的な停電や災害が発生し、プライマリ リージョンを復旧できない場合は、すべての DNS エントリが、geo レプリケートされたリージョンに再マッピングされます。

ゾーン停止の準備と復旧

Azure 仮想マシンのアプリケーションがデプロイされているリージョン全体でサービスが中断している間、Azure 仮想マシンに関する次のガイダンスが提供されています。

低待機時間デザイン

リージョンをまたがる (セカンダリ リージョン)、クロス サブスクリプション (プレビュー)、クロス ゾーン (プレビュー) は、低待機時間の仮想マシン ソリューションを設計する際に検討すべき利用可能なオプションです。 これらのオプションの詳細については、「サポートされる復元方法」を参照してください。

重要

ゾーン対応のデプロイをオプトアウトして、基になる障害の分離からの保護は見合わせてください。 可用性ゾーンをサポートしていない SKU を使用するか、可用性ゾーン構成からオプトアウトすると、ゾーンの配置と分離に従わないリソース (これらのリソースの基になる依存関係を含む) への依存が強制されます。 これらのリソースが、ゾーンダウン シナリオで存続することは期待できません。 このようなリソースを活用するソリューションでは、ディザスター リカバリー戦略を定義し、別のリージョンでソリューションの復旧を構成する必要があります。

安全なデプロイ手法

可用性ゾーンの分離を選択する場合は、アプリケーション コードとアプリケーションのアップグレードに安全なデプロイ手法を利用する必要があります。 Azure Site Recovery の構成に加えて、VM に対する次のいずれかの実装の安全なデプロイ手法を次に示します。

Microsoft は定期的に計画メンテナンス更新を実施しているため、これらの更新により、基盤となるインフラストラクチャに必要な更新を適用する場合に、まれに仮想マシンの再起動が必要になることがあります。 詳細については、「予定メンテナンス中の可用性に関する考慮事項」を参照してください。

別のゾーン内のノードの次のセットをアップグレードする前に、次のタスクを実行する必要があります。

可用性ゾーン サポートに移行する

VM を可用性ゾーンのサポートに移行する方法については、「Virtual Machines と Virtual Machine Scale Sets を可用性ゾーンのサポートに移行する」を参照してください。

リージョン間のディザスター リカバリーおよび事業継続

ディザスター リカバリー (DR) とは、ダウンタイムやデータ損失につながるような、影響の大きいイベント (自然災害やデプロイの失敗など) から復旧することです。 原因に関係なく、災害に対する最善の解決策は、明確に定義されテストされた DR プランと、DR を積極的にサポートするアプリケーション設計です。 ディザスター リカバリー計画の作成を検討する前に、「ディザスター リカバリー戦略の設計に関する推奨事項」を参照してください。

DR に関しては、Microsoft は共有責任モデルを使用します。 共有責任モデルでは、ベースライン インフラストラクチャとプラットフォーム サービスの可用性が Microsoft によって保証されます。 同時に、多くの Azure サービスでは、データのレプリケート、または障害が発生したリージョンから別の有効なリージョンにクロスレプリケートするフォールバックは、自動的には行われません。 それらのサービスについては、お客様がワークロードに適したディザスター リカバリー計画を設定する必要があります。 Azure PaaS (サービスとしてのプラットフォーム) オファリング上で実行されるほとんどのサービスには、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 (お客様が責任を持つサービス) の場合、お客様がデプロイおよび制御するすべてのサービスのディザスター リカバリーに対処する必要があることを意味します。 復旧がプロアクティブになるように、お客様はセカンダリを事前にデプロイする必要があります。お客様が事前に割り当てていない場合、障害が発生したときに容量が保証されないためです。

仮想マシンをデプロイする場合、お客様は Virtual Machine Scale Sets でフレキシブル オーケストレーション モードを使用できます。 フレキシブル オーケストレーション モードでは、すべての VM サイズが使用できます。 また、フレキシブル オーケストレーション モードでは、リージョン内の障害ドメインまたは可用性ゾーン内のいずれかで VM を分散することで、(最大 1,000 個の VM まで) 高可用性を保証します。

次のステップ