Como corrijo o erro “The security token included in the request is expired” quando estiver executando aplicações Java no Amazon EC2?

Última atualização: 04/03/2021

Minhas aplicações Java que usam o AWS SDK para Java em uma instância do Amazon Elastic Compute Cloud (Amazon EC2) estão recebendo uma exceção semelhante à seguinte:

com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

Como resolvo isso?

Descrição breve

Todas as solicitações de API enviadas por aplicações à Amazon Web Services (AWS) precisam ser assinadas com criptografia usando as credenciais emitidas pela AWS.

Se a sua aplicação usar credenciais temporárias para criar um cliente da AWS, elas vão expirar no período especificado durante a criação. Atualize as credenciais antes que elas expirem.

O uso do formato de horário incorreto também pode causar a expiração. É fundamental usar uma referência de horário consistente e precisa para várias tarefas e processos do servidor. Se a data e o horário não estiverem definidos corretamente, as credenciais da AWS serão rejeitadas.

Caso a aplicação esteja em execução em uma instância do Amazon EC2, é recomendado usar uma função do AWS Identity and Access Management (IAM) atribuída à instância. O uso de uma função do IAM permite utilizar um criador-padrão de serviços. O cliente-padrão pesquisa credenciais usando a cadeia-padrão do provedor de credenciais na seguinte ordem:

  1. Nas variáveis do ambiente do sistema: AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.
  2. Nas propriedades do sistema Java: aws.accessKeyId and aws.secretKey.
  3. No arquivo-padrão de credenciais (o local dele varia de acordo com a plataforma).
  4. Nas credenciais do perfil de instância contidas nos metadados associados à função do IAM da instância do EC2. A associação de um perfil de instância à instância adiciona credenciais do perfil à cadeia-padrão do provedor de credenciais. Para obter mais informações, consulte Usar uma função do IAM para conceder permissões a aplicações em execução em instâncias do Amazon EC2.

Caso as credenciais do perfil de instância estejam disponíveis, o criador-padrão cliente vai gerar uma instância da classe InstanceProfileCredentialsProvider do AWS SDK. A AWS usa essa classe para assinar solicitações de API com credenciais da AWS utilizando credenciais temporárias de segurança dos metadados de instância do Amazon EC2.

Importante: Se a sua aplicação usa a classe ProfileCredentialsProvider do AWS SDK para fornecer credenciais temporárias da AWS, você é responsável por conferir e atualizar as credenciais antes que elas expirem. Caso você não faça isso, as chances de falhas da aplicação causadas por erros ExpiredToken aumentarão.

Resolução

Use o Amazon Time Sync Service ou fontes de NTP

Configure o Amazon Time Sync Service ou outra fonte de Network Time Protocol (NTP) na instância do Amazon EC2. Assim, você garante que a instância do Linux tenha uma referência de horário consistente e precisa. Para obter mais informações, consulte Definir o horário da instância do Linux ou Definir o horário de uma instância do Windows.

Use credenciais temporárias personalizadas da AWS

Atualize as credenciais temporárias cinco minutos antes de elas expirarem.

Use uma função do IAM atribuída a uma instância

Associe um perfil de instância à instância. Para obter mais informações, consulte Usar uma função do IAM para conceder permissões a aplicações em execução em instâncias do Amazon EC2. Verifique se não há outras credenciais especificadas no código ou na instância. As credenciais do perfil de instância são o último local consultado pela cadeia-padrão do provedor de credenciais. Caso existam credenciais localizadas em um local anterior da cadeia de pesquisa, elas impedirão que o IAM seja usado. Para obter mais informações, consulte Usar credenciais da AWS.

Para ver as credenciais da AWS de uma função do IAM associada a uma instância, execute os comandos a seguir em um shell do Linux ou no Windows PowerShell (v3.0 ou posterior). Lembre-se de substituir examplerole pelo nome da função do IAM.

Linux

Use o comando curl para ver as credenciais da AWS:

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

Esse comando exibirá 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"
}

Observação: se a execução desse comando curl exibir um erro 404, confira o seguinte:

1.    Use o seguinte comando para verificar se o proxy HTTP está desativado para o endereço IP dos metadados:

$ export NO_PROXY=169.254.169.254

2.    Confirme se a instância não está fazendo várias solicitações ao mesmo tempo e executando mais de uma sessão simultaneamente. Caso isso esteja ocorrendo, o Instance Metadata Service (IMDS) poderá acionar o controle de utilização. Para resolver isso, use o cache e novas tentativas com o recuo exponencial. Assim como em outros serviços, as chamadas podem falhar. É recomendado realizar novas tentativas quando isso ocorrer. Para obter mais informações, consulte Controle de utilização de consultas.

Para implementar novas tentativas, modifique AWS_METADATA_SERVICE_NUM_ATTEMPTS. É possível definir opções usando as variáveis do ambiente no arquivo ~/.aws/config ou na sessão botocore do usuário. Para obter mais informações, consulte Configuration (Configuração) na documentação do Boto3 DOCS 1.17.6.

Exemplo:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    Se você estiver realizando o teste curl em um contêiner docker, ajuste o valor 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 obter mais informações, consulte Adicionar defesa profunda contra firewalls abertos, proxies reversos e vulnerabilidades SSRF com melhorias no Instance Metadata Service do Amazon EC2.

4.    Verifique se o perfil de instância foi associado corretamente à instância.

Windows

Use o comando Invoke-RestMethod para ver as credenciais da AWS:

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

Esse comando exibirá uma saída semelhante à seguinte:

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

Use esses comandos para conferir as últimas credenciais temporárias da instância. Elas alternam ou são atualizadas automaticamente cerca de cinco minutos antes da expiração das credenciais temporárias atribuídas.

Informações relacionadas

Usar credenciais da AWS (AWS SDK para Java)

Usar credenciais (AWS SDK para Java 2.0)

Funções do IAM para o Amazon EC2

Configurar funções do IAM para o Amazon EC2 (avançado)


Este artigo foi útil?


Precisa de ajuda com faturamento ou suporte técnico?