簡體   English   中英

SQS ExpiredToken:請求中包含的安全令牌是過期狀態代碼:403

[英]SQS ExpiredToken: The security token included in the request is expired status code: 403

我有一個在EC2上運行的長時間運行的工作進程,它使用來自SQS隊列的項目。 過了一段時間(8-12小時,我估計)我開始得到過期的安全令牌錯誤。 我希望aws lib能夠自動處理憑證刷新,但似乎並非如此。 無論如何在客戶端內處理? 僅當我使用DefaultCredentialsProviderChain生成訪問時才會發生這種情況。 與密鑰和密鑰一起使用時不會發生此錯誤。 堆棧跟蹤如下:

com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 6ff6e1a0-d668-5ac5-bcd7-ae30058f25c0)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1182)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:770)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:489)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:310)
    at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2419)
    at com.amazonaws.services.sqs.AmazonSQSClient.receiveMessage(AmazonSQSClient.java:1130)
    at com.amazonaws.services.sqs.AmazonSQSAsyncClient$24.call(AmazonSQSAsyncClient.java:1783)
    at com.amazonaws.services.sqs.AmazonSQSAsyncClient$24.call(AmazonSQSAsyncClient.java:1779)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我發現的解決方法是每次遇到過期令牌錯誤時更新awsCredentials並重置sqs客戶端。

awsCredentials = (new DefaultAWSCredentialsProviderChain).getCredentials
sqs = SimpleSQSClient(awsCredentials, Regions.US_EAST_1)
queueSQS = sqs.simple(QueueName(queueName), true)

注意:我使用的是包裝kifi / franz

AWS開發工具包確實能夠循環從實例配置文件繼承的臨時憑證 ,但是通過在SimpleSQSClient的構造函數中傳遞顯式的AWSCredentials對象,我相信您拒絕這樣做的機會。

您沒有明確聲明您的應用程序是繼承實例角色,但是您的帖子中有足夠的證據可以推斷出這種情況:

  • 您的應用程序在EC2上運行。
  • DefaultAWSCredentialsProviderChain的行為是查找“通過Amazon EC2元數據服務提供的實例配置文件憑據”,如果它找不到其他憑據。
  • 在未明確傳遞您自己的已知訪問/密鑰時,您只會看到此行為。

文檔中描述了自動憑據刷新的特定行為:

僅當您使用默認客戶端構造函數(它將自己的InstanceProfileCredentialsProvider創建為默認提供程序鏈的一部分)時,或者將InstanceProfileCredentialsProvider實例直接傳遞給客戶端構造函數時,才會自動刷新憑據。 如果使用其他方法獲取或傳遞實例配置文件憑據,則您負責檢查和刷新過期的憑據。

通過直接傳遞AWSCredentials而不是AWSCredentialsProvider,您將負責檢查和刷新過期的憑據。 從好的方面來說,如果您想要明確地傳遞憑據,那么您的解決方法就可以了。

SimpleSQSClient有一個構造函數,可以更好地適用於您的用例:

new SimpleSQSClient(
    credentialProvider: com.amazonaws.auth.AWSCredentialsProvider,
    region: com.amazonaws.regions.Regions,
    buffered: Boolean
)

例:

SimpleSQSClient sqs = SimpleSQSClient(new DefaultAWSCredentialsProviderChain(), Regions.US_EAST_1, false)

示例,顯式使用InstanceProfileCredentialsProvider

SimpleSQSClient sqs = SimpleSQSClient(new InstanceProfileCredentialsProvider(), Regions.US_EAST_1, false)

進一步閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM