¿Cómo soluciono el error “The security token included in the request is expired” (El token de seguridad incluido en la solicitud ha caducado) cuando ejecuto aplicaciones Java en Amazon EC2?

Última actualización: 04-03-2021

Mis aplicaciones Java que utilizan AWS SDK para Java en una instancia de Amazon Elastic Compute Cloud (Amazon EC2) reciben una excepción similar a la siguiente:

com.amazonaws.AmazonServiceException: El token de seguridad incluido en la solicitud ha caducado (Servicio: AmazonSQS; Código de estado: 403; Código de error: ExpiredToken; Solicitud de ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

¿Cómo puedo solucionarlo?

Descripción corta

Todas las solicitudes de API de aplicaciones a Amazon Web Services (AWS) deben estar firmadas criptográficamente mediante el uso de credenciales emitidas por AWS.

Si su aplicación utiliza credenciales temporales al crear un cliente de AWS, las credenciales vencen en el intervalo de tiempo especificado durante su creación. Tiene que actualizar las credenciales antes de que caduquen.

Otro motivo de vencimiento es utilizar la hora incorrecta. Una referencia de tiempo coherente y precisa es crucial para muchas tareas y procesos del servidor. Si la fecha y la hora de su instancia no están configuradas correctamente, las credenciales de AWS se rechazan.

Si su aplicación se ejecuta en una instancia Amazon EC2, es una práctica recomendada utilizar un rol de AWS Identity and Access Management (IAM) asignado a la instancia. El uso de un rol de IAM permite el uso de un constructor de servicio predeterminado. El cliente constructor predeterminado busca las credenciales mediante el uso de la cadena de proveedores de credenciales predeterminado, en el siguiente orden:

  1. En las variables de entorno del sistema: AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY.
  2. En las propiedades del sistema Java: aws.accessKeyId y aws.secretKey.
  3. En el archivo de credenciales predeterminado (la ubicación de este archivo varía según la plataforma).
  4. En las credenciales del perfil de instancias contenidas en los metadatos de la instancia asociados al rol de IAM para la instancia EC2. Al adjuntar un perfil de instancias a su instancia, se agregan las credenciales del perfil de instancias a la cadena de proveedores de credenciales predeterminada. Para más información, consulte Uso de un rol de IAM para conceder permisos a aplicaciones que se ejecutan en instancias Amazon EC2.

Si las credenciales del perfil de instancias están disponibles, el constructor del cliente predeterminado crea una instancia de la clase AWS SDK InstanceProfileCredentialsProvider. AWS utiliza esta clase para firmar las solicitudes de API con credenciales de AWS mediante credenciales de seguridad temporales de Amazon EC2 metadatos de la instancia.

Importante: Si su aplicación utiliza la clase de AWS SDK ProfileCredentialsProvider para proporcionar credenciales temporales de AWS, es su responsabilidad verificar y actualizar las credenciales antes de que venzan. No verificar o actualizar las credenciales aumenta la probabilidad de fallos en la aplicación causados por errores ExpiredToken.

Resolución

Utilizar las fuentes de Amazon Time Sync Service o NTP

Configure Amazon Time Sync Service u otra fuente de Network Time Protocol (NTP) en su instancia Amazon EC2. De este modo, se asegura que su instancia de Linux tenga una referencia de tiempo coherente y precisa. Para obtener más información, consulte Configurar la hora para una instancia de Linux o Establecer la hora para una instancia de Windows.

Utilizar credenciales de AWS temporales y personalizadas

Actualice las credenciales temporales cinco minutos antes de su vencimiento.

Utilizar un rol de IAM asignado a una instancia

Adjunte un perfil de instancias a su instancia. Para obtener más información, consulte Uso de un rol de IAM para conceder permisos a aplicaciones que se ejecutan en instancias Amazon EC2. Verifique que no haya otras credenciales especificadas en su código o en la instancia. Las credenciales del perfil de instancias son el último lugar donde la cadena de proveedores de credenciales predeterminada busca las credenciales. Si tiene credenciales ubicadas en cualquier lugar anterior de la cadena de búsqueda, esas credenciales impiden que se utilice IAM. Para más información, consulte Uso de credenciales de AWS.

Para ver las credenciales de AWS de un rol de IAM adjunto a una instancia, ejecute los siguientes comandos desde un shell de Linux o desde Windows PowerShell (v3.0 o posterior). Asegúrese de sustituir examplerole por el nombre de su rol de IAM.

Linux

Utilice el comando curl para ver las credenciales de AWS:

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Este comando devuelve un resultado similar al siguiente:

{
    "Code" : "Success",
    "LastUpdated" : "2016-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2016-04-27T22:39:16Z"
}

Nota: Si la ejecución del comando curl anterior devuelve un error 404, verifique lo siguiente:

1.    Utilice el siguiente comando para verificar que el proxy HTTP esté desactivado para la dirección IP de los metadatos:

$ export NO_PROXY=169.254.169.254

2.    Verifique que la instancia no esté haciendo varias peticiones simultáneas y ejecutando varias sesiones en paralelo. Varias solicitudes simultáneas y varias sesiones que se ejecutan en paralelo pueden causar la limitación controlada por el servicio de metadatos de instancias (IMDS). Para mitigarlo, utilice la caché y los reintentos con retroceso exponencial. Como en cualquier servicio, las llamadas pueden fallar ocasionalmente. Se espera que los clientes vuelvan a intentarlo cuando esto ocurra. Para obtener más información, consulte Limitación de consultas.

Para implementar los reintentos, modifique AWS_METADATA_SERVICE_NUM_ATTEMPTS. Se pueden establecer opciones mediante variables de entorno, en el archivo ~/.aws/config o en la sesión de botocore del usuario. Para más información, consulte Configuración en el documento Boto3 DOCS 1.17.6.

Ejemplo:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    Si está ejecutando la prueba de curl en un contenedor docker, ajuste el instance-metadata-options http-put-response-hop-limit:

$ aws ec2 modify-instance-metadata-options --instance-id $(curl 169.254.169.254/latest/meta-data/instance-id) --http-put-response-hop-limit 2 --http-endpoint enabled

Para obtener más información, consulte Agregar defensa en profundidad contra firewall abiertos, proxies inversos y vulnerabilidades SSRF con mejoras en el servicio de metadatos de instancias EC2.

4.    Verifique que el perfil de instancias esté adjunto correctamente a la instancia.

Windows

Utilice el comando Invoke-RestMethod para ver las credenciales de AWS:

PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Este comando devuelve un resultado similar al siguiente:

Code            : Success
LastUpdated     : 2016-07-18T18:09:47Z
Type            : AWS-HMAC
AccessKeyId     : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token           : token
Expiration      : 2016-04-27T22:39:16Z

Utilice estos comandos para verificar las últimas credenciales temporales de la instancia. Estas credenciales rotan o se actualizan automáticamente aproximadamente cinco minutos antes del vencimiento de las credenciales temporales asignadas.

Información relacionada

Uso de credenciales de AWS (AWS SDK para Java)

Utilizar credenciales (AWS SDK para Java 2.0)

Roles de IAM para Amazon EC2

Configuración de roles de IAM para Amazon EC2 (Avanzado)


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?