[アンドキュメント] Nitro世代のEC2インスタンスタイプでは VM-Generation ID が使える様になっている話

[アンドキュメント] Nitro世代のEC2インスタンスタイプでは VM-Generation ID が使える様になっている話

まさか使えるとは思ってなかったです...
2026.09.28

しばたです。

Amazon EC2で構築したActive Directoryドメインコントローラーのバックアップとリストア手順をまとめていたところ、あるre:Postの投稿に非常に気になる一文があることに気づきました。

https://repost.aws/knowledge-center/ec2-ad-domain-controller-restore-ami

こちらの投稿はドメインコントローラーの復元においてイメージバックアップ(AMI)を使う場合の手順について記載されているのですが、その前提条件として、

Prerequisite: The domain controller instance must run on the AWS Nitro System because virtualized domain controllers that are restored from AMIs require a VM-Generation ID.

と、「VM-Generation IDを使うためにNitro世代のインスタンスタイプを指定する事」が明記されています。
これまでAWSのハイパーバイザーではVM-Generation IDはサポートされておらず、公式ドキュメント上も特にサポートを明記したものを見たことが無かったので気になり調べてみました。

はじめに結論

改めてAWSドキュメントを調べてみましたがAWSのハイパーバイザーがVM-Generation IDを正式にサポートする旨の記述を見つけることはできませんでした。
しかしながら実際にNitro世代のインスタンスタイプでドメインコントローラーを構築するとVM-Generation IDが設定される挙動となり「公式にサポートが明言されていないものの実際に使えている」状況でした。

いつから使える様になっていたのかは不明ですが、VM-Generation ID自体に関しては2022年ごろから以下のドキュメントにLinuxディストリビューションに対する記述が増えた様で、Windows OSに関しては2024年ごろに記述が追加されていました。

記述内容を見る限りMicrosoftの仕様と同様に見えます。
ただ、このページではVM-Generation IDの概要のみ記載されておりAWSとしての具体的なサポート状況といったものが一切ありません。
一応先述のre:Postの投稿はAWS公式によるものなので機能自体の信頼性はそれなりにあると考えて良いかと思います。

このため「公式のサポートは期待できないがas-isで動作する」という結論に至りました。

確認してみた

ここからは実際に挙動を確認していきます。
私の検証用AWSアカウントの東京リージョンで非Nitroインスタンス(t2.large)とNitroインスタンス(t3.large)でそれぞれ確認してみました。

nitro-hypervisor-vm-generation-id-availavility-01

AMIは本日時点で最新のWindows Server 2019 AMI (ami-0d45bba068714e860 : Windows_Server-2019-Japanese-Full-Base-2026.09.17)を使いそれぞれ個別のドメインコントローラーとして構成します。T2インスタンスも含むので古めのOSにしています。

nitro-hypervisor-vm-generation-id-availavility-02

VPCの設定およびドメインコントローラーとして構成するまでの手順は割愛します。

非Nitroインスタンスの場合

はじめに非Nitroインスタンス(t2.large)でVM-Generation IDに関連するドライバ(Microsoft Hyper-V Generation Counter : Microsoft Hyper-V 世代カウンター)の情報を確認してみます。

Microsoft Hyper-V Generation Counterはデバイスマネージャーで探すかPowerShellから次のコマンドで検索可能です。

PowerShell
# 1. PnPデバイス一覧を検索
Get-CimInstance Win32_PnPEntity | Where-Object { $_.Name -eq 'Microsoft Hyper-V 世代カウンター' }
# 2. ドライバ情報を検索
Get-CimInstance Win32_PnPSignedDriver | Where-Object { $_.DeviceName -eq 'Microsoft Hyper-V Generation Counter' }

非Nitroインスタンスでこれらのコマンドを実行した結果は以下の様に何も検出できない状態となります。

PowerShell
# 何も検出できず...
PS C:\> Get-CimInstance Win32_PnPEntity | Where-Object { $_.Name -eq 'Microsoft Hyper-V 世代カウンター' }
PS C:\> Get-CimInstance Win32_PnPSignedDriver | Where-Object { $_.DeviceName -eq 'Microsoft Hyper-V Generation Counter' }
PS C:\>

続けてActive Directory側の情報を確認します。
Active DirectoryにおいてVM-Generation IDはドメインコントローラーのmsDS-GenerationId属性に記録されます。

msDS-GenerationId属性の値はADSIエディタを使うかPowerShellだと次のコマンドで確認可能です。

PowerShell
# 対象サーバー(今回は自分自身)の msDS-GenerationId 属性の値を取得
Get-ADComputer $(hostname) -Properties msDS-GenerationId | Select-Object Name, msDS-GenerationId

# msDS-GenerationId 属性の値を Byte[] → String 変換する場合
Get-ADComputer $(hostname) -Properties msDS-GenerationId | ForEach-Object { [BitConverter]::ToString($_."msDS-GenerationId") }

実行結果は以下の様になりmsDS-GenerationId属性が設定されていないことが分かります。

PowerShell
# 属性値は未設定
PS C:\> Get-ADComputer $(hostname) -Properties msDS-GenerationId | Select-Object Name, msDS-GenerationId

Name   msDS-GenerationId
----   -----------------
T2ADDS

ADSIエディタから見ても同様です。

nitro-hypervisor-vm-generation-id-availavility-03

これで非NitroインスタンスではVM-Generation IDが使えないことが確認できました。

Nitroインスタンスの場合

次にNitroインスタンス(t3.large)でVM-Generation IDに関連するドライバー情報を確認してみます。
前節と同じコマンドを実行した結果は次の様になり、今回はそれぞれドライバー情報が参照可能となっていました。

PowerShell
# ドライバー情報が取得可能
PS C:\> Get-CimInstance Win32_PnPEntity | Where-Object { $_.Name -eq 'Microsoft Hyper-V 世代カウンター' }

Caption                     : Microsoft Hyper-V 世代カウンター
Description                 : Microsoft Hyper-V 世代カウンター
InstallDate                 :
Name                        : Microsoft Hyper-V 世代カウンター
Status                      : OK
Availability                :
ConfigManagerErrorCode      : 0
ConfigManagerUserConfig     : False
CreationClassName           : Win32_PnPEntity
DeviceID                    : ACPI\AMZN0000\2&DABA3FF&0
ErrorCleared                :
ErrorDescription            :
LastErrorCode               :
PNPDeviceID                 : ACPI\AMZN0000\2&DABA3FF&0
PowerManagementCapabilities :
PowerManagementSupported    :
StatusInfo                  :
SystemCreationClassName     : Win32_ComputerSystem
SystemName                  : T3ADDS
ClassGuid                   : {4d36e97d-e325-11ce-bfc1-08002be10318}
CompatibleID                : {ACPI\VM_Gen_Counter, VM_Gen_Counter}
HardwareID                  : {ACPI\VEN_AMZN&DEV_0000, ACPI\AMZN0000, *AMZN0000}
Manufacturer                : Microsoft
PNPClass                    : System
Present                     : True
Service                     : gencounter
PSComputerName              :

PS C:\> Get-CimInstance Win32_PnPSignedDriver | Where-Object { $_.DeviceName -eq 'Microsoft Hyper-V Generation Counter' }

Caption                 :
Description             : Microsoft Hyper-V Generation Counter
InstallDate             :
Name                    :
Status                  :
CreationClassName       :
Started                 :
StartMode               :
SystemCreationClassName :
SystemName              :
ClassGuid               : {4d36e97d-e325-11ce-bfc1-08002be10318}
CompatID                : ACPI\VM_Gen_Counter
DeviceClass             : SYSTEM
DeviceID                : ACPI\AMZN0000\2&DABA3FF&0
DeviceName              : Microsoft Hyper-V Generation Counter
DevLoader               :
DriverDate              : 2006/06/21 0:00:00
DriverName              :
DriverProviderName      : Microsoft
DriverVersion           : 10.0.17763.1
FriendlyName            :
HardWareID              : ACPI\VEN_AMZN&DEV_0000
InfName                 : wgencounter.inf
IsSigned                : True
Location                :
Manufacturer            : Microsoft
PDO                     : \Device\00000013
Signer                  : Microsoft Windows
PSComputerName          :

デバイスマネージャーからも参照可能です。

nitro-hypervisor-vm-generation-id-availavility-04

続けてmsDS-GenerationId属性の値を取得してみると以下の結果となりました。

PowerShell
# 対象サーバー(今回は自分自身)の msDS-GenerationId 属性の値を取得
PS C:\> Get-ADComputer $(hostname) -Properties msDS-GenerationId | Select-Object Name, msDS-GenerationId

Name   msDS-GenerationId
----   -----------------
T3ADDS {8, 121, 33, 236...}

# msDS-GenerationId 属性の値を Byte[] → String 変換
PS C:\> Get-ADComputer $(hostname) -Properties msDS-GenerationId | ForEach-Object { [BitConverter]::ToString($_."msDS-GenerationId") }
08-79-21-EC-44-FF-E3-7D

ADSIエディタの結果も次の通りです。

nitro-hypervisor-vm-generation-id-availavility-05

この他にDirectory ServiceのイベントログからもVM-Generation IDに関連するものが発見できました。

nitro-hypervisor-vm-generation-id-availavility-06
VM-Generation IDに関連するイベントログの一例

さらに、詳細までは書きませんが、一度設定されたVM-Generation IDが

  • インスタンスの再起動
  • Nitro → Nitro (m8i-flex.large) へのインスタンスタイプの変更
    • ハイパーバイザーから取得される値に変化なし
  • Nitro → 非Nitro (t2.large) へのインスタンスタイプの変更
    • 非NitroインスタンスではハイパーバイザーからVM-Generation IDを取得できませんがコンピューターオブジェクトに保存された属性値に変化なし

では変化しなかった点と、逆にEBSスナップショットからリストアした際にIDが変化しドメインコントローラーで検知できたところまで確認しています。[1]

nitro-hypervisor-vm-generation-id-availavility-07
VM-Generation IDの変化を検知したイベントログ

VM-Generation IDの変更を検知した際のイベントログ全文
世代 ID の変更が検出されました。 

DS にキャッシュされている世代 ID (古い値):
9071374745938786568 
現在 VM にある世代 ID (新しい値):
5976509440875204458 

世代 ID の変更は、仮想マシン スナップショットの適用、仮想マシンのインポート操作、またはライブ マイグレーション操作の後に発生します。Active Directory ドメイン サービスは、新しい起動 ID を作成してドメイン コントローラーを復旧します。仮想マシン スナップショットを使用して仮想ドメイン コントローラーを復元しないでください。Active Directory ドメイン サービス データベースの内容を復元またはロールバックするには、Active Directory ドメイン サービス対応のバックアップ アプリケーションを使用して作成されたシステム状態バックアップを使用する必要があります。

確かにNitroインスタンスでVM-Generation IDが使えていました。

最後に

以上となります。

ずっとEC2ではVM-Generation IDが使えないと思っていたのでこの結果に驚いています。
最初に述べた様に公式のサポートは期待できない感じではありますが機能が無いよりは遥かにマシです。

EC2でドメインコントローラーを構築する際は必ずNitro世代のインスタンスタイプを選んでください。

脚注
  1. 単一EC2環境のため検知後のドメインコントローラーの挙動が適切であったかまでは未確認です ↩︎

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事