![](/img/trans.png)
[英]Getting error while publishing message to SQS: AmazonSQS; Status Code: 403; Error Code: RequestThrottled
[英]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對象,我相信您拒絕這樣做的機會。
您沒有明確聲明您的應用程序是繼承實例角色,但是您的帖子中有足夠的證據可以推斷出這種情況:
文檔中描述了自動憑據刷新的特定行為:
僅當您使用默認客戶端構造函數(它將自己的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.