跳至內容

如何解決 IAM 存取金鑰錯誤 "The security token included in the request isn’t valid"?

3 分的閱讀內容
0

當我使用我的 AWS Identity and Access Management (IAM) 存取金鑰時,收到關於安全性權杖無效的 InvalidClientTokenId 錯誤。

簡短說明

發生此驗證錯誤的原因是您的 IAM 存取金鑰位於未預期的位置、未正確設定,或是已被刪除或過期。所使用的存取金鑰取決於憑證提供者的順序與優先順序。如需更多資訊,請參閱 Configuration and credentials precedence (組態與憑證優先順序)。

在下列解決方法中,該錯誤是由於無效的存取金鑰,而發生 Linux 型 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上。

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱 Troubleshoot AWS CLI errors (對 AWS CLI 錯誤進行疑難排解)。此外,請務必使用最新版 AWS CLI

若要解決此錯誤,請尋找使用者憑證位置、驗證存取金鑰是否有效,然後更新或替換存取金鑰。

尋找使用者憑證位置

若要取得 EC2 執行個體所使用的 IAM 存取金鑰,請執行下列 get-caller-identity AWS CLI 命令:

aws sts get-caller-identity --debug

輸出範例:

2024-06-04 11:28:22,588 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: env
2024-06-04 11:28:22,588 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role
2024-06-04 11:28:22,588 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role-with-web-identity
2024-06-04 11:28:22,588 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: sso
2024-06-04 11:28:22,588 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: shared-credentials-file
2024-06-04 11:28:22,588 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials

在上述範例輸出中,Amazon EC2 執行個體所使用的存取金鑰位於:~/.aws/credentials 檔案內。

注意: .aws/credentials 檔案包含您的 IAM 實體的憑證詳細資訊。當您管理存取金鑰時,請務必遵循 IAM 中的安全性最佳實務

確認存取金鑰是否有效

若要確認存取金鑰對於該位置和 API 呼叫動作是否有效,請完成下列步驟:

  1. 若要確認 Amazon EC2 執行個體所使用的是哪些存取金鑰,請執行下列命令:

    cd ~/.aws
    cat credentials

    輸出範例:

    [default]
    aws_access_key_id=AKIAIOSFODNN7EXAMPLE
    aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  2. 若要驗證存取金鑰許可是否有效,請使用 AWS 管理主控台或 AWS CLI

更新或替換存取金鑰

如果存取金鑰已過期或已刪除,請更新存取金鑰

如果您在 AWS CLI 中使用 具名設定檔,請確認 aws_access_key_idaws_session_token 設定是否具有正確的值。設定檔組態儲存在 ./aws/credentials./aws/config 檔案中。

如果您有儲存在環境變數中且無效的存取金鑰,請執行下列命令以將其移除:

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

如果您已更新設定檔組態,請務必重設環境變數

在更新或替換存取金鑰之後,若要確認憑證是否有效,請執行下列 get-caller-identity AWS CLI 命令:

aws sts get-caller-identity --debug

輸出範例:

2024-06-04 12:46:07,167 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: env
2024-06-04 12:46:07,167 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role
2024-06-04 12:46:07,168 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role-with-web-identity
2024-06-04 12:46:07,168 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: sso
2024-06-04 12:46:07,168 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: shared-credentials-file
2024-06-04 12:46:07,168 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: custom-process
2024-06-04 12:46:07,168 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: config-file
2024-06-04 12:46:07,169 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: ec2-credentials-file
2024-06-04 12:46:07,169 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: boto-config
2024-06-04 12:46:07,169 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: container-role
2024-06-04 12:46:07,169 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: iam-role
2024-06-04 12:46:07,177 - MainThread - botocore.credentials - DEBUG - Found credentials from IAM Role: ec2_Role

在上述範例輸出中,執行個體使用的是 Amazon EC2 執行個體設定檔憑證,因為沒有儲存其他具有更高優先順序的憑證。

使用臨時安全性憑證解決 ExpiredToken 錯誤

注意: 最佳實務是使用臨時安全性憑證,而不是長期安全性憑證 (例如存取金鑰)。如需有關 AWS 帳戶安全性規定的更多資訊,請參閱 Security considerations (安全考量)。

臨時安全性憑證會在指定的持續時間後過期,且無法延長超過其原始過期時間。當您使用過期的憑證時,您會收到 ExpiredToken 錯誤。

若要解決此錯誤,您必須要求新的臨時憑證。如果您原本使用 GetSessionToken 來取得臨時憑證,若要要求新憑證,請執行下列 get-session-token AWS CLI 命令:

aws sts get-session-token \
    --duration-seconds 3600

注意: 請將 3600 替換為您所需的持續時間 (以秒為單位),最短為 900 秒,最長為 129600 秒。

如需有關如何使用 GetSessionToken 的程式碼範例,請參閱 Use GetSessionToken with an AWS SDK or CLI (搭配 AWS SDK 或 CLI 使用 GetSessionToken)。

相關資訊

為什麼我的 Amazon EC2 執行個體使用 IAM 使用者憑證而非角色憑證?

如何解決某些 AWS 區域中的 IAM 錯誤「AWS was not able to validate the provided access credentials」?

Manage AWS STS in an AWS Region (管理 AWS 區域中的 AWS STS)

AWS 官方已更新 5 個月前