简体   繁体   English

使用Apache Camel测试Localstack AWS

[英]Testing Localstack AWS with Apache Camel

I'm trying to leverage localstack to do local AWS mock testing. 我正在尝试利用localstack进行本地AWS模拟测试。 Specifically, I'd like to download a file from a localstack S3 bucket by using an Apache Camel S3 route. 具体来说,我想使用Apache Camel S3路由从localstack S3存储桶下载文件。 However, I am running into errors. 但是,我遇到了错误。 Here are the steps I've taken... 这是我已采取的步骤...

I've created a test localstack S3 bucket by entering... 我通过输入...创建了一个测试localstack S3存储桶。

aws --endpoint-url=http://localhost:4572 s3 mb s3://mytestbucket

Then, I uploaded a test file to this bucket... 然后,我将测试文件上传到此存储桶...

aws --endpoint-url=http://localhost:4572 s3 cp docker-compose.yml s3://mytestbucket

Both operations completed successfully. 两项操作均成功完成。 In my Java code, I've created a CDI Producer to produce a com.amazonaws.services.s3.AmazonS3 client object... 在我的Java代码中,我创建了一个CDI生产者来生产com.amazonaws.services.s3.AmazonS3客户端对象...

AWSCredentials credentials = new BasicAWSCredentials("XXXXX", "XXXXX");
AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
AmazonS3ClientBuilder clientBuilder = AmazonS3ClientBuilder.standard()
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:4572", "us-east-1"))
                .withCredentials(credentialsProvider);

AmazonS3 s3Client = clientBuilder.build();  

Finally, I created a Camel route designed to download the contents of mytestbucket into a local directory... 最后,我创建了一条骆驼路线,旨在将mytestbucket的内容下载到本地目录中...

<route id="s3test">
        <from
            uri="aws-s3://arn:aws:s3:::mytestbucket?amazonS3Client=#s3Client&amp;deleteAfterRead=false&amp;maxMessagesPerPoll=25&amp;delay=5000" />
        <log message="S3 consumer fired" loggingLevel="DEBUG" />
        <log message="Sending S3 file to ${in.header.CamelAwsS3Key}..." />
        <to
            uri="file://tmp/camel?fileName=${in.header.CamelAwsS3Key}" />
    </route>

However, when my application starts up and attempts to run the route, I get the following Exception: 但是,当我的应用程序启动并尝试运行路由时,出现以下异常:

Caused by: org.jboss.weld.exceptions.DeploymentException: Failed to create route s3test: Route(s3test)[[From[aws-s3://arn:aws:s3:::mytestbucket?amazo... because of Unable to execute HTTP request: mytestbucket.localhost at org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:38) at org.jboss.weld.bootstrap.events.AfterDeploymentValidationImpl.fire(AfterDeploymentValidationImpl.java:28) at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:499) at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:93) at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:97) at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1736) at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1698) ... 6 more Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route s3test: Route(s3test)[[From[aws-s3://ar 原因:org.jboss.weld.exceptions.DeploymentException:无法创建路由s3test:Route(s3test)[[From [aws-s3:// arn:aws:s3 ::: mytestbucket?amazo ...由于无法启用执行HTTP请求:org.jboss.weld.bootstrap.events.AfterDeploymentValidationImpl.fire(AfterDeploymentValidationImpl.fire(AfterDeploymentValidationImpl.java:28)上的org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:38)上的mytestbucket.localhost在org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:499)处在org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:93)在org.jboss.as.weld.WeldStartService.start处(WeldStartService.java:97),位于org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService(ServiceControllerImpl.java:1736),位于org.jboss.msc.service.ServiceControllerImpl $ StartTask.execute(ServiceControllerImpl.java:1698)。 .. 6更多原因:org.apache.camel.FailedToCreateRouteException:创建路由s3test失败:Route(s3test)[[From [aws-s3:// ar n:aws:s3:::mytestbucket?amazo... because of Unable to execute HTTP request: mytestbucket.localhost at org.apache.camel.impl.RouteService.warmUp(RouteService.java:147) at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3949) at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3856) at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3642) at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3494) at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:209) at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3253) at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3249) at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3272) at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3249) at org.apache.cam n:aws:s3 ::: mytestbucket?amazo ...因为无法执行HTTP请求:org.apache.camel.impl.RouteService.warmUp(RouteService.java:147)上的mytestbucket.localhost org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3856)的.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3949)在org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3642) )org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3494)org.apache.camel.impl.DefaultCamelContext.access $ 000(DefaultCamelContext.java:209)org.apache.camel.impl.DefaultCamelContext)位于org.apache.camel.impl.DefaultCamelContext的$ 2.call(DefaultCamelContext.java:3253)位于org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3272)的$ 2.call(DefaultCamelContext.java:3249) org.apache.cam上的org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3249) el.support.ServiceSupport.start(ServiceSupport.java:61) at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3165) at org.apache.camel.impl.DefaultCamelContext$Proxy$_$$_WeldClientProxy.start(Unknown Source) at org.apache.camel.cdi.CdiCamelExtension.afterDeploymentValidation(CdiCamelExtension.java:425) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:95) at org.jboss.weld.injection.MethodInvocationStrategy$SpecialParamPlusBeanManagerStrategy.invoke(MethodInvocationStrategy.java:144) at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:330) at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserv 位于org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3165)的el.support.ServiceSupport.start(ServiceSupport.java:61)位于org.apache.camel.impl.DefaultCamelContext的el.support.ServiceSupport.start(DefaultCamelContext.java:3165)$ Proxy $ _ $$ _ WeldClientProxy在org.apache.camel.cdi.CdiCamelExtension.afterDeploymentValidation(CdiCamelExtension.java:425)的.start(未知源)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62)在org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java)在java.lang.reflect.Method.invoke(Method.java:498)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) :95),位于org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:330)的org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:330)的org.jboss.weld.injection.MethodInvocationStrategy $ SpecialParamPlusBeanManagerStrategy.invoke(MethodInvocationStrategy.java:144)处。 event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserv erMethodImpl.java:123) at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:308) at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:286) at org.jboss.weld.util.Observers.notify(Observers.java:172) at org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:285) at org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:273) at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:177) at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:171) at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:53) at org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:35) ... 12 more Caused by: com.amazonaws.SdkClientException: Unable to execute HTTP request: mytestbucket.localhost at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1114) at com. org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:308)的erMethodImpl.java:123)org.jboss.weld的org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:286)的erMethodImpl.java:123) org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:285)上的.util.Observers.notify(Observers.java:172)在org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.notify(ObserverNotifier.java:273) )的org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:177)的org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:171)的org.jboss.weld.bootstrap.events的)。 org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:35)处的AbstractContainerEvent.fire(AbstractContainerEvent.java:53)... 12个以上原因:com.amazonaws.SdkClientException:无法执行HTTP请求:com上的com.amazonaws.http.AmazonHttpClient $ RequestExecutor.handleRetryableException(AmazonHttpClient.java:1114)上的mytestbucket.localhost。 amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1064) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4330) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4277) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4271) at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:835) at org.apache.camel.component.aws.s3.S3Endpoint. com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute(AmazonHttpClient.java:743)上com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer(AmazonHttpClient。 com.amazonaws.http上的java:717).com.amazonaws.http.AmazonHttpClient $ RequestExecutor.access $ 500(AmazonHttpClient.java:667)上com.amazonaws.http处的Amazon.Http.AmazonHttpClient $ RequestExecutor.execute(AmazonHttpClient.java:699)。 com上的com.amazonaws上的AmazonHttpClient $ RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)。com.amazonaws.services.s3上的http.AmazonHttpClient.execute(AmazonHttpClient.java:513)。com上的AmazonS3Client.invoke(AmazonS3Client.java:4330) com.amazonaws.services.s3上的.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4277)com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4271)上的AmazonS3Client.invoke(AmazonS3Client.java:4271) .java:835),网址为org.apache.camel.component.aws.s3.S3Endpoint。 doStart(S3Endpoint.java:112) at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.impl.RouteService.doWarmUp(RouteService.java:157) at org.apache.camel.impl.RouteService.warmUp(RouteService.java:145) ... 42 more Caused by: java.net.UnknownHostException: mytestbucket.localhost at java.net.InetAddress.getAllByName0(InetAddress.java:1280) at java.net.InetAddress.getAllByName(InetAddress.java:1192) at java.net.InetAddress.getAllByName(InetAddress.java:1126) at com.amazonaws.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:27) at com.amazonaws.http.DelegatingDnsResolver.resolve(DelegatingDnsResolver.java:38) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:111) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) at sun.reflect.NativeMet org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)处的doStart(S3Endpoint.java:112)org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)处的org.apache org.apache.camel.impl.RouteService.warmUp(RouteService.java:145)处的.camel.impl.RouteService.doWarmUp(RouteService.java:157)... 42更多原因:java.net.UnknownHostException:mytestbucket。 localhost在com.amazonaws上的java.net.InetAddress.getAllByName(InetAddress.java:1192)上的java.net.InetAddress.getAllByName0(InetAddress.java:1280)在com.amazonaws上的java.net.InetAddress.getAllByName(InetAddress.java:1126)上的localhost org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.connect(java.111)上的com.amazonaws.http.DelegatingDnsResolver.resolve(DelegatingDnsResolver.java:38)处的。 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)在sun.reflect.NativeMet hodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76) at com.amazonaws.http.conn.$Proxy246.connect(Unknown Source) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) at com.amazonaws.http.apache.client.impl.SdkHttpCli 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)处的hodAccessorImpl.invoke0(本机方法)在java.lang.reflect.Method.invoke(Method.in处)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)处的hodAccessorImpl.invoke0(本机方法) com.amazonaws.http.conn.ClientConnectionManagerFactory $ Handler.invoke(ClientConnectionManagerFactory.java:76)处com.amazonaws.http.conn。$ Proxy246.connect处的java.498(未知源)org.apache.http.impl org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)上的org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec)的.execchain.MainClientExec。建立路由(MainClientExec.java:380 :) .java:184)(位于org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184),位于org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)。 apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)位于com.amazonaws.http.apache.client.impl.SdkHttpCli ent.execute(SdkHttpClient.java:72) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1236) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) ... 57 more com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeOneRequest(AmazonHttpClient.java:1236)上ent.execute(SdkHttpClient.java:72).com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeHelper(AmazonHttpClient.java:1056).. 。57更多

I thought that since my AmazonS3 client specifically indicates that http://localhost:4572 is my endpoint then it should not reach out to the actual S3 service. 我以为,由于我的AmazonS3客户端专门指示http://localhost:4572是我的终端节点,因此它不应该连接到实际的S3服务。 That seems to be the case, but for some reason it is trying to access mytestbucket.localhost as if it were a network host. 似乎是这样,但是由于某种原因,它试图像访问网络主机一样访问mytestbucket.localhost Any idea what I could be doing wrong here or why this route/configuration isn't working? 知道我在这里可能做错了什么,或者为什么该路由/配置不起作用吗?

For anyone else running into this problem, the answer lies in creating the client like this: 对于遇到此问题的其他人,答案在于创建这样的客户端:

AWSCredentials credentials = new BasicAWSCredentials("XXXXX", "YYYYY");
AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
AmazonS3ClientBuilder clientBuilder = AmazonS3ClientBuilder.standard().withPathStyleAccessEnabled(true)
                    .disableChunkedEncoding()
                    .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(S3_ENDPOINT, "us-east-1"))
                    .withCredentials(credentialsProvider);

The key is .withPathStyledAccessEnabled(true) . 密钥是.withPathStyledAccessEnabled(true) Adding that will generate the endpoint URL properly. 添加后将正确生成端点URL。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM