

# ホストが EC2 インスタンスであるかどうかを検出する
<a name="identify_ec2_instances"></a>

特に混在コンピューティング環境がある場合は、アプリケーションまたはウェブサイトが EC2 インスタンスで実行されているかどうかを知る必要がある場合があります。次のいずれかのオプションを使用して、アプリケーションまたはウェブサイトのホストが EC2 インスタンスであるかどうかを判断できます。

**Topics**
+ [インスタンスアイデンティティドキュメント の検査](#inspect-instance-identity-document)
+ [システム UUID の検査](#inspect-uuid)
+ [システムの仮想マシン生成識別子を調べる](#vm-generation-id)

## インスタンスアイデンティティドキュメント の検査
<a name="inspect-instance-identity-document"></a>

各インスタンスには、暗号的に検証できる署名付きインスタンス ID ドキュメントがあります。これらのドキュメントは、インスタンスメタデータサービス (IMDS) を使用して確認できます。

詳細については、「[インスタンスアイデンティティドキュメント](instance-identity-documents.md)」を参照してください。

## システム UUID の検査
<a name="inspect-uuid"></a>

システム UUID を取得して、`EC2` (Linux では小文字の `ec2` になる場合があります) の UUID の先頭オクテットを調べることができます。この方法は、EC2 インスタンスではないシステムがこれらの文字で始まる UUID を持つ可能性が低いため、速いですが不正確である可能性があります。さらに、SMBIOS の一部のバージョンでは、UUID の先頭に `EC2` がないリトルエンディアン形式を使用します。これは、Windows で SMBIOS 2.4 を使用する EC2 インスタンス、または SMBIOS の独自の実装がある Amazon Linux 以外の Linux ディストリビューションの場合に当てはまります。

**Linux の例: DMI からの UUID の取得 (HVM AMI のみ)**  
デスクトップ管理インターフェイス (DMI) を使用して UUID を取得するには、次のコマンドを使用します。

```
[ec2-user ~]$ sudo dmidecode --string system-uuid
```

次の出力例では、UUID は「EC2」で始まりますが、これは多くの場合システムが EC2 インスタンスであることを示しています。

```
EC2E1916-9099-7CAF-FD21-012345ABCDEF
```

次の出力例では、UUID がリトルエンディアン形式で表されています。

```
45E12AEC-DCD1-B213-94ED-012345ABCDEF
```

別の方法として、Nitro システムに構築されたインスタンスの場合には、次のコマンドを使用できます。

```
[ec2-user ~]$ cat /sys/devices/virtual/dmi/id/board_asset_tag
```

次の例のように出力がインスタンス ID となる場合、そのシステムは EC2 インスタンスです。

```
i-0af01c0123456789a
```

**Linux の例: ハイパーバイザーからの UUID の取得 (PV AMI のみ)**  
次のコマンドを使用して、ハイパーバイザーから UUID を取得します。

```
[ec2-user ~]$ cat /sys/hypervisor/uuid
```

次の出力例では、UUID は「ec2」で始まりますが、これは多くの場合システムが EC2 インスタンスであることを示しています。

```
ec2e1916-9099-7caf-fd21-012345abcdef
```

**Windows の例: WMI または Windows PowerShell を使用した UUID の取得**  
以下のように、Windows Management Instrumentation コマンドライン (WMIC) を使用します。

```
wmic path win32_computersystemproduct get uuid
```

または、Windows PowerShell を使用している場合、次のように **Get-WmiObject** コマンドレットを使用します。

```
PS C:\> Get-WmiObject -query "select uuid from Win32_ComputerSystemProduct" | Select UUID
```

次の出力例では、UUID は「EC2」で始まりますが、これは多くの場合システムが EC2 インスタンスであることを示しています。

```
EC2AE145-D1DC-13B2-94ED-012345ABCDEF
```

SMBIOS 2.4 を使用するインスタンスの場合、UUID は次のようにリトルエンディアン形式で表されることがあります。

```
45E12AEC-DCD1-B213-94ED-012345ABCDEF
```

## システムの仮想マシン生成識別子を調べる
<a name="vm-generation-id"></a>

仮想マシン生成識別子は、暗号化ランダム整数識別子として解釈される 128 ビットの一意のバッファで構成されます。仮想マシン生成識別子を取得すると、Amazon Elastic Compute Cloud インスタンスを識別できます。生成識別子は、ACPI テーブルエントリを介してインスタンスのゲストオペレーティングシステム内に公開されています。AWS にマシンをクローン、コピー、またはインポートすると、値は [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html) などに変わります。

**例: Linux からの仮想マシン生成識別子の取得**  
次のコマンドを使用して、Linux を実行しているインスタンスから仮想マシン生成識別子を取得できます。

------
#### [ Amazon Linux 2 ]

1. 必要に応じて、次のコマンドを使用して既存のソフトウェアパッケージを更新します。

   ```
   sudo yum update
   ```

1. 必要に応じて、次のコマンドを使用して busybox パッケージを入手します。

   ```
   sudo curl https://www.rpmfind.net/linux/epel/next/8/Everything/x86_64/Packages/b/busybox-1.35.0-2.el8.next.x86_64.rpm --output busybox.rpm
   ```

1. 必要に応じて、次のコマンドを使用して前提条件パッケージをインストールします。

   ```
   sudo yum install busybox.rpm iasl -y
   ```

1. `iasl` コマンドを実行して、ACPI テーブルから出力を生成します。

   ```
   sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
   ```

1. 次のコマンドを実行して、`iasl` コマンドの出力をレビューします。

   ```
   cat SSDT2.dsl
   ```

   仮想マシン生成識別子を取得するために必要なアドレス空間が生成されているはずです。

   ```
   Intel ACPI Component Architecture
   ASL+ Optimizing Compiler/Disassembler version 20190509
   Copyright (c) 2000 - 2019 Intel Corporation
   
   File appears to be binary: found 32 non-ASCII characters, disassembling
   Binary file appears to be a valid ACPI table, disassembling
   Input file /sys/firmware/acpi/tables/SSDT2, Length 0x7B (123) bytes
   ACPI: SSDT 0x0000000000000000 00007B (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
   Pass 1 parse of [SSDT]
   Pass 2 parse of [SSDT]
   Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
   
   Parsing completed
   Disassembly completed
   ASL Output:    ./SSDT2.dsl - 1065 bytes
   $
   /*
   * Intel ACPI Component Architecture
   * AML/ASL+ Disassembler version 20190509 (64-bit version)
   * Copyright (c) 2000 - 2019 Intel Corporation
   *
   * Disassembling to symbolic ASL+ operators
   *
   * Disassembly of /sys/firmware/acpi/tables/SSDT2, Tue Mar 29 16:15:14 2022
   *
   * Original Table Header:
   *     Signature        "SSDT"
   *     Length           0x0000007B (123)
   *     Revision         0x01
   *     Checksum         0xB8
   *     OEM ID           "AMAZON"
   *     OEM Table ID     "AMZNSSDT"
   *     OEM Revision     0x00000001 (1)
   *     Compiler ID      "AMZN"
   *     Compiler Version 0x00000001 (1)
   */
   DefinitionBlock ("", "SSDT", 1, "AMAZON", "AMZNSSDT", 0x00000001)
   {
   Scope (\_SB)
   {
       Device (VMGN)
       {
           Name (_CID, "VM_Gen_Counter")  // _CID: Compatible ID
           Name (_DDN, "VM_Gen_Counter")  // _DDN: DOS Device Name
           Name (_HID, "AMZN0000")  // _HID: Hardware ID
           Name (ADDR, Package (0x02)
           {
               0xFED01000,
               Zero
           })
       }
   }
   }
   ```

1. (オプション) 次のコマンドを使用して、残りのステップのターミナル許可を昇格させます。

   ```
   sudo -s
   ```

1. 次のコマンドを使用して、以前に収集したアドレス空間を保存します。

   ```
   VMGN_ADDR=0xFED01000
   ```

1. 次のコマンドを使用して、アドレス空間を介して反復処理し、仮想マシン生成識別子を作成します。

   ```
   for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
   ```

1. 次のコマンドを使用して、出力ファイルから仮想マシン生成識別子を取得します。

   ```
   cat vmgenid ; echo
   ```

   出力は次のようになります。

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

------
#### [ Ubuntu ]

1. 必要に応じて、次のコマンドを使用して既存のソフトウェアパッケージを更新します。

   ```
   sudo apt update
   ```

1. 必要に応じて、次のコマンドを使用して前提条件パッケージをインストールします。

   ```
   sudo apt install busybox iasl -y
   ```

1. `iasl` コマンドを実行して、ACPI テーブルから出力を生成します。

   ```
   sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
   ```

1. 次のコマンドを実行して、`iasl` コマンドの出力をレビューします。

   ```
   cat SSDT2.dsl
   ```

   仮想マシン生成識別子を取得するために必要なアドレス空間が生成されているはずです。

   ```
   Intel ACPI Component Architecture
   ASL+ Optimizing Compiler/Disassembler version 20190509
   Copyright (c) 2000 - 2019 Intel Corporation
   
   File appears to be binary: found 32 non-ASCII characters, disassembling
   Binary file appears to be a valid ACPI table, disassembling
   Input file /sys/firmware/acpi/tables/SSDT2, Length 0x7B (123) bytes
   ACPI: SSDT 0x0000000000000000 00007B (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
   Pass 1 parse of [SSDT]
   Pass 2 parse of [SSDT]
   Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
   
   Parsing completed
   Disassembly completed
   ASL Output:    ./SSDT2.dsl - 1065 bytes
   $
   /*
   * Intel ACPI Component Architecture
   * AML/ASL+ Disassembler version 20190509 (64-bit version)
   * Copyright (c) 2000 - 2019 Intel Corporation
   *
   * Disassembling to symbolic ASL+ operators
   *
   * Disassembly of /sys/firmware/acpi/tables/SSDT2, Tue Mar 29 16:15:14 2022
   *
   * Original Table Header:
   *     Signature        "SSDT"
   *     Length           0x0000007B (123)
   *     Revision         0x01
   *     Checksum         0xB8
   *     OEM ID           "AMAZON"
   *     OEM Table ID     "AMZNSSDT"
   *     OEM Revision     0x00000001 (1)
   *     Compiler ID      "AMZN"
   *     Compiler Version 0x00000001 (1)
   */
   DefinitionBlock ("", "SSDT", 1, "AMAZON", "AMZNSSDT", 0x00000001)
   {
   Scope (\_SB)
   {
       Device (VMGN)
       {
           Name (_CID, "VM_Gen_Counter")  // _CID: Compatible ID
           Name (_DDN, "VM_Gen_Counter")  // _DDN: DOS Device Name
           Name (_HID, "AMZN0000")  // _HID: Hardware ID
           Name (ADDR, Package (0x02)
           {
               0xFED01000,
               Zero
           })
       }
   }
   }
   ```

1. (オプション) 次のコマンドを使用して、残りのステップのターミナル許可を昇格させます。

   ```
   sudo -s
   ```

1. 次のコマンドを使用して、以前に収集したアドレス空間を保存します。

   ```
   VMGN_ADDR=0xFED01000
   ```

1. 次のコマンドを使用して、アドレス空間を介して反復処理し、仮想マシン生成識別子を作成します。

   ```
   for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
   ```

1. 次のコマンドを使用して、出力ファイルから仮想マシン生成識別子を取得します。

   ```
   cat vmgenid ; echo
   ```

   出力は次のようになります。

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

------

**例: Windows からの仮想マシン生成識別子の取得**  


Windows を実行しているインスタンスから仮想マシン生成識別子を取得するサンプルアプリケーションを作成できます。詳細については、Microsoft のドキュメントの「[Obtaining the virtual machine generation identifier](https://learn.microsoft.com/en-us/windows/win32/hyperv_v2/virtual-machine-generation-identifier#obtaining-the-virtual-machine-generation-identifier)」(仮想マシン生成識別子の取得) を参照してください。