

# Acceso a los metadatos de instancia de una instancia de EC2
<a name="instancedata-data-retrieval"></a>

Puede acceder a los metadatos de la instancia de EC2 desde la propia instancia o desde la consola de EC2, la API, los SDK o la AWS CLI. Para obtener la configuración de metadatos de la instancia actual de una instancia desde la consola o la línea de comandos, consulte [Opciones de metadatos de instancia de consulta para instancias existentes](#query-IMDS-existing-instances).

También puede modificar los datos de usuario de las instancias con un volumen raíz de EBS. La instancia debe estar detenida. Para obtener instrucciones sobre la consola, consulte [Actualización de los datos de usuario de la instancia](user-data.md#user-data-modify). Para ver un ejemplo de Linux en el que se usa la AWS CLI, consulte [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html). Para ver un ejemplo de Windows en el que se utiliza Tools for Windows PowerShell, consulte [Datos de usuario y las Tools for Windows PowerShell](user-data.md#user-data-powershell).

**nota**  
No se le cobrará por las solicitudes HTTP utilizadas para recuperar metadatos de instancia y datos de usuario.

## Consideraciones sobre el acceso a los metadatos de instancia
<a name="imds-considerations"></a>

Para evitar problemas con la recuperación de metadatos de instancia, tenga en cuenta lo siguiente.

**Fallos en el lanzamiento de la instancia debido a la aplicación de IMDSv2 (`HttpTokensEnforced=enabled`)**  
Antes de habilitar la aplicación de IMDSv2, necesita que todo el software de la instancia sea compatible con IMDSv2. Después, puede cambiar el valor predeterminado para deshabilitar IMDSv1 (`httpTokens=required`), después de lo cual podrá habilitar la aplicación. Para obtener más información, [Transición al uso de Servicio de metadatos de instancia, versión 2](instance-metadata-transition-to-version-2.md).

**Formato de comando**  
El formato del comando es diferente, en función de si utiliza la versión 1 del servicio de metadatos de instancia (IMDSv1) o la versión 2 del servicio de metadatos de instancia (IMDSv2). De forma predeterminada, puede usar ambos ambas versiones del servicio de metadatos de instancias. Para exigir el uso de IMDSv2, consulte [Uso del servicio de metadatos de instancias para acceder a metadatos de instancia](configuring-instance-metadata-service.md).

**Si se requiere IMDSv2, IMDSv1 no funciona.**  
Si utiliza IMDSv1 y no recibe respuesta, es probable que necesite IMDSv2. Para comprobar si IMDSv2 es obligatorio, seleccione la instancia para ver los detalles. El valor **IMDSv2** indica si es **obligatorio** (se debe usar IMDSv2) u **Opcional** (se puede usar IMDSv2 o IMDSv1). 

**(IMDSv2) Se usa para recuperar el token /latest/api/token**  
La emisión de solicitudes `PUT` a cualquier ruta específica de la versión, como, por ejemplo, `/2021-03-23/api/token`, da lugar a que el servicio de metadatos devuelva errores 403 Forbidden (403 Prohibido). Este es el comportamiento deseado.

**Versión de metadatos**  
Para no tener que actualizar el código cada vez que Amazon EC2 publique una nueva compilación de metadatos de instancia, se recomienda utilizar `latest` en la ruta, no el número de versión.

**Compatibilidad con IPv6**  
Para recuperar los metadatos de la instancia mediante una dirección IPv6, asegúrese de habilitar y utilizar la dirección IPv6 del IMDS `[fd00:ec2::254]` en lugar de la dirección IPv4 `169.254.169.254`. Debe ser una [instancia basada en Nitro](instance-types.md#instance-hypervisor-type) lanzada en una [subred que admita IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range).

**(Windows) Creación de las AMI personalizadas con Sysprep.**  
Para asegurarse de que el IMDS funcione cuando inicie una instancia desde una AMI de Windows personalizada, la AMI debe ser una imagen estandarizada creada con Windows Sysprep. De lo contrario, IMDS no funcionará. Para obtener más información, consulte [Creación de una AMI de Amazon EC2 con Windows Sysprep](ami-create-win-sysprep.md).

**En un entorno de contenedores, considere reconfigurar o aumentar el límite de saltos a 2.**  
Los AWS SDK utilizan llamadas a IMDSv2 de forma predeterminada. Si la llamada IMDSv2 no recibe respuesta, algunos SDK de AWS reintentan la llamada y, si aún no tienen éxito, utilizan IMDSv1. Esto puede generar un retraso, especialmente en un entorno de contenedor. Para aquellos SDK de AWS que *requieren* IMDSv2, si el límite de saltos es 1 en un entorno de contenedores, la llamada podría no recibir respuesta en absoluto, ya que ir al contenedor se considera un salto de red adicional.  
Para mitigar estos problemas en un entorno de contenedores, considere cambiar la configuración para pasar los ajustes (como la Región de AWS) directamente al contenedor, o considere aumentar el límite de saltos a 2. Para obtener información sobre el impacto del límite de saltos, consulte [Agregar defensa en profundidad contra firewalls abiertos, proxies inversos y vulnerabilidades SSRF con mejoras en el servicio de metadatos de instancias de EC2](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/). Para obtener más información sobre cómo cambiar el límite de saltos, consulte [Cambio del límite de saltos de respuesta PUT](configuring-IMDS-existing-instances.md#modify-PUT-response-hop-limit).

**Límite de paquetes por segundo (PPS)**  
Hay un límite de 1024 paquetes por segundo (PPS) para los servicios que utilizan direcciones [locales de enlace](using-instance-addressing.md#link-local-addresses). Este límite incluye la suma de las [consultas de DNS de Route 53 Resolver](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-limits), las solicitudes del [servicio de metadatos de instancias (IMDS)](set-time.md), las solicitudes del protocolo de tiempo de red (NTP) del servicio temporal de Amazon y las solicitudes del [Servicio de licencias de Windows (para instancias basadas en Microsoft Windows)](https://aws.amazon.com/windows/resources/licensing/). 

**Consideraciones adicionales para el acceso a datos de usuario**
+ Los datos de usuario se tratan como datos opacos: lo que especifica es lo que obtiene en la recuperación. La instancia debe interpretar los datos de usuario y actuar sobre ellos.
+ Los datos de usuario deben estar codificados con base64. Según la herramienta o el SDK que utilice, es posible que se realice automáticamente la codificación en base64. Por ejemplo:
  + La consola de Amazon EC2 puede realizar la codificación con base64 por usted, o bien puede aceptar la entrada codificada con base64.
  + [La AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam) realiza la codificación en base64 de los parámetros binarios de forma predeterminada. La AWS CLI versión 1 realiza la codificación en base64 del parámetro `--user-data` por usted.
  + AWS SDK para Python (Boto3) realiza la codificación en base64 del parámetro `UserData` por usted.
+ Los datos de usuario están limitados a 16 KB, sin formato, antes de cifrarlo en base64. El tamaño de una cadena de longitud *n* tras el cifrado en base64 es ceil(*n*/3)\$14.
+ Los datos de usuario deben descodificarse en base64 al recuperarlos. Los datos se descodifican automáticamente si los recupera con los metadatos de instancia o la consola.
+ Si detiene una instancia, modifica sus datos de usuario y la inicia de nuevo, los datos de usuario actualizados no se ejecutan automáticamente al iniciar la instancia. Con instancias de Windows, puede configurar los ajustes para que los scripts de datos de usuario actualizados se ejecuten una vez al iniciar la instancia, o bien cada vez que esta se inicie o se reinicie.
+ Los datos de usuario son un atributo de la instancia. Si crea una AMI a partir de una instancia, los datos de usuario de la instancia no se incluyen en la AMI.

## Acceso a los metadatos de la instancia desde una instancia de EC2
<a name="instancedata-inside-access"></a>

Puesto que los metadatos de la instancia se encuentran disponibles en la instancia en ejecución, no se necesita utilizar la consola de Amazon EC2 ni la AWS CLI. Esto puede resultar de utilidad al escribir scripts para ejecutarlos desde la instancia. Por ejemplo, puede obtener acceso a la dirección IP local de la instancia desde los metadatos de la instancia para administrar una conexión a una aplicación externa.

Todos los datos siguientes se consideran metadatos de instancia, pero se accede a ellos de diferentes maneras. Seleccione la pestaña que representa el tipo de metadatos de la instancia a los que desea acceder para ver más información.

------
#### [ Metadata ]

Las propiedades de los metadatos de instancia se dividen en categorías. Para obtener una descripción de cada categoría de metadatos de instancia, consulte [Categorías de metadatos de instancia](ec2-instance-metadata.md#instancedata-data-categories).

Para acceder a las propiedades de metadatos de instancia desde una instancia en ejecución, obtenga los datos de las siguientes URI IPv4 o IPv6. Estas direcciones IP son direcciones de enlace local y solo son válidas desde la instancia. Para obtener más información, consulte [Direcciones de enlace local](using-instance-addressing.md#link-local-addresses).

**IPv4**

```
http://169.254.169.254/latest/meta-data/
```

**IPv6**

```
http://[fd00:ec2::254]/latest/meta-data/
```

------
#### [ Dynamic data ]

Para recuperar datos dinámicos de una instancia en ejecución, utilice los siguientes URI.

**IPv4**

```
http://169.254.169.254/latest/dynamic/
```

**IPv6**

```
http://[fd00:ec2::254]/latest/dynamic/
```

**Ejemplos: acceso con cURL**  
Los ejemplos siguientes usan `cURL` para recuperar categorías de identidad de instancia de alto nivel.

*IMDSv2*

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
```

*IMDSv1*

```
[ec2-user ~]$ curl http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
```

**Ejemplos: acceso con PowerShell**  
En los ejemplos siguientes se usa PowerShell para recuperar categorías de identidad de instancia de alto nivel.

*IMDSv2*

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
```

*IMDSv1*

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
```

Para obtener más información sobre datos dinámicos y ejemplos de cómo recuperarlos, consulte [Documentos de identidad de la instancia para las instancias de Amazon EC2](instance-identity-documents.md).

------
#### [ User data ]

Para recuperar datos de usuario de una instancia, utilice los siguientes URI. Para recuperar los datos de usuario mediante la dirección IPv6, debe habilitarla y la instancia debe ser una [instancia basada en Nitro](instance-types.md#instance-hypervisor-type) en una subred que admita IPv6.

**IPv4**

```
http://169.254.169.254/latest/user-data
```

**IPv6**

```
http://[fd00:ec2::254]/latest/user-data
```

Las solicitudes de datos de usuario devuelven los datos tal cual (tipo de contenido `application/octet-stream`). Si la instancia no tiene ningún dato de usuario, la solicitud devuelve `404 - Not Found`.

**Ejemplos: acceso con cURL para recuperar texto separado por comas**  
Los ejemplos siguientes usan `cURL` para recuperar datos de usuario especificados como texto separado por comas.

*IMDSv2*

```
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

*IMDSv1*

```
curl http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

**Ejemplos: acceso con PowerShell para recuperar texto separado por comas**  
En los ejemplos siguientes se usa PowerShell para recuperar datos de usuario que se especificaron como texto separado por comas.

*IMDSv2*

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

*IMDSv1*

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
-Method PUT -Uri http://169.254.169.254/latest/api/token} -Method GET -uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

**Ejemplos: acceso con cURL para recuperar un script**  
Los ejemplos siguientes usan `cURL` para recuperar datos de usuario que se especificaron como script.

*IMDSv2*

```
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

*IMDSv1*

```
curl http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

**Ejemplos: acceso con PowerShell para recuperar un script**  
En los ejemplos siguientes se usa PowerShell para recuperar datos de usuario que se especificaron como script.

*IMDSv2*

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

*IMDSv1*

```
Invoke-RestMethod -uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

------

## Opciones de metadatos de instancia de consulta para instancias existentes
<a name="query-IMDS-existing-instances"></a>

Puede consultar las opciones de metadatos de instancia para sus instancias existentes.

------
#### [ Console ]

**Para consultar las opciones de metadatos de una instancia existente**

1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. En el panel de navegación, seleccione **Instances (Instancias)**.

1. Seleccione su instancia y compruebe los siguientes campos:
   + **IMDSv2** – El valor es **Obligatorio** u **Opcional**.
   + **Permitir etiquetas en los metadatos de la instancia**: el valor está **Habilitado** o **Deshabilitado**.

1. Con su instancia seleccionada, elija **Acciones**, **Configuración de la instancia** y **Modificar opciones de metadatos de instancia**.

   El cuadro de diálogo muestra si el servicio de metadatos de la instancia está habilitado o deshabilitado para la instancia seleccionada.

------
#### [ AWS CLI ]

**Para consultar las opciones de metadatos de una instancia existente**  
Utilice el comando [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html).

```
aws ec2 describe-instances \
    --instance-id i-1234567898abcdef0 \
    --query 'Reservations[].Instances[].MetadataOptions'
```

------
#### [ PowerShell ]

**Para consultar las opciones de metadatos de una instancia existente mediante las herramientas para PowerShell**  
Utilice el cmdlet [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html).

```
(Get-EC2Instance `
    -InstanceId i-1234567898abcdef0).Instances.MetadataOptions
```

------

## Respuestas y mensajes de error
<a name="instance-metadata-returns"></a>

Todos los metadatos de instancia se devuelven como texto (tipo de contenido HTTP `text/plain`).

La solicitud de un recurso de metadato concreto devuelve el valor correspondiente, o bien un código de error HTTP `404 - Not Found` si no se encuentra disponible el recurso.

La solicitud de un recurso de metadato general (el URI acaba en /) devuelve una lista de recursos disponibles, o bien un código de error HTTP `404 - Not Found` si no existe dicho recurso. Los elementos de la lista aparecen en líneas separadas que acaban con saltos de línea (ASCII 10).

Si una solicitud IMDSv1 no recibe respuesta, es probable que se requiera IMDSv2.

Para las solicitudes realizadas con IMDSv2, se pueden devolver los siguientes códigos de error HTTP:
+ `400 - Missing or Invalid Parameters` – la solicitud `PUT` no es válida.
+ `401 - Unauthorized` – la solicitud `GET` usa un token no válido. La acción recomendada es generar un token nuevo.
+ `403 - Forbidden`: la solicitud no está permitida o IMDS está desactivado.
+ `404 - Not Found`: el recurso no está disponible o no existe tal recurso.
+ `503`: la solicitud no se ha podido completar. Intente realizar de nuevo la solicitud.

Si el IMDS devuelve un error, **curl** imprime el mensaje de error en el resultado y devuelve un código de estado correcto. El mensaje de error se almacena en la variable `TOKEN`, lo que provoca que se produzca un error en los comandos **curl** que utilizan el token. Si llama a **curl** con la opción **-f**, devuelve un código de estado de error en caso de que se produzca un error en el servidor HTTP. Si habilita la gestión de errores, el intérprete de comandos puede atrapar el error y detener el script.

## Limitación de consultas
<a name="instancedata-throttling"></a>

Limitamos las consultas a IMDS por cada instancia y aplicamos límites en el número de conexiones simultáneas desde una instancia a IMDS. 

Si utiliza IMDS para recuperar credenciales de seguridad de AWS, evite consultar credenciales en cada transacción o mientras se ejecuta una gran cantidad de procesos o subprocesos, ya que puede producirse una limitación controlada en las operaciones. En lugar de ello, se recomienda guardar en caché las credenciales hasta que comience a aproximarse su caducidad. Para obtener más información sobre el rol de IAM y las credenciales de seguridad asociadas al rol, consulte [Recuperar credenciales de seguridad de los metadatos de la instancia](instance-metadata-security-credentials.md).

Si experimenta limitaciones controladas al acceder a IMDS, vuelva a realizar la consulta con una estrategia de retroceso exponencial.

# Uso del servicio de metadatos de instancias para acceder a metadatos de instancia
<a name="configuring-instance-metadata-service"></a>

Para acceder a los metadatos de instancia desde una instancia en ejecución puede utilizar uno de los métodos siguientes:
+ Servicio de metadatos de instancia, versión 2 (IMDSv2): un método orientado a la sesión

  Para ver ejemplos, consulte [Ejemplos de IMDSv2](#instance-metadata-retrieval-examples).
+ Servicio de metadatos de instancia, versión 1 (IMDSv1): un método de solicitud y respuesta

  Para ver ejemplos, consulte [Ejemplos de IMDSv1](#instance-metadata-retrieval-examples-imdsv1).

De forma predeterminada, puede usar IMDSv1 o IMDSv2, o ambos.

Puede configurar el servicio de metadatos de instancias (IMDS) en cada instancia para que solo acepte llamadas a IMDSv2, lo que provocará un error en las llamadas a IMDSv1. Para obtener información acerca de cómo configurar la instancia para usar IMDSv2, consulte [Configuración de las opciones del servicio de metadatos de instancias](configuring-instance-metadata-options.md).

Los encabezados `PUT` o `GET` son exclusivos de IMDSv2. Si estas cabeceras están presentes en la solicitud, entonces la solicitud está destinada a IMDSv2. Si no hay encabezados, se supone que la solicitud está destinada a IMDSv1.

Para obtener más información, consulte [Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Service](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/) (Agregar defensa en profundidad contra firewalls abiertos, proxies inversos y vulnerabilidades SSRF con mejoras en el servicio de metadatos de instancias de EC2).

**Topics**
+ [Funcionamiento de Servicio de metadatos de instancia versión 2](#instance-metadata-v2-how-it-works)
+ [Uso de un AWS SDK compatible](#use-a-supported-sdk-version-for-imdsv2)
+ [Ejemplos de IMDSv2](#instance-metadata-retrieval-examples)
+ [Ejemplos de IMDSv1](#instance-metadata-retrieval-examples-imdsv1)

## Funcionamiento de Servicio de metadatos de instancia versión 2
<a name="instance-metadata-v2-how-it-works"></a>

IMDSv2 usa las solicitudes orientadas a la sesión. Las solicitudes orientadas a la sesión permiten crear un token de sesión que define la duración de la sesión, que puede ser de mínimo un segundo a un máximo de seis horas. En esa duración, puede utilizar el mismo token de sesión para solicitudes subsiguientes. Cuando la duración llegue a su fin, deberá crear un token de sesión nuevo para utilizarlo en las solicitudes futuras.

**nota**  
En los ejemplos de esta sección, se utiliza la dirección IPv4 del servicio de metadatos de instancia (IMDS): `169.254.169.254`. Si recupera metadatos de instancia para las instancias de EC2 a través de la dirección IPv6, asegúrese de habilitar y utilizar la dirección IPv6 en su lugar: `[fd00:ec2::254]`. La dirección IPv6 de IMDS es compatible con los comandos de IMDSv2. Solo se puede acceder a la dirección IPv6 con [instancias basadas en Nitro](instance-types.md#instance-hypervisor-type) en una [subred compatible con IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range) (de doble pila o solo IPv6).

En los siguientes ejemplos se usa un script de intérprete de comandos e IMDSv2 para recuperar los elementos de metadatos de instancias de nivel superior. Cada ejemplo:
+ Crea un token de sesión que dura seis horas (21 600 segundos) con la solicitud `PUT`
+ Almacena el encabezado del token de sesión en una variable denominada `TOKEN` (instancias de Linux) o `token` (instancias de Windows)
+ Solicita los elementos de metadatos de nivel superior con el token

### Ejemplo de Linux
<a name="how-imdsv2-works-example-linux"></a>

Puede ejecutar dos comandos separados o combinarlos.

**Comandos separados**

Primero, genere un token con el siguiente comando.

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
```

A continuación, utilice el token para generar elementos de metadatos de nivel superior mediante el siguiente comando.

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
```

**Comandos combinados**

Puede almacenar el token y combinar los comandos. En el siguiente ejemplo se combinan los dos comandos anteriores y se almacena el encabezado del token de sesión en una variable denominada TOKEN.

**nota**  
Si hay un error al crear el token, en lugar de un token válido, se almacena un mensaje de error en la variable y el comando no funcionará.

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
	&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
```

Después de crear un token, puede volverlo a usar hasta que venza. En el siguiente comando de ejemplo, que toma el ID de la AMI utilizada para lanzar la instancia, se vuelve a utilizar el token que se almacena en `$TOKEN` en el ejemplo anterior.

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id
```

### Ejemplo de Windows
<a name="how-imdsv2-works-example-windows"></a>

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
```

Después de crear un token, puede volverlo a usar hasta que venza. En el siguiente comando de ejemplo, que toma el ID de la AMI utilizada para lanzar la instancia, se vuelve a utilizar el token que se almacena en `$token` en el ejemplo anterior.

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} `
	-Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
```

Al utilizar IMDSv2 para solicitar metadatos de instancia, la solicitud debe incluir lo siguiente:

1. Use una solicitud `PUT` para iniciar una sesión en el servicio de metadatos de instancia. La solicitud `PUT` devuelve un token que debe incluirse en las solicitudes `GET` subsiguientes del servicio de metadatos de instancia. El token debe acceder a los metadatos con IMDSv2.

1. Incluya el token en todas las solicitudes `GET` en IMDS. Cuando el uso del token se establece en `required`, las solicitudes sin un token válido o con un token que ha vencido reciben un código de error HTTP `401 - Unauthorized`.
   + El token es una clave específica de la instancia. El token no es válido en otras instancias de EC2 y se rechazará si intenta usarlo fuera de la instancia en la que se generó.
   + La solicitud `PUT` debe incluir un encabezado que especifique el tiempo de vida (TTL) del token, en segundos, de un máximo de seis horas (21 600 segundos). El token representa una sesión lógica. El TTL especifica el período de tiempo que es válido el token y, en consecuencia, la duración de la sesión.
   + Cuando un token caduca, para poder seguir accediendo a los metadatos de instancia hay que crear una sesión nueva con otro `PUT`.
   + Puede escoger entre volver a utilizar un token o crear uno nuevo con cada solicitud. Para una cantidad pequeña de solicitudes, puede ser más sencillo generar y usar inmediatamente un token cada vez que necesite acceder a IMDS. Pero para ser más eficientes, puede especificar una duración más larga para el token y volver a usarlo en vez de escribir una solicitud `PUT` cada vez que tenga que solicitar metadatos de instancia. No existe ningún límite práctico en cuanto a la cantidad de tokens simultáneos, cada uno de los cuales representa su propia sesión. Sin embargo, IMDSv2 sigue limitado por la conexión normal de IMDS y la limitación controlada. Para obtener más información, consulte [Limitación de consultas](instancedata-data-retrieval.md#instancedata-throttling).

Los métodos HTTP `GET` y `HEAD` están permitidos en las solicitudes de metadatos de instancia IMDSv2. Las solicitudes `PUT` se rechazan si contienen un encabezado X-Forwarded-For.

De forma predeterminada, la respuesta a las solicitudes `PUT` tiene un límite de saltos de respuesta (tiempo de vida) de `1` en el nivel del protocolo IP. Si necesita un límite de saltos mayor, puede ajustarlo con el comando [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) de AWS CLI. Por ejemplo, puede necesitar un límite de saltos mayor para una compatibilidad con versiones anteriores con servicios de contenedor ejecutándose en la instancia. Para obtener más información, consulte [Configurar las opciones de metadatos para instancias existentes](configuring-IMDS-existing-instances.md).

## Uso de un AWS SDK compatible
<a name="use-a-supported-sdk-version-for-imdsv2"></a>

Para usar IMDSv2, las instancias de EC2 deben usar una versión de AWS SDK que admita el uso de IMDSv2. Las últimas versiones de todos los SDK de AWS son compatibles con IMDSv2.

**importante**  
Le recomendamos que se mantenga al día con las versiones del SDK para estar al tanto de las características, las actualizaciones de seguridad y las dependencias subyacentes más recientes. No se recomienda el uso continuo de una versión del SDK no admitida, hágalo según su criterio. Para obtener más información, consulte [Política de mantenimiento de SDK y herramientas de AWS](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) en la *Guía de referencia de SDK y herramientas de AWS*.

Las siguientes son las versiones mínimas que admiten el uso de IMDSv2:
+ [AWS CLI](https://github.com/aws/aws-cli): 1.16.289
+ [AWS Tools for Windows PowerShell](https://github.com/aws/aws-tools-for-powershell)— 4.0.1.0
+ [AWS SDK para .NET](https://github.com/aws/aws-sdk-net): 3.3.634.1
+ [AWS SDK para C\$1\$1](https://github.com/aws/aws-sdk-cpp): 1.7.229
+ [AWS SDK para Go](https://github.com/aws/aws-sdk-go): 1.25.38
+ [AWS SDK para Go v2](https://github.com/aws/aws-sdk-go-v2) – 0.19.0
+ [AWS SDK para Java](https://github.com/aws/aws-sdk-java): 1.11.678
+ [AWS SDK for Java 2.x](https://github.com/aws/aws-sdk-java-v2): 2.10.21
+ [AWS SDK para JavaScript en Node.js](https://github.com/aws/aws-sdk-js) – 2.722.0
+ [AWS SDK para Kotlin](https://github.com/awslabs/aws-sdk-kotlin): 1.1.4
+ [AWS SDK para PHP](https://github.com/aws/aws-sdk-php): 3.147.7
+ [AWS SDK para Python (Botocore)](https://github.com/boto/botocore) – 1.13.25
+ [AWS SDK para Python (Boto3)](https://github.com/boto/boto3): 1.12.6
+ [AWS SDK para Ruby](https://github.com/aws/aws-sdk-ruby): 3.79.0

## Ejemplos de IMDSv2
<a name="instance-metadata-retrieval-examples"></a>

Ejecute los siguientes ejemplos en su instancia de Amazon EC2 para recuperar los metadatos de la instancia para IMDSv2.

En las instancias de Windows, se puede usar Windows PowerShell o instalar cURL o wget. Si se instala una herramienta de terceros en una instancia de Windows, asegúrese de leer detenidamente la documentación asociada, ya que las llamadas y el formato de salida pueden ser distintos a lo que se indica aquí.

**Topics**
+ [Obtener las versiones disponibles de los metadatos de instancia](#instance-metadata-ex-1)
+ [Obtener los elementos de metadatos del nivel superior](#instance-metadata-ex-2)
+ [Cómo obtener los valores de los elementos de metadatos](#instance-metadata-ex-2a)
+ [Obtener la lista de claves públicas disponibles](#instance-metadata-ex-3)
+ [Mostrar los formatos en los que se encuentra disponible la clave pública 0](#instance-metadata-ex-4)
+ [Obtener la clave pública 0 (en formato de clave OpenSSH)](#instance-metadata-ex-5)
+ [Obtener el ID de subred de una instancia](#instance-metadata-ex-6)
+ [Obtener las etiquetas de instancia de una instancia](#instance-metadata-ex-7)

### Obtener las versiones disponibles de los metadatos de instancia
<a name="instance-metadata-ex-1"></a>

Este ejemplo obtiene las versiones disponibles de los metadatos de la instancia. Cada versión hace referencia a una compilación de metadatos de instancia correspondiente al momento en que se publicaron nuevas categorías de metadatos de instancia. No existe una correlación entre las versiones de compilación de metadatos de instancia y las versiones de la API de Amazon EC2. Tiene disponibles las versiones anteriores en caso de que tenga scripts que se basen en la estructura y la información presente en la versión anterior.

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------

### Obtener los elementos de metadatos del nivel superior
<a name="instance-metadata-ex-2"></a>

Este ejemplo obtiene los elementos de metadatos del nivel superior. Para obtener más información sobre los elementos en la respuesta, consulte [Categorías de metadatos de instancia](ec2-instance-metadata.md#instancedata-data-categories).

Tenga en cuenta que se incluyen las etiquetas en este resultado solo si ha permitido el acceso. Para obtener más información, consulte [Habilitación del acceso a etiquetas en metadatos de instancia](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS).

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
iam/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
iam/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------

### Cómo obtener los valores de los elementos de metadatos
<a name="instance-metadata-ex-2a"></a>

En estos ejemplos se obtienen los valores de algunos elementos de metadatos de nivel superior del ejemplo anterior. Estas solicitudes usan el token almacenado creado mediante el comando del ejemplo anterior. El token no debe estar vencido.

------
#### [ cURL ]

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------

### Obtener la lista de claves públicas disponibles
<a name="instance-metadata-ex-3"></a>

Este ejemplo obtiene la lista de las claves públicas disponibles.

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------

### Mostrar los formatos en los que se encuentra disponible la clave pública 0
<a name="instance-metadata-ex-4"></a>

Este ejemplo muestra los formatos en los que se encuentra disponible la clave pública 0.

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
openssh-key
```

------

### Obtener la clave pública 0 (en formato de clave OpenSSH)
<a name="instance-metadata-ex-5"></a>

Este ejemplo obtiene la clave pública 0 (en formato de clave OpenSSH).

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------

### Obtener el ID de subred de una instancia
<a name="instance-metadata-ex-6"></a>

Este ejemplo obtiene el ID de subred de una instancia.

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------

### Obtener las etiquetas de instancia de una instancia
<a name="instance-metadata-ex-7"></a>

Si el acceso a las etiquetas de la instancia en los metadatos de instancia está encendido, puede obtener las etiquetas para una instancia de los metadatos de instancia. Para obtener más información, consulte [Recuperar etiquetas desde los metadatos de instancia](work-with-tags-in-IMDS.md#retrieve-tags-from-IMDS).

## Ejemplos de IMDSv1
<a name="instance-metadata-retrieval-examples-imdsv1"></a>

Ejecute los siguientes ejemplos en su instancia de Amazon EC2 para recuperar los metadatos de la instancia para IMDSv1.

En las instancias de Windows, se puede usar Windows PowerShell o instalar cURL o wget. Si se instala una herramienta de terceros en una instancia de Windows, asegúrese de leer detenidamente la documentación asociada, ya que las llamadas y el formato de salida pueden ser distintos a lo que se indica aquí.

**Topics**
+ [Obtener las versiones disponibles de los metadatos de instancia](#instance-metadata-ex-1-imdsv1)
+ [Obtener los elementos de metadatos del nivel superior](#instance-metadata-ex-2-imdsv1)
+ [Cómo obtener los valores de los elementos de metadatos](#instance-metadata-ex-2a-imdsv1)
+ [Obtener la lista de claves públicas disponibles](#instance-metadata-ex-3-imdsv1)
+ [Mostrar los formatos en los que se encuentra disponible la clave pública 0](#instance-metadata-ex-4-imdsv1)
+ [Obtener la clave pública 0 (en formato de clave OpenSSH)](#instance-metadata-ex-5-imdsv1)
+ [Obtener el ID de subred de una instancia](#instance-metadata-ex-6-imdsv1)
+ [Obtener las etiquetas de instancia de una instancia](#instance-metadata-ex-7-imdsv1)

### Obtener las versiones disponibles de los metadatos de instancia
<a name="instance-metadata-ex-1-imdsv1"></a>

Este ejemplo obtiene las versiones disponibles de los metadatos de la instancia. Cada versión hace referencia a una compilación de metadatos de instancia correspondiente al momento en que se publicaron nuevas categorías de metadatos de instancia. No existe una correlación entre las versiones de compilación de metadatos de instancia y las versiones de la API de Amazon EC2. Tiene disponibles las versiones anteriores en caso de que tenga scripts que se basen en la estructura y la información presente en la versión anterior.

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------

### Obtener los elementos de metadatos del nivel superior
<a name="instance-metadata-ex-2-imdsv1"></a>

Este ejemplo obtiene los elementos de metadatos del nivel superior. Para obtener más información sobre los elementos en la respuesta, consulte [Categorías de metadatos de instancia](ec2-instance-metadata.md#instancedata-data-categories).

Tenga en cuenta que se incluyen las etiquetas en este resultado solo si ha permitido el acceso. Para obtener más información, consulte [Habilitación del acceso a etiquetas en metadatos de instancia](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS).

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
iam/
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
iam/
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------

### Cómo obtener los valores de los elementos de metadatos
<a name="instance-metadata-ex-2a-imdsv1"></a>

En estos ejemplos se obtienen los valores de algunos elementos de metadatos de nivel superior del ejemplo anterior.

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------

### Obtener la lista de claves públicas disponibles
<a name="instance-metadata-ex-3-imdsv1"></a>

Este ejemplo obtiene la lista de las claves públicas disponibles.

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
```

------

### Mostrar los formatos en los que se encuentra disponible la clave pública 0
<a name="instance-metadata-ex-4-imdsv1"></a>

Este ejemplo muestra los formatos en los que se encuentra disponible la clave pública 0.

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
openssh-key
```

------

### Obtener la clave pública 0 (en formato de clave OpenSSH)
<a name="instance-metadata-ex-5-imdsv1"></a>

Este ejemplo obtiene la clave pública 0 (en formato de clave OpenSSH).

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------

### Obtener el ID de subred de una instancia
<a name="instance-metadata-ex-6-imdsv1"></a>

Este ejemplo obtiene el ID de subred de una instancia.

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------

### Obtener las etiquetas de instancia de una instancia
<a name="instance-metadata-ex-7-imdsv1"></a>

Si el acceso a las etiquetas de la instancia en los metadatos de instancia está encendido, puede obtener las etiquetas para una instancia de los metadatos de instancia. Para obtener más información, consulte [Recuperar etiquetas desde los metadatos de instancia](work-with-tags-in-IMDS.md#retrieve-tags-from-IMDS).

# Transición al uso de Servicio de metadatos de instancia, versión 2
<a name="instance-metadata-transition-to-version-2"></a>

Si desea configurar las instancias para que solo acepten las llamadas del servicio de metadatos de instancias versión 2 (IMDSv2), recomendamos que utilice las siguientes herramientas y la ruta de transición.

**Topics**
+ [Herramientas para la transición a IMDSv2](#tools-for-transitioning-to-imdsv2)
+ [Ruta recomendada para exigir IMDSv2](#recommended-path-for-requiring-imdsv2)

## Herramientas para la transición a IMDSv2
<a name="tools-for-transitioning-to-imdsv2"></a>

Las siguientes herramientas permiten identificar, supervisar y administrar la transición del software del IMDSv1 al IMDSv2. Para obtener instrucciones sobre cómo utilizar estas herramientas, consulte [Ruta recomendada para exigir IMDSv2](#recommended-path-for-requiring-imdsv2).

**AWS Software de**  
Las últimas versiones de los SDK AWS CLI y AWS son compatibles con IMDSv2. Para utilizar IMDSv2, actualice las instancias de EC2 para hacer uso de las versiones más recientes. Para conocer las versiones mínimas del AWS SDK compatibles con IMDSv2, consulte [Uso de un AWS SDK compatible](configuring-instance-metadata-service.md#use-a-supported-sdk-version-for-imdsv2).  
Todos los paquetes de software de Amazon Linux 2 y Amazon Linux 2023 son compatibles con IMDSv2. Amazon Linux 2023 deshabilita IMDSv1 de forma predeterminada.

**Analizador de paquetes IMDS**  
El analizador de paquetes IMDS es una herramienta de código abierto que identifica y registra las llamadas de IMDSv1 durante la fase de arranque y las operaciones del tiempo de ejecución de la instancia. Con el análisis de estos registros, puede identificar con precisión el software que realiza las llamadas a IMDSv1 en las instancias y determinar qué se debe actualizar para que solo sea compatible con IMDSv2 en las instancias. Puede ejecutar IMDS Packet Analyzer desde una línea de comandos o instalarlo como un servicio. Para obtener más información, consulte [AWS ImdsPacketAnalyzer](https://github.com/aws/aws-imds-packet-analyzer) en *GitHub*.

**CloudWatch**  
CloudWatch ofrece las dos siguientes métricas para supervisar las instancias:  
`MetadataNoToken`: IMDSv2 utiliza sesiones respaldadas por tokens, mientras que IMDSv1 no. La métrica `MetadataNoToken` realiza un seguimiento del número de llamadas al servicio de metadatos de instancia (IMDS) que están utilizando IMDSv1. Al seguir esta métrica hasta cero, puede determinar si y cuándo se ha actualizado el software para utilizar IMDSv2.  
`MetadataNoTokenRejected`: Tras inhabilitar IMDSv1, puede usar la métrica `MetadataNoTokenRejected` para hacer un seguimiento del número de veces que se intentó y rechazó una llamada de IMDSv1. Al seguir esta métrica, puede determinar si es necesario actualizar el software para utilizar IMDSv2.  
Para cada instancia de EC2, estas métricas se excluyen mutuamente. Cuando IMDSv1 está activado (`httpTokens = optional`), solo emite `MetadataNoToken`. Cuando IMDSv1 está deshabilitado (`httpTokens = required`), solo emite `MetadataNoTokenRejected`. Para saber cuándo usar estas métricas, consulte [Ruta recomendada para exigir IMDSv2](#recommended-path-for-requiring-imdsv2).  
Para obtener más información, consulte [Métricas de la instancia](viewing_metrics_with_cloudwatch.md#ec2-cloudwatch-metrics).

**Lanzamiento de las API**  
**Instancias nuevas:** Utilice la API [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) para lanzar instancias nuevas que exijan el uso de IMDSv2. Para obtener más información, consulte [Configurar las opciones de metadatos para instancias nuevas](configuring-IMDS-new-instances.md).  
**Instancias existentes:** Utilice la API [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) para exigir el uso de IMDSv2 en las instancias existentes. Para obtener más información, consulte [Configurar las opciones de metadatos para instancias existentes](configuring-IMDS-existing-instances.md).  
**Instancias nuevas lanzadas por los grupos de escalado automático:** Para requerir el uso de IMDSv2 en todas las instancias nuevas lanzadas por grupos de escalado automático, los cuales pueden utilizar una plantilla de lanzamiento o una configuración de lanzamiento. Al [crear una plantilla de inicialización](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html) o [crear una configuración de inicialización](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/create-launch-configuration.html), debe configurar los parámetros `MetadataOptions` para requerir el uso de IMDSv2. El grupo de escalado automático inicia nuevas instancias con la nueva plantilla de inicialización o la configuración de inicialización, pero las instancias existentes no resultan afectadas.   
**Instancias existentes en un grupo de escalado automático:** Utilice la API [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) para exigir el uso de IMDSv2 en las instancias existentes o terminar las instancias, y el grupo de escalado automático lanzará nuevas instancias de sustitución con la configuración de las opciones de metadatos de la instancia definida en la plantilla de lanzamiento o en la configuración de lanzamiento.

**AMI de**  
Las AMI configuradas con el parámetro `ImdsSupport` establecido en `v2.0`, por defecto, lanzarán las instancias que exigen IMDSv2. Amazon Linux 2023 está configurado con `ImdsSupport = v2.0`.  
**AMI nuevas:** Utilice el comando CLI [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) para establecer el parámetro `ImdsSupport` en `v2.0` al crear una AMI nueva.  
**AMI existentes:** Utilice el comando CLI [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) para establecer el parámetro `ImdsSupport` en `v2.0` al modificar una AMI existente.  
Para obtener más información, consulte [Configuración de la AMI](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-ami-configuration).

**Controles a nivel de cuenta**  
Puede establecer valores predeterminados para las opciones de metadatos de instancia a nivel de cuenta. Los valores predeterminados se aplican automáticamente al lanzar una instancia. Para obtener más información, consulte [Ajuste de IMDSv2 como valor predeterminado de la cuenta](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults).  
También puede hacer cumplir el requisito de usar IMDSv2 a nivel de cuenta. Cuando la aplicación de IMDSv2 está habilitada:  
+ **Instancias nuevas:** las instancias configuradas para lanzarse con IMDSv1 activado no se iniciarán
+ **Instancias existentes con IMDSv1 deshabilitado:** se impedirán los intentos de habilitar IMDSv1 en las instancias existentes.
+ **Instancias existentes con IMDSv1 activado:** las instancias existentes con IMDSv1 ya activado no se verán afectadas.
Para obtener más información, consulte [Aplicar IMDSv2 a nivel de cuenta](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level).

**Políticas de IAM y SCP**  
Puede utilizar una política de IAM o una política de control de servicio (SCP) AWS Organizations para controlar a los usuarios de IAM de la siguiente forma:  
+ No se puede iniciar una instancia con la API [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html), a menos que la instancia esté configurada para usar IMDSv2.
+ No se puede modificar una instancia existente mediante la API [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) para volver a habilitar IMDSv1.
La política de IAM o SCP debe contener las siguientes claves de condición de IAM:  
+ `ec2:MetadataHttpEndpoint`
+ `ec2:MetadataHttpPutResponseHopLimit`
+ `ec2:MetadataHttpTokens`
Si un parámetro en la llamada API o CLI no coincide con el estado especificado en la política que contiene la clave de condición, la llamada API o CLI falla con una respuesta `UnauthorizedOperation`.  
Además, puede elegir una capa de protección adicional para forzar el cambio de IMDSv1 a IMDSv2. En la capa de administración de acceso, en relación con las API que se han llamado con credenciales de rol de EC2, puede usar una clave de condición en políticas de IAM o políticas de control de servicios (SCP) de AWS Organizations. En específico, al usar la clave de condición de política `ec2:RoleDelivery` con un valor `2.0` en las políticas de IAM, las llamadas a la API realizadas con credenciales de rol de EC2 que se han obtenido de IMDSv1 recibirán la respuesta `UnauthorizedOperation`. Se puede conseguir lo mismo de forma más extensa si dicha condición la exige una SCP. De esta manera se logra que las credenciales proporcionadas mediante IMDSv1 no se puedan usar para llamar a las API porque cualquier llamada a la API que no cumpla la condición especificada recibirá un error `UnauthorizedOperation`.  
Para ver ejemplos de políticas de IAM, consulte [Trabajar con metadatos de instancias](ExamplePolicies_EC2.md#iam-example-instance-metadata). Para obtener más información sobre las SCP, consulte [Políticas de control de servicios](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) en la *Guía del usuario de AWS Organizations*.

**Políticas declarativas**  
Utilice las políticas declarativas (una característica de AWS Organizations) para configurar de forma predeterminada la cuenta de IMDS, incluida la aplicación de IMDSv2, en toda la organización. Para ver un ejemplo de política, consulte la pestaña **Metadatos de las instancias** en la sección [Políticas declarativas compatibles](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples) de la *Guía del usuario de AWS Organizations*.

## Ruta recomendada para exigir IMDSv2
<a name="recommended-path-for-requiring-imdsv2"></a>

**Topics**
+ [Paso 1: Identificar las instancias con IMDSv2=optional y auditar el uso de IMDSv1](#path-step-1)
+ [Paso 2: Actualizar el software a IMDSv2](#path-step-2)
+ [Paso 3: Requerir IMDSv2 en las instancias](#path-step-3)
+ [Paso 4: Establecer IMDSv2=required como predeterminado](#path-step-4)
+ [Paso 5: Aplicar las instancias que requieran IMDSv2](#path-step-5)

### Paso 1: Identificar las instancias con IMDSv2=optional y auditar el uso de IMDSv1
<a name="path-step-1"></a>

Para evaluar el alcance de la migración a IMDSv2, identifique las instancias que estén configuradas para permitir IMDSv1 o IMDSv2 y audite las llamadas a IMDSv1.

1. **Cómo identificar las instancias que están configuradas para permitir IMDSv1 o IMDSv2:**

------
#### [ Amazon EC2 console ]

   1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

   1. En el panel de navegación, seleccione **Instances (Instancias)**.

   1. Para ver solo las instancias configuradas para permitir IMDSv1 o IMDSv2, agregue el filtro **IMDSv2 = optional**.

   1. Como alternativa, para ver si IMDSv2 es **opcional** u **obligatorio** para todas las instancias, abra la ventana de **Preferencias** (icono de engranaje), active **IMDSv2** y seleccione **Confirmar**. Esto agrega la columna **IMDSv2** a la tabla de **Instancias**.

------
#### [ AWS CLI ]

   Utilice el comando [describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) y filtre por `metadata-options.http-tokens = optional`, de la siguiente manera:

   ```
   aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
   ```

------

1. **Cómo auditar las llamadas de IMDSv1 en cada instancia:**

   Utilice la métrica de CloudWatch `MetadataNoToken`. Esta métrica muestra la cantidad de llamadas de IMDSv1 a IMDS de las instancias. Para obtener más información, consulte [Métricas de instancia](https://docs.aws.amazon.com/en_us/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ec2-cloudwatch-metrics).

1. **Cómo identificar el software de las instancias que realizan llamadas a IMDSv1:**

   Utilice el [analizador de paquetes IMDS](https://github.com/aws/aws-imds-packet-analyzer) de código abierto para identificar y registrar las llamadas a IMDSv1 durante la fase de arranque y las operaciones de tiempo de ejecución de la instancia. Con esta información, puede identificar el software que se va a actualizar para que las instancias estén listas para utilizarse únicamente con IMDSv2. Puede ejecutar IMDS Packet Analyzer desde una línea de comandos o instalarlo como un servicio.

### Paso 2: Actualizar el software a IMDSv2
<a name="path-step-2"></a>

Actualice todos los SDK, las CLI y el software que usen credenciales de rol en sus instancias a las versiones compatibles con IMDSv2. Para obtener más información sobre la actualización de la CLI, consulte [Instalación o actualización a la versión más reciente de la AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) en la *Guía del usuario de AWS Command Line Interface*.

### Paso 3: Requerir IMDSv2 en las instancias
<a name="path-step-3"></a>

Tras confirmar que no hubo llamadas de IMDSv1 mediante la métrica `MetadataNoToken`, configure las instancias existentes para que requieran IMDSv2. Además, configure todas las instancias nuevas para que requieran IMDSv2. Es decir, deshabilite IMDSv1 en todas las instancias nuevas y existentes.

1. **Cómo configurar las instancias existentes para que requieran IMDSv2:**

------
#### [ Amazon EC2 console ]

   1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

   1. En el panel de navegación, seleccione **Instances (Instancias)**.

   1. Seleccione la instancia.

   1. Elija **Acciones**, **Configuración de la instancia** y **Modificar opciones de metadatos de instancia**.

   1. En **IMDSv2**, seleccione **Obligatorio**.

   1. Seleccione **Save**.

------
#### [ AWS CLI ]

   Utilice el comando de la CLI [modify-instance-metadata-options](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) para especificar que solo se debe utilizar IMDSv2. 

------
**nota**  
Modifique esta configuración en las instancias en ejecución. El cambio se aplica de inmediato sin necesidad de reiniciar la instancia.

   Para obtener más información, consulte [Requerir el uso de IMDSv2](configuring-IMDS-existing-instances.md#modify-require-IMDSv2).

1. **Cómo controlar los problemas después de deshabilitar IMDSv1:**

   1. Realice un seguimiento del número de veces que se intentó realizar una llamada de IMDSv1 y se rechazó con la métrica de CloudWatch `MetadataNoTokenRejected`.

   1. Si la métrica `MetadataNoTokenRejected` registra las llamadas de IMDSv1 a una instancia que tiene problemas de software, esto indica que es necesario actualizar el software para poder utilizar IMDSv2.

1. **Cómo configurar las nuevas instancias para que requieran IMDSv2:**

------
#### [ Amazon EC2 console ]

   1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

   1. Siga estos pasos para [lanzar una instancia](ec2-launch-instance-wizard.md).

   1. Amplíe **Detalles avanzados** y, en **Versión de metadatos**, seleccione **Solo V2 (se requiere un token)**.

   1. En el panel **Resumen**, revise la configuración de la instancia y, a continuación, elija **Iniciar instancia**.

      Para obtener más información, consulte [Configuración de la instancia en el momento de la inicialización](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-instance-settings).

------
#### [ AWS CLI ]

   AWS CLI: use el comando [run-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) y especifique que solo se requiere IMDSv2.

------

### Paso 4: Establecer IMDSv2=required como predeterminado
<a name="path-step-4"></a>

Estableza IMDSv2=required como configuración predeterminada a nivel de cuenta o de organización. Esto garantiza que todas las instancias recién lanzadas se configuren automáticamente para que requieran IMDSv2.

1. **Cómo establecer el nivel de cuenta predeterminado:**

------
#### [ Amazon EC2 console ]

   1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

   1. En el panel de navegación, elija **Panel**.

   1. En la tarjeta **Atributos de cuenta**, en **Configuración**, elija **Protección y seguridad de datos**.

   1. En **Valores predeterminados de IMDS**, seleccione **Administrar**.

   1. En **Servicio de metadatos de instancia**, seleccione **Habilitado**.

   1. En **Versión de metadatos**, elija **Solo V2 (token obligatorio)**.

   1. Elija **Actualizar**.

------
#### [ AWS CLI ]

   Utilice el comando de la CLI [modify-instance-metadata-defaults](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-defaults.html) y especifique `--http-tokens required` y `--http-put-response-hop-limit 2`.

------

   Para obtener más información, consulte [Ajuste de IMDSv2 como valor predeterminado de la cuenta](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults).

1. **Como alternativa, establezca los valores predeterminados a nivel de organización mediante una política declarativa:**

   Utilice una política declarativa para establecer como obligatorio el valor predeterminado de la organización para IMDSv2. Para ver un ejemplo de política, consulte la pestaña **Metadatos de las instancias** en la sección [Políticas declarativas compatibles](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples) de la *Guía del usuario de AWS Organizations*.

### Paso 5: Aplicar las instancias que requieran IMDSv2
<a name="path-step-5"></a>

Una vez que haya confirmado que ninguna de sus instancias depende de IMDSv1, le recomendamos que aplique IMDSv2 en todas las instancias nuevas.

Utilice una de las opciones siguientes para aplicar IMDSv2:

1. **Aplica IMDSv2 con una propiedad de cuenta**

   Puede aplicar el uso de IMDSv2 a nivel de cuenta para cada Región de AWS. Cuando se aplican, las instancias solo se pueden lanzar si están configuradas para que exijan IMDSv2. Esta aplicación se aplica independientemente de cómo esté configurada la instancia o la AMI. Para obtener más información, consulte [Aplicar IMDSv2 a nivel de cuenta](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level). Para aplicar esta configuración a nivel de organización, defina una política declarativa. Para ver un ejemplo de política, consulte la pestaña **Metadatos de las instancias** en la sección [Políticas declarativas compatibles](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples) de la *Guía del usuario de AWS Organizations*.

   Para evitar que se revoque la aplicación, debe utilizar una política de IAM para impedir el acceso a la API [ModifyInstanceMetadataDefaults.](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html) Para obtener más información, consulte [Uso de una política de IAM](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-iam-policy).
**nota**  
Esta configuración no cambia la versión de IMDS de las instancias existentes, pero bloquea la activación de IMDSv1 en las instancias existentes que actualmente tienen inhabilitado IMDSv1.
**aviso**  
Si la aplicación de IMDSv2 está habilitada y `httpTokens` no está establecida en la configuración de la instancia `required` en el momento del lanzamiento, en la configuración de la cuenta o en la configuración de la AMI, el lanzamiento de la instancia fallará. Para obtener información sobre la resolución de problemas, consulte [Se produce un error al lanzar una instancia habilitada para IMDSv1](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails).

1. **Como alternativa, aplique IMDSv2 mediante las siguientes claves de condición de IAM o SCP:**
   + `ec2:MetadataHttpTokens`
   + `ec2:MetadataHttpPutResponseHopLimit`
   + `ec2:MetadataHttpEndpoint`

   Estas claves de condición controlan el uso de las API [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) y [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html), así como las CLI correspondientes. Si se crea una política y un parámetro en la llamada a la API no coincide con el estado especificado en la política que usa la clave de condición, la llamada a la API o a la CLI devolverá una respuesta de error `UnauthorizedOperation`.

   Para ver ejemplos de políticas de IAM, consulte [Trabajar con metadatos de instancias](ExamplePolicies_EC2.md#iam-example-instance-metadata).

# Limitación del acceso al servicio de metadatos de instancias
<a name="instance-metadata-limiting-access"></a>

Puede considerar la posibilidad de usar reglas de firewall locales para desactivar el acceso de algunos o todos los procesos al servicio de metadatos de instancias (IMDS).

En el caso de las [instancias basadas en Nitro](instance-types.md#instance-hypervisor-type), se puede acceder a IMDS desde su propia red cuando un dispositivo de red de la VPC, como un enrutador virtual, reenvía paquetes a la dirección de IMDS y la [comprobación de origen o destino](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck) predeterminada en la instancia se encuentra deshabilitada. Para evitar que un origen externo a la VPC llegue a IMDS, se recomienda modificar la configuración del dispositivo de red para eliminar los paquetes con la dirección IPv4 de destino de IMDS `169.254.169.254` y, si habilita el punto de conexión IPv6, la dirección IPv6 de IMDS `[fd00:ec2::254]`.

## Limitación del acceso a IMDS para instancias de Linux
<a name="instance-metadata-limiting-access-linux"></a>

**Uso de iptables para limitar el acceso**

En el siguiente ejemplo se usan iptables de Linux y su módulo `owner` para impedir que el webserver Apache (basado en el ID de usuario de instalación predeterminado de `apache`) acceda a 169.254.169.254. Usa una *regla de rechazo* para rechazar todas las solicitudes de metadatos de instancia (IMDSv1 o IMDSv2) de cualquier proceso que se ejecute con ese usuario.

```
$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner --uid-owner apache --jump REJECT
```

O, puede plantearse solo dar acceso a usuarios o grupos determinados, mediante el uso de *reglas de permiso*. Las reglas de permiso pueden ser más sencillas de administrar desde el punto de vista de la seguridad, ya que requieren que tome una decisión acerca del software que necesita acceso a los metadatos de instancia. Si usa *reglas de permiso*, es menos probable que permita al software de forma involuntaria acceder al servicio de metadatos (al que no pretendía dar acceso) si posteriormente cambia el software o la configuración en una instancia. También puede combinar el uso de grupos con reglas de permiso, de manera que pueda añadir y eliminar usuarios de un grupo permitido sin tener que cambiar la regla del firewall.

En el siguiente ejemplo se impide el acceso a IMDS a todos los procesos, excepto a aquellos que se ejecutan en la cuenta de usuario `trustworthy-user`.

```
$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner trustworthy-user --jump REJECT
```

**nota**  
Para usar reglas de firewall locales, debe adaptar los comandos de ejemplo anteriores para adaptarlos a sus necesidades. 
De forma predeterminada, las reglas iptables no persisten en los reinicios de sistema. Pueden convertirse en persistentes con el uso de funcionalidades del SO, que no se describen aquí.
El módulo `owner` de iptables solo coincide con la pertenencia a grupos si el grupo es el grupo principal de un usuario local determinado. Los otros grupos no coinciden.

**Uso de PF o IPFW para limitar el acceso**

Si usa FreeBSD u OpenBSD, también puede plantearse usar PF o IPFW. En los siguientes ejemplos se limita el acceso a IMDS a únicamente el usuario raíz.

**PF**

```
$ block out inet proto tcp from any to 169.254.169.254
```

```
$ pass out inet proto tcp from any to 169.254.169.254 user root
```

**IPFW**

```
$ allow tcp from any to 169.254.169.254 uid root
```

```
$ deny tcp from any to 169.254.169.254
```

**nota**  
El orden de los comandos PF e IPFW importa. El valor predeterminado de PF es la última regla coincidente y el de IPFW es la primera regla coincidente.

## Limitación del acceso a IMDS para instancias de Windows
<a name="instance-metadata-limiting-access-windows"></a>

**Uso del firewall de Windows para limitar el acceso**

El ejemplo de PowerShell utiliza el firewall integrado de Windows para impedir que el webserver Apache (basado en el ID de usuario de instalación predeterminado de `NT AUTHORITY\IUSR`) acceda a 169.254.169.254. Usa una *regla de rechazo* para rechazar todas las solicitudes de metadatos de instancia (IMDSv1 o IMDSv2) de cualquier proceso que se ejecute con ese usuario.

```
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("NT AUTHORITY\IUSR")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $BlockPrincipalSDDL = "D:(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service from IIS" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $BlockPrincipalSDDL
```

O, puede plantearse solo dar acceso a usuarios o grupos determinados, mediante el uso de *reglas de permiso*. Las reglas de permiso pueden ser más sencillas de administrar desde el punto de vista de la seguridad, ya que requieren que tome una decisión acerca del software que necesita acceso a los metadatos de instancia. Si usa *reglas de permiso*, es menos probable que permita al software de forma involuntaria acceder al servicio de metadatos (al que no pretendía dar acceso) si posteriormente cambia el software o la configuración en una instancia. También puede combinar el uso de grupos con reglas de permiso, de manera que pueda añadir y eliminar usuarios de un grupo permitido sin tener que cambiar la regla del firewall.

El siguiente ejemplo impide acceder a los metadatos de instancia a todos los procesos que se ejecutan como grupo de SO especificado en la variable `blockPrincipal` (en este ejemplo, el grupo Windows `Everyone`), excepto para los procesos especificados en `exceptionPrincipal` (en este ejemplo, un grupo denominado `trustworthy-users`). Debe especificar los dos principios de rechazo y de permiso porque el firewall de Windows, a diferencia de la regla `! --uid-owner trustworthy-user` en iptables de Linux, no proporciona un mecanismo abreviado para permitir solo un principal determinado (usuario o grupo) mediante el rechazo de los demás.

```
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("Everyone")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $exceptionPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("trustworthy-users")
PS C:\> $ExceptionPrincipalSID = $exceptionPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $PrincipalSDDL = "O:LSD:(D;;CC;;;$ExceptionPrincipalSID)(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service for $($blockPrincipal.Value), exception: $($exceptionPrincipal.Value)" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $PrincipalSDDL
```

**nota**  
Para usar reglas de firewall locales, debe adaptar los comandos de ejemplo anteriores para adaptarlos a sus necesidades. 

**Uso de las reglas netsh para limitar el acceso**

Puede plantearse bloquear todo el software con reglas `netsh` pero son menos flexibles.

```
C:\> netsh advfirewall firewall add rule name="Block metadata service altogether" dir=out protocol=TCP remoteip=169.254.169.254 action=block
```

**nota**  
Para usar reglas de firewall locales, debe adaptar los comandos de ejemplo anteriores para adaptarlos a sus necesidades. 
Las reglas `netsh` deben establecerse a partir de un símbolo del sistema elevado y no pueden fijarse para denegar o permitir determinados principales.