2015-08-27 19 views
5

Posiadam od dawna działającą aplikację AWS Java SDK DynamoDB, która zachowuje się normalnie po uruchomieniu. Jednak po kilku godzinach (około 12), zacznę od nowa otrzymywać to samo Exception DOWOLNYM połączeniem z interfejsem DynamoDB API. Jeśli zrestartuję serwer, Exception zniknie ... i pojawi się ponownie później.Jak wyleczyć wywołanie dynamicznego pakietu SDK Java SDK, powodując wyjątek ExpiredTokenException?

Dokładny tekst ExpiredTokenException błędu:
token bezpieczeństwa zawarte we wniosku straciła ważność (Service: AmazonDynamoDBv2; Kod Status: 400; Error Code: ExpiredTokenException; Request-ID: DEMTN0Q5BMPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

Odpowiedz

10

Podsumowanie:
Przekaż instancję AWSCredentialsProvider (w przeciwieństwie do AWSCredentials) do konstruktora AmazonDynamoDBClient, ponieważ umożliwia automatyczne odświeżanie wygasłej AWSCredentials (jeśli konkretna AWSCredentialsProvider zaimplementowała funkcję odświeżania ... co ma miejsce w przypadku wszystkich standardowych podanych przez AWS).

Szczegóły:
Aby rozwiązać ten AWS Java SDK DynamoDB związane ExpiredTokenException który zaczyna się od przedrostka "token bezpieczeństwa zawarte we wniosku jest minął (serwis: AmazonDynamoDBv2; kodem stanu: 400; Kod błędu: ExpiredTokenException; Request ID: ... ", musisz zmienić swój kod, aby dostarczyć instancję AWSCredentialsProvider (i przestać używać instancji AWSCredentials - tj. Nie ma sufiksu" Provider ") do konstruktora AmazonDynamoDBClient. Przekazując AmazonDynamoDBClient konstruktor instancji o numerze AWSCredentialsProvider, dajesz mu możliwość "automatycznego odświeżania poświadczeń", jeśli/po wygaśnięciu AWSCredentials (co znaleźć w tym AWS forum thread, który wymaga konta do dostępu).

Aby zapewnić wyraźny przykład w kodzie, tu jest uogólnieniem co jest kod produkcji 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 

I tu jest uogólnieniem kodu eliminując 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 

Biorąc pod uwagę, jak bardzo wspiąłem się na Javadocs AWS Java SDK i dostarczone przeze mnie przykłady (na których oparłem większość mojego własnego kodu), nie zauważyłem, że ten specyficzny niuans wywołał. Stąd bardzo szczegółowa odpowiedź, którą zapewniam tym, którzy przyjdą po mnie (co prawdopodobnie będzie obejmować mnie, LOL).

+2

Dziękujemy za opublikowanie tego. – NielW