2015-08-27 5 views
5

Possiedo un'applicazione DynamoDB Java SDK AWS di lunga durata che si comporta normalmente all'avvio. Tuttavia, dopo un certo numero di ore (circa 12), comincio a ricevere lo stesso Exception ancora e ancora con QUALSIASI chiamata all'API DynamoDB. Se riavvio il server, lo Exception scompare ... solo per riapparire più tardi.Come si cura una chiamata all'ADS Java SDK DynamoDB risultante in ExpiredTokenException?

L'esatto testo ExpiredTokenException errore è:
Il token di sicurezza incluse nella richiesta è scaduto (Servizio: AmazonDynamoDBv2; Codice di stato: 400; Codice di errore: ExpiredTokenException; Request ID: DEMTN0Q5BMPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

risposta

10

Sommario:
Passare un'istanza di AWSCredentialsProvider (in contrasto con AWSCredentials) nel costruttore AmazonDynamoDBClient poiché ciò consente l'aggiornamento automatico scaduto AWSCredentials (se il particolare AWSCredentialsProvider ha implementato la funzionalità di aggiornamento ... che è il caso di tutti quelli forniti da AWS standard).

Dettagli:
Per risolvere l'ExpiredTokenException relativi AWS Java SDK DynamoDB che inizia con il prefisso "Il token di sicurezza incluse nella richiesta è scaduto (Servizio: AmazonDynamoDBv2; Codice di stato: 400; Codice errore: ExpiredTokenException; ID richiesta: ... ", è necessario modificare il codice per fornire un'istanza di AWSCredentialsProvider (e interrompere l'utilizzo di un'istanza di AWSCredentials, ovvero senza il suffisso" Provider ") nel costruttore di AmazonDynamoDBClient. Passando allo strumento AmazonDynamoDBClient costruttore un'istanza di AWSCredentialsProvider, gli dai la possibilità di "aggiornare automaticamente le credenziali" se/quando scade il AWSCredentials (che trovato in questo AWS forum thread che richiede l'accesso di un account).

Per fornire un esempio esplicito nel codice, ecco una generalizzazione di ciò che il codice sta producendo il ExpiredTokenException:

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 

E qui è una generalizzazione del codice eliminando il ExpiredTokenException:

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 

Dato quanto ho scalato su tutti i Javadocs Java SDK di AWS e sui loro esempi forniti (su cui ho basato la maggior parte del mio codice), non ho notato una volta che questa sfumatura specifica veniva richiamata. Quindi, la risposta molto dettagliata che sto fornendo per coloro che verranno dopo di me (che probabilmente includerò me stesso, LOL).

+2

Grazie per aver postato questo. – NielW