如何配置 AWS DynamoDB Camel 组件

How to configure AWS DynamoDB Camel component

我正在尝试 POC 通过 Apache Camel 应用程序访问 DynamoDB。显然,Dynamo DB 将 运行 在 AWS 中,但出于开发目的,我们将其 运行 在本地作为 docker 容器。

在本地创建 Dynamo BD table 并手动将一些项目放入其中非常容易。我为此使用了我的 intelij Dynamo DB 控制台,我所需要提供的只是一个自定义端点 http://localhost:8000 和默认凭证提供程序链。

现在,我想在一天中的某些特定时间触发一个作业,该作业将扫描 Dynamo DB 项目并对返回的数据执行一些操作。

from("cron:myCron?schedule=0 */5 * * * *")
        .log("Running myCron scheduler")
        .setHeader(Ddb2Constants.OPERATION, () -> Ddb2Operations.Scan)
        .to("aws2-ddb:myTable")
        .log("Performing some work on items");

当我尝试 运行 我的应用程序时,它无法开始抱怨安全令牌已过期,这让我认为它正在尝试访问 AWS 而不是访问本地。我找不到任何关于如何设置它的信息。 camel dynamo db 组件 (https://camel.apache.org/components/3.15.x/aws2-ddb-component.html) 正在谈论能够使用 DynamoDbClient 配置组件,但这是一个接口,其名为 DefaultDynamoDbClient 的实现不是 public 并且DefaultDynamoDbClientBuilder.

也是

假设您使用 Spring 作为 Camel 运行时启动,在您的情况下,最简单的方法是配置 Camel 使用的 DynamoDbClient,这要归功于 application.properties 中设置的选项,如下所示:

# The value of the access key used by the component aws2-ddb
camel.component.aws2-ddb.accessKey=test
# The value of the secret key used by the component aws2-ddb
camel.component.aws2-ddb.secretKey=test
# The value of the region used by the component aws2-ddb 
camel.component.aws2-ddb.region=us-east-1
# Indicates that the component aws2-ddb should use the new URI endpoint
camel.component.aws2-ddb.override-endpoint=true
# The value of the URI endpoint used by the component aws2-ddb 
camel.component.aws2-ddb.uri-endpoint-override=http://localhost:8000

有关更多详细信息,请参阅这些选项的文档:


对于其他运行时,可以通过编程方式配置如下:

Ddb2Component ddb2Component = new Ddb2Component(context);
String accessKey = "test";
String secretKey = "test";
String region = "us-east-1";
String endpoint = "http://localhost:8000";
ddb2Component.getConfiguration().setAmazonDDBClient(
    DynamoDbClient.builder()
        .endpointOverride(URI.create(endpoint))
        .credentialsProvider(
            StaticCredentialsProvider.create(
                AwsBasicCredentials.create(accessKey, secretKey)
            )
        )
        .region(Region.of(region))
        .build()
);