使用 Apache Camel 列出来自 Springboot 的 AWS S3 存储桶内容

问题描述 投票:0回答:3

我有一个运行 v2.5.4 的 sprintboot 项目,运行良好。 我可以访问 S3,并且可以列出我创建的存储桶的内容。因此,我想尝试使用 Apache Camel 来尝试仅列出存储桶的内容,根据示例,这应该非常简单。但我不断收到错误。

我在 build.gradle 中添加了 2 个依赖项

implementation group: 'org.apache.camel.springboot', name: 'camel-core-starter', version: '3.13.0'
implementation group: 'org.apache.camel.springboot', name: 'camel-aws2-s3-starter', version: '3.13.0'

然后我简单地创建了一个SimpleRouteBuilder.java

@Component

公共类 SimpleRouteBuilder 扩展 RouteBuilder {

@Override
public void configure() throws Exception {
    from("aws2-s3://bucketName?amazonS3Client=#createS3Client&operation=listObjects&accessKey=xxxAccessKeyxxx&secretKey=xxxSecretKeyxxx")
            .log("Received body: ");
}

我不断收到这个堆栈跟踪

在我的 aws s3 客户端工厂上,我设置了 bean 名称

@Slf4j
@Configuration
public class S3ClientBeanFactory {

    @Bean(name = "s3Client")

这似乎有效 - 当我将名称更改为其他名称时,我得到了 关于此的错误:

No bean could be found in the registry for:S3Client

但是通过在camel端点url中设置“s3client”,我总是得到这个

2021-12-13 12:23:25.036  INFO [,,] 28267 --- [           main] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel 3.13.0 (camel-1) shutdown in 4ms (uptime:511ms)
2021-12-13 12:23:25.045  INFO [,,] 28267 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2021-12-13 12:23:25.069  INFO [,,] 28267 --- [           main] ConditionEvaluationReportLoggingListener : 
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-12-13 12:23:25.085 ERROR [,,] 28267 --- [           main] o.s.boot.SpringApplication               : Application run failed
org.apache.camel.FailedToStartRouteException: Failed to start route route1 because of null
2021-12-13 12:23:25.036  INFO [,,] 28267 --- [           main] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel 3.13.0 (camel-1) shutdown in 4ms (uptime:511ms)
2021-12-13 12:23:25.045  INFO [,,] 28267 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2021-12-13 12:23:25.069  INFO [,,] 28267 --- [           main] ConditionEvaluationReportLoggingListener : 
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-12-13 12:23:25.085 ERROR [,,] 28267 --- [           main] o.s.boot.SpringApplication               : Application run failed
org.apache.camel.FailedToStartRouteException: Failed to start route route1 because of null
    at org.apache.camel.impl.engine.RouteService.warmUp(RouteService.java:123)
    at org.apache.camel.impl.engine.InternalRouteStartupManager.doWarmUpRoutes(InternalRouteStartupManager.java:306)
    at org.apache.camel.impl.engine.InternalRouteStartupManager.safelyStartRouteServices(InternalRouteStartupManager.java:189)
    at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRoutes(InternalRouteStartupManager.java:147)
    at org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3201)
    at org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2863)
    at org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2814)
    at org.apache.camel.spring.boot.SpringBootCamelContext.doStart(SpringBootCamelContext.java:43)
    at org.apache.camel.support.service.BaseService.start(BaseService.java:119)
    at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2510)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:246)
    at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:119)
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:151)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332)
    at dk.danskespil.scratchgames.ScratchgamesApplication.main(ScratchgamesApplication.java:22)
Caused by: software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 403, Request ID: null, Extended Request ID: FknaUW6/yRkYvJry9d8oIWU2hC4aRk7z8ilAZZxlcDN4s+P4bAoyzWVriJxUYj2bCyzCFFMSGNY=)

这个操作不可能吗?或者我缺少什么来做这么简单的操作?

amazon-web-services spring-boot amazon-s3 apache-camel
3个回答
0
投票

我在 Apache Camel 组件 aws2-s3:// 上遇到了同样的问题,这是由 AWS S3 上的权限不足造成的:

Caused by: software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 403, ...)

但我不得不提的是,Amazon SDK 中的 S3Client 非常适合读取具有相同权限 = 相同帐户的文件。

说明:我发现此

aws2-s3:// 组件需要进行 headBucket API 调用(以及其他),这会导致错误,因为没有足够的权限进行此 api 调用。


0
投票
Spring 并不认为配置 bean 是特殊的。路由 bean 可能是在 S3 客户端 bean 之前创建的。

我会尝试在路由 bean 上使用

@DependsOn({"s3ClientBeanFactory"})

 注释。更多信息请参见:
使用 @DependsOn Annotation 控制 Bean 创建顺序


0
投票
也许为时已晚,但可能对遇到同样问题的其他人有用。

您必须在camel注册表中注册software.amazon.awssdk.services.s3.S3Client。要从 .aws 文件夹中获取配置文件的 aws 凭证,您必须提供一个 ProfileCredentialsProvider,指定配置文件名称,如果您没有,则将是默认的,类似的东西对我有用。

@Bean("S3Client") public S3Client s3Client(CamelContext camelContext){ //Depends on the profile name generated in .aws folder, in this case default ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.builder().build(); S3Client s3Client = S3Client.builder() .region(US_EAST_1) .credentialsProvider(credentialsProvider).build(); camelContext.getRegistry().bind("s3Client", s3Client); return s3Client; }
    
© www.soinside.com 2019 - 2024. All rights reserved.