AWS CLI を使用して IAM ロールを引き受ける際に表示される、「the security token included in the request is expired」 (リクエストに含まれているセキュリティトークンが失効しています) という AWS STS エラーをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 5 月 17 日

AWS Command Line Interface (AWS CLI) を使用して AWS Identity and Access Management (IAM) ロールを引き受けようとしました。しかし、次のようなエラーが表示されました。

「The security token included in the request is expired.」(リクエストに含まれているセキュリティトークンが失効しています。)

簡単な説明

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."

これらのプロファイルは、.credentials および .config ファイルを格納する .aws フォルダで定義されます。

config ファイルは、Linux/macOS の場合は ~/.aws/config に、Windows の場合は C:\Users\%USERPROFILE%\.aws\config に存在しています。credentials ファイルは、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 ファイルを手動で更新する必要があります。

セッションが失効するたびに 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 を使用している場合、API コール assume-role によって、認証情報が .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 ロールの認証情報を使用して 3 つの環境変数を作成し、次のような 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 のセキュリティのベストプラクティスに確実に従うようにしてください。