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).
Dziękujemy za opublikowanie tego. – NielW