¿Cómo soluciono el error “El token de seguridad incluido en la solicitud ha caducado” cuando ejecuto aplicaciones Java en Amazon EC2?

Última actualización: 4 de marzo de 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 (Service: AmazonSQS; Código de estado: 403; Código de error: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

¿Cómo puedo solucionar este problema?

Descripción corta

Todas las solicitudes de la API de la aplicación a Amazon Web Services (AWS) deben estar firmadas criptográficamente utilizando credenciales emitidas por AWS.

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

Otro motivo de vencimiento es usar 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 serán rechazadas.

Si su aplicación se ejecuta en una instancia de 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 credenciales utilizando la cadena de proveedores de credenciales predeterminada, 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 instancia adjuntados al rol de IAM de la instancia EC2. Al adjuntar un perfil de instancias a su instancia, se agregan credenciales de perfil de instancia a la cadena de proveedores de credenciales predeterminada. Para obtener más información, consulte Uso de un rol de IAM para conceder permisos a aplicaciones que se ejecutan en instancias de Amazon EC2.

Si hay credenciales de perfil de instancias disponibles, el constructor de cliente predeterminado crea una instancia de la clase AWS SDK InstanceProfileCredentialsProvider. AWS utiliza esta clase para firmar solicitudes de API con credenciales de AWS utilizando credenciales de seguridad temporales de los metadatos de instancias de Amazon EC2.

Importante: Si su aplicación utiliza la clase AWS SDK ProfileCredentialsProvider para proporcionar credenciales de AWS temporales, usted es responsable de verificar y actualizar las credenciales antes de que caduquen. No verificar o actualizar las credenciales aumenta la probabilidad de errores 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 Cómo establecer la hora de la instancia de Linux o Cómo establecer la hora de una instancia de Windows.

Utilizar credenciales de AWS temporales y personalizadas

Actualice las credenciales temporales cinco minutos antes de su vencimiento.

Utilice 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 de 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 obtener más información, consulte Trabajar con las credenciales de AWS.

Para ver las credenciales de AWS de un rol de IAM adjuntado a una instancia, ejecute los siguientes comandos desde un shell de Linux o desde Windows PowerShell (v3.0 o posterior). Asegúrese de reemplazar 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 comprobar que el proxy HTTP está desactivado para la dirección IP de 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 controlada de las consultas.

Para implementar los reintentos, modifique AWS_METADATA_SERVICE_NUM_ATTEMENTS. Se pueden establecer opciones mediante variables de entorno, en el archivo ~/.aws/config o en la sesión de botocore del usuario. Para obtener más información, consulte Configuración en la documentación de 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
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 cambian o se actualizan automáticamente unos cinco minutos antes de que venzan las credenciales temporales asignadas.

Información relacionada

Trabajar con credenciales de AWS (AWS SDK para Java)

Uso de 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?