“DynamoDbException:请求了一个未知的操作”使用 LocalStack docker 容器、Java testcontainers 时的问题

问题描述

我有使用 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。希望快点!