AWS CLI を使用して IAM ロールを引き受けるときに、AWS STS で「リクエストに含まれるセキュリティトークンの有効期限が切れています」というエラーが発生した場合にトラブルシューティングする方法を教えてください。
AWS コマンドラインインターフェイス (AWS CLI) を使用して AWS Identity and Access Management (IAM) ロールの引き受けを試みました。すると、「リクエストに含まれるセキュリティトークンの有効期限が切れています」というエラーが表示されました。
簡単な説明
IAM ユーザーの一時的なセキュリティ認証情報は、AWS Security Token Service (AWS STS) のサービスを使用してリクエストされます。AssumeRole API アクションで作成された一時的な認証情報は、デフォルトでは 1 時間有効です。一時的な認証情報は、有効期限が切れた後に再使用することはできません。詳細については、「IAM での一時的なセキュリティ認証情報」を参照してください。
解決策
ユースケースに応じて、次のトラブルシューティング手順を実行します。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「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 フォルダで定義されています。
設定ファイルは、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 を使用している場合、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 ロールの認証情報を使用することで、IAM ロールを引き受けるための環境変数を 3 つ作成できます。例を次に示します。
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 ID に関する情報を表示します。詳細については、「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 のセキュリティにおけるベストプラクティスに従ってください。
関連情報
Amazon EC2 で Java アプリケーションを実行しているときの、「リクエストに含まれるセキュリティトークンの有効期限が切れています」というエラーを解決する方法を教えてください
関連するコンテンツ
- 質問済み 3ヶ月前lg...
- AWS公式更新しました 2ヶ月前
- AWS公式更新しました 5ヶ月前