

# Detectar se um host é uma instância do EC2
<a name="identify_ec2_instances"></a>

Talvez seja necessário determinar se a aplicação ou o site está sendo executado em uma instância do EC2, especialmente se você tiver um ambiente de computação misto. Você pode usar uma das opções a seguir para determinar se o host da aplicação ou do site é uma instância do EC2.

**Topics**
+ [Inspecione o documento de identidade da instância](#inspect-instance-identity-document)
+ [Inspecione o UUID do sistema](#inspect-uuid)
+ [Inspecione o identificador de geração da máquina virtual do sistema](#vm-generation-id)

## Inspecione o documento de identidade da instância
<a name="inspect-instance-identity-document"></a>

Cada instância tem um documento de identidade de instância assinado que você pode verificar criptograficamente. Você pode encontrar esses documentos usando o serviço de metadados de instância (IMDS).

Para obter mais informações, consulte [Documentos de identidade da instância](instance-identity-documents.md).

## Inspecione o UUID do sistema
<a name="inspect-uuid"></a>

Você pode obter o UUID do sistema e procurar no octeto inicial do UUID por `EC2` (no Linux, pode ser `ec2` em letras minúsculas). Esse método é rápido, mas potencialmente impreciso, pois há uma pequena possibilidade de que um sistema que não seja uma instância do EC2 possa ter um UUID que comece com esses caracteres. Além disso, algumas versões do SMBIOS usam o formato *little-endian*, que não inclui `EC2` no início do UUID. Esse pode ser o caso de instâncias do EC2 que usam o SMBIOS 2.4 para Windows ou para distribuições do Linux diferentes do Amazon Linux que têm as próprias implementações de SMBIOS.

**Exemplo do Linux: obtenha o UUID da DMI (somente para AMIs de HVM)**  
Use o seguinte comando para obter o UUID usando a Desktop Management Interface (DMI):

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

Na próxima saída de exemplo, o UUID começa com "EC2", que indica que o sistema é provavelmente uma instância do EC2.

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

No exemplo de saída a seguir, o UUID é representado no formato little-endian.

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

Como alternativa, para instâncias criadas no sistema Nitro, é possível usar o seguinte comando:

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

Se a saída for um ID de instância, como a saída de exemplo a seguir, o sistema será uma instância do EC2:

```
i-0af01c0123456789a
```

**Exemplo do Linux: obtenha o UUID do hipervisor (somente para AMIs PV)**  
Use o seguinte comando para obter o UUID do hipervisor:

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

Na próxima saída de exemplo, o UUID começa com "ec2", que indica que o sistema é provavelmente uma instância do EC2.

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

**Exemplo do Windows: obtenha o UUID usando o WMI ou o Windows PowerShell**  
Use a linha de comando de Instrumentação de Gerenciamento do Windows (WMIC) da seguinte forma:

```
wmic path win32_computersystemproduct get uuid
```

Alternativamente, se você estiver usando o Windows PowerShell, use o cmdlet **Get-WmiObject** da seguinte maneira:

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

Na próxima saída de exemplo, o UUID começa com "EC2", que indica que o sistema é provavelmente uma instância do EC2.

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

Para instâncias que usam o SMBIOS 2.4, o UUID pode ser representado no formato little-endian; por exemplo:

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

## Inspecione o identificador de geração da máquina virtual do sistema
<a name="vm-generation-id"></a>

Um identificador de geração de máquina virtual consiste em um buffer exclusivo de 128 bits interpretado como identificador de inteiro aleatório criptográfico. É possível recuperar o identificador de geração de máquina virtual para identificar sua instância do Amazon Elastic Compute Cloud. O identificador de geração é exposto no sistema operacional convidado da instância por meio de uma entrada de tabela ACPI. O valor mudará se sua máquina for clonada, copiada ou importada para AWS, como com [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html).

**Exemplo: como recuperar o identificador de geração de máquina virtual do Linux**  
É possível usar os seguintes comandos para recuperar o identificador de geração de máquina virtual de suas instâncias que executem o Linux:

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

1. Atualize seus pacotes de software existentes, conforme necessário, usando o seguinte comando:

   ```
   sudo yum update
   ```

1. Se necessário, utilize o pacote busybox com o seguinte 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. Se necessário, instale os pacotes de pré-requisitos usando o seguinte comando:

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

1. Execute o seguinte `iasl` para produzir saída da tabela ACPI:

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

1. Execute o seguinte comando para revisar a saída do comando `iasl`:

   ```
   cat SSDT2.dsl
   ```

   A saída deve gerar o espaço de endereço necessário para recuperar o identificador de geração da máquina virtual:

   ```
   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) Eleve suas permissões de terminal para as etapas restantes com o seguinte comando:

   ```
   sudo -s
   ```

1. Use o comando a seguir para armazenar o espaço de endereço coletado anteriormente:

   ```
   VMGN_ADDR=0xFED01000
   ```

1. Use o seguinte comando para iterar pelo espaço de endereço e criar o identificador de geração de máquina virtual:

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

1. Recupere o identificador de geração da máquina virtual do arquivo de saída com o seguinte comando:

   ```
   cat vmgenid ; echo
   ```

   Sua saída deve ser similar à seguinte:

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

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

1. Atualize seus pacotes de software existentes, conforme necessário, usando o seguinte comando:

   ```
   sudo apt update
   ```

1. Se necessário, instale os pacotes de pré-requisitos usando o seguinte comando:

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

1. Execute o seguinte `iasl` para produzir saída da tabela ACPI:

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

1. Execute o seguinte comando para revisar a saída do comando `iasl`:

   ```
   cat SSDT2.dsl
   ```

   A saída deve gerar o espaço de endereço necessário para recuperar o identificador de geração da máquina virtual:

   ```
   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) Eleve suas permissões de terminal para as etapas restantes com o seguinte comando:

   ```
   sudo -s
   ```

1. Use os seguintes comandos para armazenar o espaço de endereço coletado anteriormente:

   ```
   VMGN_ADDR=0xFED01000
   ```

1. Use o seguinte comando para iterar pelo espaço de endereço e criar o identificador de geração de máquina virtual:

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

1. Recupere o identificador de geração da máquina virtual do arquivo de saída com o seguinte comando:

   ```
   cat vmgenid ; echo
   ```

   Sua saída deve ser similar à seguinte:

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

------

**Exemplo: como recuperar o identificador de geração de máquina virtual do Windows**  


É possível criar uma aplicação de exemplo para recuperar o identificador de geração de máquina virtual de suas instâncias que executam o Windows. Para obter mais informações, consulte [Obter o identificador de geração de máquina virtual](https://learn.microsoft.com/en-us/windows/win32/hyperv_v2/virtual-machine-generation-identifier#obtaining-the-virtual-machine-generation-identifier) na documentação da Microsoft.