«Исключение DynamoDB: Была запрошена неизвестная операция.» проблема при использовании контейнера докеров LocalStack, тестовые контейнеры Java

#java #spring #docker #amazon-dynamodb #localstack

Вопрос:

У меня есть приложение, которое использует DynamoDB. Я поднимаю Динамо с докером и работаю с ним, используя DynamoDbClient. На самом деле, я уже некоторое время использую docker для dynamo. Я использовал библиотеку testcontainers и создал GenericContainer с изображением «amazon/dynamodb-local:последняя версия». И все было хорошо. Но недавно я начал использовать другие технологии AWS, такие как S3 и SQS, поэтому я решил использовать контейнер LocalStack для всех этих технологий. Используйте одни и те же клиенты и конфигурацию. И все хорошо с S3 и SQS, но Dynamo начал отказывать в методе executeStatement, который обрабатывает мои состояния PartiQL(для меня важно использовать именно PartiQL, а не встроенные методы в sdk для Java), за исключением «Исключение DynamoDbException: была запрошена неизвестная операция». Я не могу понять, в чем проблема, потому что я изменил только контейнер docker. Вот мой код для повышения докера:

 private static final DockerImageName DOCKER_IMAGE_NAME = DockerImageName.parse("localstack/localstack")
            .withTag("latest");

GenericContainer<?> localStackContainer = new LocalStackContainer(DOCKER_IMAGE_NAME)
                .withServices(SQS, S3, DYNAMODB)
localStackContainer.start();
 

Конфигурация:
(Это написано на scala, но это не важно для этого вопроса)
*Порт в конечной точке динамически заменяется портом, созданным докером

 dynamodb {
    region = "eu-central-1"
    endpoint = "http://localhost:4569"
    accessKeyId = "DEFAULT_ACCESS_KEY"
    secretAccessKey = "DEFAULT_SECRET"
    sessionToken = "DEFAULT_SESSION_TOKEN"
}
 

Создание клиента:

 @Bean
    public DynamoDbClient dynamodb(final GlobalConfiguration globalConfiguration) {
        GlobalConfiguration.Dynamodb ddb = globalConfiguration.dynamodb();
        URI uri = URI.create(ddb.endpoint());
        Region region = Region.of(ddb.region());
        AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(ddb.accessKeyId(), ddb.secretAccessKey());
        StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create(awsBasicCredentials);
        return DynamoDbClient.builder()
                .endpointOverride(uri)
                .region(region)
                .credentialsProvider(staticCredentialsProvider)
                .build();
    }
 

Место, где код не работает:

 dynamoDbClient.executeStatement(builder -> builder.statement(query));
 

Ответ №1:

Похоже, реализация DynamoDB localstack пока не поддерживает PartiQL. Надеюсь, скоро!