代码之家  ›  专栏  ›  技术社区  ›  Shadowman

使用Apache Camel测试Localstack AWS

  •  0
  • Shadowman  · 技术社区  · 7 年前

    我想利用 localstack

    我已经通过输入。。。

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

    然后,我上传了一个测试文件到这个bucket。。。

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

    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();  
    

    最后,我创建了一个Camel路由,用于将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>
    

    但是,当我的应用程序启动并尝试运行路由时,会出现以下异常:

    创建路由s3test: 路由(s3test)[来自[aws-s3://arn:aws:s3:::mytestbucket?亚马逊。。。 因为无法在执行HTTP请求:mytestbucket.localhost 在 org.jboss.weld.bootstrap.events.AfterDeploymentValidationImpl.fire(AfterDeploymentValidationImpl.java:28) org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:499) 在 在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失败: 路由(s3test)[来自[aws-s3://arn:aws:s3:::mytestbucket?亚马逊。。。 因为无法在执行HTTP请求:mytestbucket.localhost org.apache.camel.impl.RouteService.warmUp(RouteService.java:147)网址 在 org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3856) org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3642) 在 在 org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:209) 在 org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3253) 在 在 org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3272) 在 org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3249) 在 org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 在 在 org.apache.camel.impl.DefaultCamelContext$Proxy$\u WeldClientProxy.start(未知 来源)在 org.apache.camel.cdi.cdicameleextension.afterDeploymentValidation(cdicameleextension.java:425) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)上 调用(StaticMethodInjectionPoint.java:95) 在 在 在 org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:123) 在 在 org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:286) org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:285) 在 org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:273) org.jboss.weld.event.ObserverNotifier.firevent(ObserverNotifier.java:177) 在 org.jboss.weld.event.ObserverNotifier.firevent(ObserverNotifier.java:171) 在 org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:53) org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:35) 执行HTTP请求:mytestbucket.localhost 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1064) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) 在 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) 在 执行(AmazonHttpClient.java:513) 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4330) 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4277) 在 在 com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:835) 在 在 org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 在 在org.apache.camel.impl.RouteService.warmUp(RouteService.java:145) ... 42其他原因:java.net.UnknownHostException: java.net.InetAddress.getAllByName0(InetAddress.java:1280)位于 java.net.InetAddress.getAllByName(InetAddress.java:1192)位于 com.amazonaws.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:27) 在 com.amazonaws.http.DelegatingDnsResolver.resolve(DelegatingDnsResolver.java:38) 在 org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:111) 在 连接(poolighttpclientconnectionmanager.java:353) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在com.amazonaws.http.conn.$Proxy246.connect(未知源)上 org.apache.http.impl.execchain.MainClientExec.estureroute(MainClientExec.java:380) org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72) 在 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)

    我以为自从我 AmazonS3 客户明确表示 http://localhost:4572 是我的端点,那么它不应该接触到实际的S3服务。似乎是这样,但出于某种原因,它试图访问 mytestbucket.localhost 好像它是一个网络主机。知道我在这里可能做错什么了吗?或者为什么这个路由/配置不起作用?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Shadowman    7 年前

    对于遇到此问题的任何其他人,答案在于创建这样的客户端:

    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);
    

    关键是 .withPathStyledAccessEnabled(true)