使用 AWS CLI 承擔 IAM 角色時,如何對 AWS STS 錯誤 “the security token included in the request is expired (請求中包含的安全字符已過期)” 進行疑難排解?
上次更新日期:2022 年 5 月 17 日
我嘗試使用 AWS Command Line Interface (AWS CLI) 擔任 AWS Identity and Access Management (IAM) 角色。但收到類似於以下內容的錯誤:
"The security token included in the request is expired. (請求中包含的安全字符已過期。)"
簡短描述
使用 AWS Security Token Service (AWS STS) 服務請求 IAM 使用者的臨時安全憑證。依預設,透過 AssumeRole API 動作建立的臨時憑證會持續一小時。臨時憑證過期後,便無法重複使用。如需詳細資訊,請參閱 IAM 中的臨時安全憑證。
解決方案
請針對您的使用案例使用下列疑難排解步驟。
注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本。
確保您的臨時安全憑證請求可連線 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."
這些設定檔在 .aws 資料夾中定義,包含 .credentials 和 .config 檔案。
該組態檔案位於 ~/.aws/config (Linux/macOS) 和 C:\Users\%USERPROFILE%\.aws\config (Windows)。憑證檔案位於 ~/.aws/credentials (Linux/macOS) 和 C:\Users\%USERPROFILE%\.aws\credentials (Windows)。
若要檢查您的預設設定檔憑證,請執行下列命令:
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 檔案。
您可以避免在每次工作階段過期時更新組態檔案。如下所示定義 IAM 角色的設定檔,以及在 ~/.aws/config 或 ~/.aws/credentials 檔案中擔任角色的使用者:
[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 命令列出了 Amazon Simple Storage Service (Amazon S3) 儲存貯體,其中包含位於 ~/.aws/credentials 檔案中的 user1 憑證。
aws s3 ls --profile project1
如果您將 AWS CLI 與 source_profile 元素搭配使用,則 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 角色:
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 中的安全最佳實務。