Testcontainers + Localstack +AWS Java SDK 2.x

Al usar localstack en las pruebas y el sdk 2.x de AWS para Java no es tan simple como sacar el endpoint y el credential provider de localstack y pasarlo al cliente de aws, hay que constuir primeros los objetos del sdk 2 para pasarlos al cliente con datos que entrega localstack:

  1. private static LocalStackContainer ls = null;
  2. @BeforeAll
  3. public static void before() {
  4. ls = new LocalStackContainer(DockerImageName.parse("localstack/localstack"))
  5. .withServices(DYNAMODB);
  6. ls.start();
  7. final var credentials = ls.getDefaultCredentialsProvider().getCredentials();
  8. final var ddbc = DynamoDbClient.builder()
  9. .endpointOverride(ls.getEndpointOverride(DYNAMODB))
  10. .credentialsProvider(
  11. StaticCredentialsProvider.create(AwsBasicCredentials.create(
  12. credentials.getAWSAccessKeyId(),
  13. credentials.getAWSSecretKey()))).build();
  14. }

ese el código para construir el cliente de dynamo usando el endpoint override (eso fue simple) y el credential provider (eso fue un poco más de trabajo) usando el access key y secret key

también dejo los imports:

  1. import org.junit.jupiter.api.AfterAll;
  2. import org.junit.jupiter.api.BeforeAll;
  3. import org.junit.jupiter.api.Test;
  4. import org.testcontainers.containers.localstack.LocalStackContainer;
  5. import static org.testcontainers.containers.localstack.LocalStackContainer.Service.DYNAMODB;
  6. import org.testcontainers.utility.DockerImageName;
  7. import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
  8. import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
  9. import software.amazon.awssdk.services.dynamodb.DynamoDbClient;