Amazon EC2에서 Java 애플리케이션을 실행할 때 ‘The security token included in the request is expired’ 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 3월 4일

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 기반 Java용 AWS SDK를 사용하는 Java 애플리케이션에서 다음과 유사한 예외가 발생합니다.

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)

이를 해결하려면 어떻게 해야 하나요?

간략한 설명

AWS(Amazon Web Services)에 대한 모든 애플리케이션 API 요청은 AWS가 발급한 자격 증명을 이용해 암호화 서명되어야 합니다.

애플리케이션에서 AWS 클라이언트를 생성할 때 임시 자격 증명을 사용하는 경우 해당 자격 증명은 생성 중에 지정된 시간 간격으로 만료됩니다. 따라서 자격 증명이 만료되기 전에 새로 고쳐야 합니다.

시간을 잘못 지정한 경우에도 만료될 수 있습니다. 일관되고 정확한 시간 참조는 많은 서버 작업 및 프로세스에 있어서 매우 중요합니다. 인스턴스의 날짜 및 시간이 올바르게 설정되지 않은 경우 AWS 자격 증명이 거부됩니다.

애플리케이션이 Amazon EC2 인스턴스에서 실행 중인 경우 인스턴스에 할당된 AWS Identity and Access Management(IAM) 역할을 사용하는 것이 좋습니다. IAM 역할을 사용하면 기본 서비스 생성자를 사용할 수 있습니다. 기본 생성자 클라이언트는 다음 순서로 기본 자격 증명 공급자 체인을 사용하여 자격 증명을 검색합니다.

  1. 시스템 환경 변수에서 검색: AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  2. Java 시스템 속성에서: aws.accessKeyIdaws.secretKey
  3. 기본 자격 증명 파일(이 파일의 위치는 플랫폼마다 다름)에서
  4. EC2 인스턴스의 IAM 역할과 연결된 인스턴스 메타데이터에 포함되어 있는 인스턴스 프로파일 자격 증명에서 검색 인스턴스에 인스턴스 프로파일을 연결하면 인스턴스 프로파일 자격 증명이 기본 자격 증명 공급자 체인에 추가됩니다. 자세한 내용은 IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여하기를 참조하십시오.

인스턴스 프로파일 자격 증명을 사용할 수 있는 경우 기본 클라이언트 생성자는 AWS SDK InstanceProfileCredentialsProvider 클래스의 인스턴스를 생성합니다. AWS는 이 클래스를 사용하여 Amazon EC2 인스턴스 메타데이터임시 보안 자격 증명을 사용하여 AWS 자격 증명으로 API 요청에 서명합니다.

중요: 애플리케이션에서 AWS SDK ProfileCredentialsProvider 클래스를 사용하여 임시 AWS 자격 증명을 제공하는 경우 만료되기 전에 자격 증명을 확인하고 새로 고칠 책임은 사용자에게 있습니다. 자격 증명을 확인하거나 새로 고치지 않으면 ExpiredToken 오류로 인한 애플리케이션 장애 가능성이 높아집니다.

해결 방법

Amazon 시간 동기화 서비스 또는 NTP 소스 사용

Amazon EC2 인스턴스에서 Amazon Time Sync Service 또는 다른 NTP(Network Time Protocol) 소스를 구성합니다. 이렇게 하면 Linux 인스턴스의 시간 기준이 일관되고 정확해집니다. 자세한 내용은 Linux 인스턴스의 시간 설정 또는 Windows 인스턴스의 시간 설정을 참조하세요.

사용자 지정 임시 AWS 자격 증명 사용

만료되기 5분 전에 임시 자격 증명을 새로 고칩니다.

인스턴스에 할당된 IAM 역할 사용

인스턴스 프로파일을 인스턴스에 연결합니다. 자세한 내용은 IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여하기를 참조하십시오. 코드 또는 인스턴스에 다른 자격 증명이 지정되어 있지 않은지 확인합니다. 인스턴스 프로파일 자격 증명은 기본 자격 증명 공급자 체인이 자격 증명을 검색한 마지막 위치입니다. 검색 체인의 이전 위치에 자격 증명이 있으면 해당 자격 증명으로 인해 IAM이 사용되지 않습니다. 자세한 내용은 AWS 자격 증명 작업을 참조하세요.

인스턴스에 연결된 IAM 역할에 대한 AWS 자격 증명을 보려면 Linux 셸 또는 Windows PowerShell(v3.0 이상)에서 다음 명령을 실행합니다. examplerole을 IAM 역할 이름으로 바꿔야 합니다.

Linux

AWS 자격 증명을 보려면 curl 명령을 사용합니다.

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

다음과 비슷한 출력이 반환됩니다.

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

참고: 이전 curl 명령을 실행하여 404 오류가 반환되는 경우 다음을 확인하세요.

1.    다음 명령을 사용하여 메타데이터 IP 주소에 대해 HTTP 프록시가 비활성화되었는지 확인합니다.

$ export NO_PROXY=169.254.169.254

2.    인스턴스가 여러 개의 동시 요청을 하지 않고 여러 세션을 동시에 실행하고 있는지 확인합니다. 여러 개의 동시 요청과 여러 세션이 병렬로 실행되면 인스턴스 메타데이터 서비스(IMDS)에 의해 조절이 발생할 수 있습니다. 이 문제를 줄이려면 지수 백오프와 함께 캐싱 및 재시도를 사용하세요. 다른 서비스와 마찬가지로 호출이 때때로 실패할 수 있습니다. 이 경우 클라이언트는 다시 시도할 것으로 예상됩니다. 자세한 내용은 쿼리 조절을 참조하세요.

재시도를 구현하려면 AWS_METADATA_SERVICE_NUM_ATTEMPTS를 수정합니다. ~/.aws/config 파일 또는 사용자의 보토코어 세션에서 환경 변수를 사용하여 옵션을 설정할 수 있습니다. 자세한 내용은 Boto3 DOCS 1.17.6 설명서의 구성을 참조하세요.

예:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    도커 컨테이너에서 curl 테스트를 실행하는 경우 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

다음과 비슷한 출력이 반환됩니다.

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

이 명령을 사용하여 인스턴스의 최신 임시 자격 증명을 확인합니다. 이러한 자격 증명은 할당된 임시 자격 증명이 만료되기 약 5분 전에 자동으로 교체되거나 새로 고쳐집니다.

관련 정보

AWS 자격 증명 작업(Java용 AWS SDK)

자격 증명 사용 (자바 2.0용 AWS SDK)

Amazon EC2의 IAM 역할

Amazon EC2의 IAM 역할 구성(고급)


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?