6
@Bean
public DynamoDbClient amazonDynamoDB() {
    final AssumeRoleRequest assumeRoleRequest = AssumeRoleRequest.builder().roleSessionName(UUID.randomUUID().toString()).roleArn("roleArn").build();
    final StsAssumeRoleCredentialsProvider  stsAssumeRoleCredentialsProvider = StsAssumeRoleCredentialsProvider.builder().refreshRequest(assumeRoleRequest).build();
    return DynamoDbClient.builder().credentialsProvider(stsAssumeRoleCredentialsProvider).region(Region.EU_WEST_1)
            .build();
}

getting error

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [software.amazon.awssdk.services.dynamodb.DynamoDbClient]: Factory method 'amazonDynamoDB' threw exception; nested exception is java.lang.NullPointerException: STS client must not be null. at spring.beans@5.2.7.RELEASE/org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) at spring.beans@5.2.7.RELEASE/org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650) ... 58 common frames omitted Caused by: java.lang.NullPointerException: STS client must not be null.

pravinbhogil
  • 657
  • 1
  • 9
  • 13
  • Looks like you're passing a NULL value in one of the fields. You should debug it by checking the values of whatever you are passing on the line that generated the error. – John Rotenstein Jul 16 '20 at 01:59
  • It worked actually it's bit confusing but finally figured it out .. we have to setup sts client in request. @John Rotenstein – pravinbhogil Jul 16 '20 at 22:17

1 Answers1

14

In assume role request need to set sts client & it worked

@Bean
@Primary
public DynamoDbClient amazonDynamoDB() {
    final AssumeRoleRequest assumeRoleRequest = AssumeRoleRequest.builder().roleSessionName(UUID.randomUUID().toString()).roleArn("roleArn").build();
    final StsClient stsClient = StsClient.builder().region(Region.EU_WEST_1).build();
    final StsAssumeRoleCredentialsProvider  stsAssumeRoleCredentialsProvider = StsAssumeRoleCredentialsProvider.builder().stsClient(stsClient).refreshRequest(assumeRoleRequest).build();
    return DynamoDbClient.builder().credentialsProvider(stsAssumeRoleCredentialsProvider).region(Region.EU_WEST_1)
            .build();
}
pravinbhogil
  • 657
  • 1
  • 9
  • 13
  • 2
    This was a requirement of the v1 SDK, and I was hoping that it was no longer required in the v2 SDK because it's [not documented](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsAssumeRoleCredentialsProvider.Builder.html). +1 for doing the debugging. – kdgregory Jan 30 '21 at 13:12
  • but there is no `stsClient` method mentioned in the [documentatiion for StsAssumeRoleCredentialsProvider.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsAssumeRoleCredentialsProvider.Builder.html) – Thayne May 11 '23 at 19:56