#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. Надеюсь, скоро!