我在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上使用適用於 Java 的 AWS SDK 會收到類似下列錯誤:"com.amazonaws.AmazonServiceException: 請求中包含的安全性權杖已到期(服務: AmazonSQS; Status Code: 403;錯誤代碼: ExpiredToken;請求 ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)"。
簡短說明
AWS 要求所有應用程式 API 請求都必須使用 AWS 提供的憑證進行數位簽署。當您的應用程式使用臨時憑證來建立 AWS 用戶端時,您必須在憑證到期之前續約。如果您的憑證過期,則您會收到請求中包含的安全權杖已過期錯誤。若要解決此錯誤,請檢查您的時間參考、重新整理過期的臨時憑證,然後檢查您的 AWS Identity and Access Management (IAM) 組態。
解決方法
確保您的執行個體具有一致的時間參考
如果憑證使用不正確的時間則會過期,因此請確保您的伺服器正確無誤。您的 EC2 執行個體必須具有一致且準確的時間和日期參考。在執行個體上設定 Amazon Time Sync Service 或其他網路時間通訊協定 (NTP) 來源。如需詳細資訊,請參閱變更執行個體的時區。
確保您的臨時憑證尚未過期
如果您使用臨時憑證,請確保它們未過期。如果臨時憑證已過期,您必須產生一組新的臨時憑證並使用它們。最佳做法是在臨時憑證到期前五分鐘將之重新整理。
檢查您的 IAM 組態
對於 EC2 執行個體上執行的應用程式,最佳做法是使用指派給執行個體的 IAM 角色。如果您使用 IAM 角色,請檢查組態是否正確設定。
使用 IAM 角色,預設服務建構模組會使用預設憑證提供者鏈,依照下列順序搜尋憑證:
- 在 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 系統環境變數。
- 在 aws.accessKeyId 和 aws.secretKey Java 系統屬性。
- 在預設憑證檔案中。
- 在與 IAM 角色相關聯之執行個體中繼資料中的執行個體設定檔憑證中。
如需詳細資訊,請參閱使用 IAM 角色授予權限給在 Amazon EC2 執行個體上執行的應用程式。
如果您在執行個體設定檔以外的任何地方列出憑證,則預設用戶端建構模組會先找到這些憑證。此組態會封鎖 IAM 角色憑證。如需詳細資訊,請參閱為適用於 Java 的 AWS SDK 提供臨時憑證。
若要查看 IAM 角色的憑證,請從 Windows PowerShell 3.0 或更新版本或 Linux Shell 執行下列命令。如果您使用臨時憑證,則下列 Windows 和 Linux 命令會顯示執行個體的最新臨時憑證。
**注意:**在下列命令中,使用您的 IAM 角色名稱取代 examplerole。
Windows:
PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole
您會收到類似於下列範例的輸出:
Code : SuccessLastUpdated : 2016-07-18T18:09:47Z
Type : AWS-HMAC
AccessKeyId : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token : token
Expiration : 2016-04-27T22:39:16Z
Linux:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole
您會收到類似於下列範例的輸出:
{ "Code" : "Success",
"LastUpdated" : "2016-04-26T16:39:16Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
"SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"Token" : "token",
"Expiration" : "2016-04-27T22:39:16Z"
}
如果您在執行前面的 ** curl ** 命令時收到 404 錯誤,請確認中繼資料 IP 位址是否關閉 HTTP Proxy。此外,請確定執行個體設定檔已附加至執行個體。
如果問題仍然存在,請確認執行個體沒有發出多個並行請求,或並行執行多個工作階段。此情境可能會導致執行個體中繼資料服務 (IMDS) 限流查詢。若要減輕此問題,請使用指數退避模式進行重試。
若要設定重試,請修改 AWS_METADATA_SERVICE_NUM_ATTEMPTS。若要設定選項,請使用環境變數、** ~/.aws/config ** 檔案,或使用者的 botocore 工作階段。如需詳細資訊,請參閱 Boto3 文件網站上的組態。
範例:
AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5
如果您在 Docker 容器中執行 ** curl ** 命令,則將 http-put-response-hop-limit 提高至 2。執行下列 AWS Command Line Interface (AWS CLI) modify-instance-metadata-options 命令:
aws ec2 modify-instance-metadata-options --instance-id instance --http-put-response-hop-limit 2 --http-endpoint enabled
注意: 使用您的執行個體 ID 取代執行個體。如果您在執行 AWS CLI 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
如需詳細資訊,請參閱針對 EC2 執行個體中繼資料服務增強功能,針對開放式防火牆、反向 Proxy 和 SSRF 弱點增加深入防禦。
角色憑證會在指派的臨時憑證到期前五分鐘自動輪換或重新整理。
相關資訊
設定 SDK 驗證
適用於 Amazon EC2 的 IAM 角色