AWS CLI를 사용하여 IAM 역할을 위임할 때 발생하는 AWS STS 오류 “요청에 포함된 보안 토큰이 만료되었습니다.”를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 5월 17일

AWS 명령줄 인터페이스(CLI)를 사용하여 AWS Identity and Access Management(IAM) 역할을 위임하려 했습니다. 하지만 다음과 유사한 오류가 발생했습니다.

"요청에 포함된 보안 토큰이 만료되었습니다."

간략한 설명

IAM 사용자에 대한 임시 보안 자격 증명은 AWS Security Token Service(AWS STS) 서비스를 사용하여 요청됩니다. AssumeRole API 작업으로 생성된 임시 자격 증명은 기본적으로 1시간 동안 지속됩니다. 임시 자격 증명이 만료된 후에는 다시 사용할 수 없습니다. 자세한 내용은 IAM의 임시 보안 자격 증명을 참조하십시오.

해결 방법

사용 사례에 따라 다음의 문제 해결 단계를 사용합니다.

AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인합니다.

임시 보안 자격 증명 요청이 AWS 엔드포인트에 도달할 수 있는지 확인

역할에 대한 자격 증명을 설정하려면 액세스 키 ID, 비밀 액세스 키 및 세션 토큰이 필요합니다. 전송된 요청은 요청에 대한 타임스탬프가 찍힌 후 5분 이내에 AWS 엔드포인트에 도달해야 합니다. 그렇지 않으면 요청이 거부됩니다. 자세한 내용은 요청에 서명하는 이유를 참조하십시오.

프로필을 사용하여 IAM 역할 위임

명명된 프로필은 AWS CLI 명령에 적용할 수 있는 설정 및 자격 증명의 모음입니다. 올바른 자격 증명을 사용하고 있는지 확인해야 합니다.

다음 AWS CLI 명령은 기본 프로필 자격 증명을 사용합니다.

aws s3 ls

다음 예제 명령은 .config 파일에 구성된 project1 프로필 자격 증명을 사용합니다.

aws s3 ls --profile project1

만료된 자격 증명을 사용한 출력 예:

"An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired."

이러한 프로필은 credentialsconfig 파일을 포함하는 .aws 폴더에 정의되어 있습니다.

구성 파일은 Linux/macOS의 경우 ~/.aws/config, Windows의 경우 C:\Users\%USERPROFILE%\.aws\config에 위치해 있습니다. 자격 증명 파일은 Linux/macOS의 경우 ~/.aws/credentials, Windows의 경우 C:\Users\%USERPROFILE%\.aws\credentials에 위치해 있습니다.

기본 프로필 자격 증명을 확인하려면 다음 명령을 실행합니다.

aws configure list --profile default

출력 예시:

Name Value Type Location
---- ----- ---- --------
profile default manual —profile
access_key TGN7 shared-credentials-file
secret_key SbXb shared-credentials-file
region us-east-1 config-file ~/.aws/config

프로필 project1에 동일한 자격 증명이 사용되는지 확인하려면 다음 명령을 실행합니다.

aws configure list --profile project1

출력 예시:

Name Value Type Location
---- ----- ---- --------
profile project1 manual —profile
access_key QN2X config-file
secret_key LPYI config-file
region eu-west-1 config-file ~/.aws/config

예제 출력에서 기본 및 project1 프로필에 대해 서로 다른 자격 증명이 구성될 수 있습니다.

다음 형식을 사용하여 .aws/config 파일에 프로필을 만들 수 있습니다.

[profile project1]
region = eu-west-1
aws_access_key_id = <access-Key-for-an-IAM-role>
aws_secret_access_key = <secret-access-Key-for-an-IAM-role>
aws_session_token = <session-token>

이러한 자격 증명은 다음과 유사한 AWS STS assume-role 명령을 실행할 때 제공됩니다.

aws sts assume-role --role-arn arn:aws:iam::<account-number>:role/Prod-Role --role-session-name environment-prod

출력 예시:

{
"AssumedRoleUser": {
"AssumedRoleId": "AROAXXXXXXXXXXXX:environment-prod",
"Arn": "arn:aws:sts::<account-number>:assumed-role/Prod-Role/environment-prod"
},
"Credentials": {
"SecretAccessKey": "<secret-access-Key-for-an-IAM-role>,
"SessionToken": "<session-token>",
"Expiration": "2020-03-31T17:17:53Z",
"AccessKeyId": "<access-Key-for-an-IAM-role>"
}

참고: 사용 사례에 따라 DurationSeconds 파라미터를 사용하여 IAM 역할의 임시 자격 증명에 대한 최대 세션 기간 만료를 늘릴 수 있습니다.

그런 다음 새 assume-role API 호출이 유효한 자격 증명의 새 집합을 검색합니다. API 호출 후 ~/.aws/config 파일을 새 임시 자격 증명으로 수동으로 업데이트해야 합니다.

세션이 만료될 때마다 구성 파일을 업데이트하지 않아도 됩니다. 다음과 유사한 ~/.aws/config 또는 ~/.aws/credentials 파일에 역할을 위임하는 사용자와 함께 IAM 역할에 대한 프로필을 정의합니다.

[profile project1]
role_arn = <arn-of-IAM-role>
source_profile = user1
region = <region>

user1~/.aws/credentials 파일에 다음과 유사하게 정의되어 있습니다.

[user1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

source_profile을 정의하면 ~/.aws/config 또는 ~/.aws/credentials 파일에서 임시 자격 증명을 업데이트할 필요가 없습니다.

다음 AWS CLI 명령은 ~/.aws/credentials 파일에 위치한 user1에 대한 자격 증명이 있는 Amazon Simple Storage Service(Amazon S3) 버킷을 나열합니다.

aws s3 ls --profile project1

source_profile 요소와 함께 AWS CLI를 사용하는 경우, assume-role API 호출은 .aws/cli/cache 파일에 자격 증명을 부여합니다. 만료된 자격 증명은 .aws/cli/cache 파일에서 자동으로 업데이트됩니다. 만료된 자격 증명에 대한 오류가 발생하면 다음 명령을 사용하여 캐시를 지울 수 있습니다.

Linux/macOS:

$ rm -r ~/.aws/cli/cache

Windows:

C:\> del /s /q %UserProfile%\.aws\cli\cache

AWS CLI는 캐시에 새 자격 증명을 생성합니다.

IAM 역할을 위임하도록 환경 변수 생성 후 액세스 확인

IAM 역할 자격 증명을 사용하여 다음과 유사한 IAM 역할을 위임할 세 가지 환경 변수를 생성할 수 있습니다.

Linux/macOS:

export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken

Windows:

C:\> setx AWS_ACCESS_KEY_ID RoleAccessKeyID
C:\> setx AWS_SECRET_ACCESS_KEY RoleSecretKey
C:\> setx AWS_SESSION_TOKEN RoleSessionToken

올바른 IAM 역할을 위임했는지 확인하려면 다음 명령을 실행합니다.

aws sts get-caller-identity

get-caller-identity 명령은 요청을 인증하는 데 사용된 IAM 자격 증명에 대한 정보를 표시합니다. 자세한 내용은 AWS CLI를 사용하여 IAM 역할을 위임하려면 어떻게 해야 합니까?를 참조하십시오.

환경 변수는 만료된 후에도 임시 캐시된 자격 증명을 보유하며 자동으로 갱신되지 않습니다. 다음 명령을 사용하여 자격 증명 환경 변수가 설정되어 있는지 확인합니다.

Linux/macOS:

$ printenv | grep AWS

Windows:

C:\>set AWS

다음 명령을 사용하여 만료된 환경 변수를 제거할 수 있습니다.

Linux/macOS:

$ unset AWS_ACCESS_KEY_ID
$ unset AWS_SECRET_ACCESS_KEY
$ unset AWS_SESSION_TOKEN

Windows:

C:\>set AWS_ACCESS_KEY_ID=
C:\>set AWS_SECRET_ACCESS_KEY=
C:\>set AWS_SESSION_TOKEN=

이제 assume-role API 호출을 다시 사용하여 유효한 새 자격 증명을 가져오고 환경 변수를 다시 설정할 수 있습니다.

중요: .aws/credentials.aws/config 파일에는 IAM 엔터티에 대한 자격 증명 세부 정보가 포함되어 있습니다. 자격 증명을 관리할 때는 IAM의 보안 모범 사례를 따라야 합니다.