问题描述
我有使用 DynamoDB 的应用程序。我使用 docker 提升 Dynamo 并使用 DynamoDbClient 使用它。实际上,我一直在使用 docker 作为 dynamo。我使用了 testcontainers lib 并使用“amazon/dynamodb-local:latest”图像创建了 GenericContainer。一切都很好。但最近我开始使用其他 AWS 技术,例如 S3 和 SQS,因此我决定将 LocalStack Container 用于所有这些技术。使用相同的客户端和配置。 S3 和 SQS 一切都很好,但是 Dynamo 开始在处理我的 PartiQL statments 的 executeStatement 方法上失败(对我来说完全使用 PartiQL,而不是 Java sdk 中的嵌入式方法),但有异常 “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上的,但对于这个问题并不重要) *端点中的端口动态替换为 docker 创建的端口
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));
解决方法
看起来像 localstack 的 DynamoDB 实现 doesn't support PartiQL just yet。希望快点!