2015-08-27 4 views
5

Ich habe eine lange laufende AWS Java SDK DynamoDB Anwendung, die sich normal verhält, wenn ich sie starte. Nach einer gewissen Anzahl von Stunden (etwa 12), bekomme ich immer wieder die gleiche Exception mit ANY Aufruf an die DynamoDB API. Wenn ich den Server neu starte, verschwindet die Exception ... nur um später wieder zu erscheinen.Wie behebe ich einen Aufruf an die AWS Java SDK DynamoDB, der zu einer ExpiredTokenException führt?

Der genaue ExpiredTokenException Fehlertext ist:
Die Sicherheits-Token in der Anforderung enthalten sind abgelaufen (Service: AmazonDynamoDBv2; Statuscode: 400; Fehlercode: ExpiredTokenException; Anfrage-ID: DEMTN0Q5BMPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

Antwort

10

Zusammenfassung:
Übergeben Sie eine Instanz von AWSCredentialsProvider (im Gegensatz zu AWSCredentials) zu AmazonDynamoDBClient 's Konstruktor, da dies die automatische Aktualisierung von abgelaufenenermöglicht(wenn die spezielle AWSCredentialsProvider die Refresh-Funktionalität implementiert hat ... was bei allen von AWS bereitgestellten Standards der Fall ist).

Details:
die AWS Java SDK DynamoDB Zusammenhang ExpiredTokenException, die mit dem Präfix beginnt zu beheben "Das Token in der Anforderung enthalten Sicherheit (Service abgelaufen ist: AmazonDynamoDBv2; Statuscode: 400; Fehlercode: ExpiredTokenException; Anfrage-ID: ... ", müssen Sie Ihren Code ändern, um eine Instanz von AWSCredentialsProvider (und stoppen Sie mit einer Instanz von AWSCredentials - dh ohne die" Provider "Suffix) an den AmazonDynamoDBClient Konstruktor. Durch Übergeben der AmazonDynamoDBClient 's Konstruktor eine Instanz von AWSCredentialsProvider, geben Sie es die Möglichkeit, "automatisch die Anmeldeinformationen zu aktualisieren", wenn/wann die AWSCredentials ablaufen (die ich gefunden in dieser AWS forum thread, die ein Konto für den Zugriff benötigt).

Um ein explizites Beispiel in Code zu liefern, hier ist eine Verallgemeinerung, was der Code die ExpiredTokenException Herstellung:

AWSCredentialsProvider aWSCredentialsProvider = 
    new SystemPropertiesCredentialsProvider(); 
    //the above line may be substituted for any valid 
    //*Provider implementation 
AWSCredentials aWSCredentials = 
    aWSCredentialsProvider.getCredentials(); 
AmazonDynamoDBClient amazonDynamoDBClient = 
    new AmazonDynamoDBClient(aWSCredentials); 
... 
amazonDynamoDBClient.listTables(); 
    //the above line is where the ExpiredTokenException is eventually thrown 

Und hier ist eine Verallgemeinerung des Codes der ExpiredTokenException beseitigen:

AWSCredentialsProvider aWSCredentialsProvider = 
    new SystemPropertiesCredentialsProvider(); 
    //substitute the above line for any valid *Provider implementation 
AmazonDynamoDBClient amazonDynamoDBClient = 
    new AmazonDynamoDBClient(aWSCredentialsProvider); 
    //the above line is now passing an instance of AWSCredentialsProvider 
    //as opposed to AWSCredentials 
... 
amazonDynamoDBClient.listTables(); 
    //the above line is now enabled, via the AWSCredentialsProvider, to 
    //automatically refresh the AWSCredentials if/when they have expired 

Angesichts der Tatsache, wie sehr ich über die Java-SDK-Javadocs von AWS und ihre mitgelieferten Beispiele geklettert bin (auf denen ich den Großteil meines eigenen Codes basierte), habe ich diese spezielle Nuance nicht einmal bemerkt. Daher die sehr detaillierte Antwort, die ich für diejenigen bereitgebe, die nach mir kommen (was wahrscheinlich auch mich selbst, LOL, einschließt).

+2

Vielen Dank für das Posten. – NielW

Verwandte Themen