Como resolvo o erro “O token de segurança incluído na solicitação expirou” quando executo aplicações Java no Amazon EC2?

5 minuto de leitura
0

Minhas aplicações Java que usam o AWS SDK para Java em uma instância do Amazon Elastic Compute Cloud (Amazon EC2) recebem o seguinte erro: “com.amazonaws.AmazonServiceException: O token de segurança incluído na solicitação expirou (Serviço: AmazonSQS; Código de status: 403; Código de erro: ExpiredToken; ID da solicitação: 12a345b6-78cd-901e-fg23-45hi67890jkl)”.

Breve descrição

A AWS exige que todas as solicitações de API da aplicação sejam assinadas digitalmente com as credenciais fornecidas pela AWS. Quando sua aplicação usa credenciais temporárias para criar um cliente da AWS, você deve renovar essas credenciais antes que elas expirem. Se suas credenciais expirarem, você receberá o erro O token de segurança incluído na solicitação expirou. Para resolver esse erro, verifique sua referência de hora, atualize as credenciais temporárias expiradas e, em seguida, verifique suas configurações do AWS Identity and Access Management (AWS IAM).

Resolução

Certifique-se de que sua instância tenha uma referência de hora consistente

As credenciais expiram se usarem a hora incorreta, portanto, certifique-se de que seu servidor esteja correto. Sua instância do EC2 deve ter uma referência de data e hora consistente e precisa. Configure o Amazon Time Sync Service ou outra fonte de Network Time Protocol (NTP) em sua instância. Para obter mais informações, consulte Alterar o fuso horário da sua instância.

Certifique-se de que suas credenciais temporárias não tenham expirado

Se você usar credenciais temporárias, certifique-se de que elas não tenham expirado. Se as credenciais temporárias expirarem, você deverá gerar um novo conjunto de credenciais temporárias e usá-las. É uma prática recomendada atualizar as credenciais temporárias cinco minutos antes de sua expiração.

Verifique sua configuração do IAM

Para aplicações executadas em uma instância do EC2, é uma prática recomendada usar um perfil do IAM atribuído à instância. Se você usa um perfil do IAM, verifique se sua configuração está configurada corretamente.

Com um perfil do IAM, um construtor de serviço padrão usa uma cadeia de provedores de credenciais padrão para pesquisar credenciais na seguinte ordem:

  1. Nas variáveis de ambiente do sistema AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.
  2. Nas propriedades do sistema Java aws.accessKeyId e aws.secretKey.
  3. No arquivo de credenciais padrão.
  4. Nas credenciais do perfil da instância nos metadados da instância associados ao perfil do IAM.

Para obter mais informações, consulte Usar um perfil do IAM para conceder permissões a aplicações executadas em instâncias do Amazon EC2.

Se você listar as credenciais em qualquer lugar, exceto no perfil da instância, o construtor padrão do cliente encontrará essas credenciais primeiro. Essa configuração bloqueia as credenciais do perfil do IAM. Para obter mais informações, consulte Fornecer credenciais temporárias para o AWS SDK para Java.

Para ver as credenciais do perfil do IAM, execute os seguintes comandos no Windows PowerShell versão 3.0 ou posterior ou em um shell Linux. Se você usar credenciais temporárias, os seguintes comandos do Windows e do Linux mostrarão as credenciais temporárias mais recentes da instância.

Observação: Nos comandos a seguir, substitua examplerole pelo nome do seu perfil do IAM.

Windows:

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

Você recebe uma saída semelhante à seguinte:

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

Linux:

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

Você recebe uma saída semelhante à seguinte:

{    "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"
}

Se você receber um erro 404 ao executar o comando curl anterior, verifique se o proxy HTTP está desativado para o endereço IP de metadados. Além disso, certifique-se de que o perfil da instância esteja anexado à instância.

Se o problema persistir, verifique se a instância não está fazendo várias solicitações simultâneas ou executando várias sessões em paralelo. Esse cenário pode fazer com que o Instance Metadata Service (IMDS) limite a consulta. Para mitigar esse problema, use o padrão de nova tentativa com recuo exponencial.

Para configurar novas tentativas, modifique AWS_METADATA_SERVICE_NUM_ATTEMPTS. Para definir opções, use variáveis de ambiente, o arquivo ~/.aws/config ou a sessão botocore do usuário. Para obter mais informações, consulte Configuração no site de documentação do Boto3.

Exemplo:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

Se você executar o comando curl em um contêiner do Docker, aumente o http-put-response-hop-limit para 2. Execute o seguinte comando modify-instance-metadata-options da AWS Command Line Interface (AWS CLI):

aws ec2 modify-instance-metadata-options --instance-id instance --http-put-response-hop-limit 2 --http-endpoint enabled

Observação: Substitua instance pelo ID da sua instância. Se você receber erros ao executar comandos da AWS CLI, consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Para obter mais informações, consulte Adicionar defesa aprofundada contra firewalls abertos, proxies reversos e vulnerabilidades de SSRF com aprimoramentos no EC2 Instance Metadata Service.

As credenciais de perfil são alternadas ou atualizadas automaticamente cinco minutos antes que as credenciais temporárias atribuídas expirem.

Informações relacionadas

Configurar a autenticação do SDK

Perfis do IAM para o Amazon EC2

AWS OFICIAL
AWS OFICIALAtualizada há 2 meses