

# 호스트가 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를 가져와 UUID의 첫 번째 8진수에서 `EC2`(Linux에서는 소문자 `ec2`일 수 있음)를 찾을 수 있습니다. 이 방법은 빠르지만 EC2 인스턴스가 아닌 시스템에 이러한 문자로 시작하는 UUID가 있을 가능성이 적기 때문에 잠재적으로는 부정확할 수 있습니다. 또한 일부 버전의 SMBIOS는 UUID의 시작 부분에 `EC2`가 포함되지 않는 **little-endian 형식을 사용합니다. 이는 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** cmdlet을 사용합니다.

```
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 테이블 항목을 통해 인스턴스의 게스트 운영 체제 내에 노출됩니다. 머신을 복제 또는 복사하거나 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html) 등을 통해 AWS로 가져오는 경우 값이 변경됩니다.

**예: 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 설명서의 [가상 머신 생성 식별자 얻기](https://learn.microsoft.com/en-us/windows/win32/hyperv_v2/virtual-machine-generation-identifier#obtaining-the-virtual-machine-generation-identifier) 섹션을 참조하세요.