

# Detección de si un host es una instancia de EC2
<a name="identify_ec2_instances"></a>

Es posible que tenga que saber si su aplicación o sitio web se ejecuta en una instancia de EC2, específicamente si tiene un entorno de computación combinado. Puede utilizar una de las siguientes opciones para determinar si el host de su aplicación o sitio web es una instancia de EC2.

**Topics**
+ [Examinar el Documentos de identidad de instancia](#inspect-instance-identity-document)
+ [Revise el UUID del sistema](#inspect-uuid)
+ [Examine el identificador de generación de máquinas virtuales del sistema](#vm-generation-id)

## Examinar el Documentos de identidad de instancia
<a name="inspect-instance-identity-document"></a>

Cada instancia tiene un documento de identidad de instancia firmado que puede comprobar criptográficamente. Puede encontrar estos documentos mediante el servicio de metadatos de instancias (IMDS).

Para obtener más información, consulte [Documentos de identidad de instancias](instance-identity-documents.md).

## Revise el UUID del sistema
<a name="inspect-uuid"></a>

Puede obtener el UUID del sistema y buscarlo en el octeto inicial del UUID para `EC2` (en Linux, puede estar en minúsculas `ec2`). Este método es rápido, pero potencialmente impreciso, ya que existe una pequeña posibilidad de que un sistema que no es una instancia EC2 tenga un UUID que comience con estos caracteres. Además, algunas versiones de SMBIOS utilizan el formato *little-endian*, que no incluye `EC2` al principio del UUID. Este podría ser el caso de las instancias de EC2 que utilizan SMBIOS 2.4 para Windows o de distribuciones de Linux distintas de Amazon Linux que tienen su propia implementación de SMBIOS.

**Ejemplo de Linux: obtención del UUID de DMI (solo AMI HVM)**  
Utilice el siguiente comando para obtener el UUID mediante la Interfaz de administración de escritorio (DMI):

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

En el siguiente ejemplo de resultado, el UUID comienza por "EC2", lo que indica que el sistema es probablemente una instancia de EC2.

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

En la siguiente salida de ejemplo, el UUID se representa en formato little-endian.

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

Otra opción para instancias integradas en el sistema Nitro, es usar el siguiente comando:

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

Si la salida es un ID de instancia, como la siguiente salida de ejemplo, el sistema es una instancia de EC2:

```
i-0af01c0123456789a
```

**Ejemplo de Linux: obtención del UUID del hipervisor (solo AMI PV)**  
Utilice el siguiente comando para obtener el UUID del hipervisor:

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

En el siguiente ejemplo de resultado, el UUID comienza por "ec2", lo que indica que el sistema es probablemente una instancia de EC2.

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

**Ejemplo de Windows: obtención del UUID con WMI o Windows PowerShell**  
Use la línea de comando Windows Management Instrumentation Command (WMIC) del modo siguiente:

```
wmic path win32_computersystemproduct get uuid
```

Si utiliza Windows PowerShell, use el cmdlet **Get-WmiObject** del modo siguiente:

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

En el siguiente ejemplo de resultado, el UUID comienza por "EC2", lo que indica que el sistema es probablemente una instancia de EC2.

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

En las instancias que usan SMBIOS 2.4, se puede representar el UUID en formato little-endian, por ejemplo:

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

## Examine el identificador de generación de máquinas virtuales del sistema
<a name="vm-generation-id"></a>

Un identificador de generación de máquinas virtuales consiste en un búfer único de 128 bits que se interpreta como un identificador criptográfico aleatorio de números enteros. Puede recuperar el identificador de generación de máquinas virtuales para identificar su instancia de Amazon Elastic Compute Cloud (EC2). El identificador de generación se encuentra expuesto dentro del sistema operativo invitado de la instancia a través de una entrada de la tabla ACPI. El valor cambiará si el equipo se clona, copia o importa en AWS, como por ejemplo con [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html).

**Ejemplo: Recupere el identificador de generación de máquinas virtuales de Linux**  
Puede utilizar los siguientes comandos para recuperar el identificador de generación de máquinas virtuales de sus instancias que ejecutan Linux.

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

1. Actualice sus paquetes de software existentes, según sea necesario, mediante el siguiente comando:

   ```
   sudo yum update
   ```

1. Si es necesario, obtenga el paquete busybox con el siguiente comando:

   ```
   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. Si es necesario, instale los paquetes de requisitos previos mediante el siguiente comando:

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

1. Ejecute el siguiente comando `iasl` para obtener la salida de la tabla ACPI:

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

1. Ejecute el siguiente comando para revisar la salida del comando `iasl`:

   ```
   cat SSDT2.dsl
   ```

   La salida debería proporcionar el espacio de direcciones necesario para recuperar el identificador de generación de máquinas virtuales:

   ```
   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. (Opcional) Aumente los permisos del terminal para los pasos restantes con el siguiente comando:

   ```
   sudo -s
   ```

1. Utilice el siguiente comando para almacenar el espacio de direcciones recopilado previamente:

   ```
   VMGN_ADDR=0xFED01000
   ```

1. Utilice el siguiente comando para iterar a través del espacio de direcciones y crear el identificador de generación de máquinas virtuales:

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

1. Recupere el identificador de generación de máquinas virtuales del archivo de salida con el siguiente comando:

   ```
   cat vmgenid ; echo
   ```

   El resultado debería ser similar al siguiente:

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

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

1. Actualice sus paquetes de software existentes, según sea necesario, mediante el siguiente comando:

   ```
   sudo apt update
   ```

1. Si es necesario, instale los paquetes de requisitos previos mediante el siguiente comando:

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

1. Ejecute el siguiente comando `iasl` para obtener la salida de la tabla ACPI:

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

1. Ejecute el siguiente comando para revisar la salida del comando `iasl`:

   ```
   cat SSDT2.dsl
   ```

   La salida debería proporcionar el espacio de direcciones necesario para recuperar el identificador de generación de máquinas virtuales:

   ```
   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. (Opcional) Aumente los permisos del terminal para los pasos restantes con el siguiente comando:

   ```
   sudo -s
   ```

1. Utilice los siguientes comandos para almacenar el espacio de direcciones recopilado previamente:

   ```
   VMGN_ADDR=0xFED01000
   ```

1. Utilice el siguiente comando para iterar a través del espacio de direcciones y crear el identificador de generación de máquinas virtuales:

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

1. Recupere el identificador de generación de máquinas virtuales del archivo de salida con el siguiente comando:

   ```
   cat vmgenid ; echo
   ```

   El resultado debería ser similar al siguiente:

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

------

**Ejemplo: Recupere el identificador de generación de máquinas virtuales de Windows**  


Puede crear una aplicación de ejemplo para recuperar el identificador de generación de máquinas virtuales de las instancias que ejecutan Windows. Para obtener más información, consulte [Obtención del identificador de generación de máquinas virtuales](https://learn.microsoft.com/en-us/windows/win32/hyperv_v2/virtual-machine-generation-identifier#obtaining-the-virtual-machine-generation-identifier) en la documentación de Microsoft.