2015-07-26 18 views
7

Sono abbastanza nuovo per la primavera in generale, così come Amazon AWS, quindi mi scuso in anticipo se sto facendo qualcosa di terribilmente sbagliato.Spring Boot e Amazon AWS - come connettersi a S3 utilizzando Spring Cloud AWS?

Non riesco a ottenere la mia applicazione Spring Boot per comunicare con i servizi AWS in alcun modo quando distribuito su Elastic Beanstalk. Ho seguito la guida here per provare a impostare correttamente il mio progetto.

sto prendendo in sostanza il codice che forniscono e si tenta di eseguire dal mio progetto:

@Component 
public class Storage { 

    @Autowired 
    private ResourceLoader resourceLoader; 

    Logger logger = LoggerFactory.getLogger(this.getClass()); 

    public Storage() { 

    } 

    public void writeResource() throws IOException { 
     Resource resource = this.resourceLoader.getResource("s3://server-images/rootFile.log"); 
     WritableResource writableResource = (WritableResource) resource; 
     try (OutputStream outputStream = writableResource.getOutputStream()) { 
      outputStream.write("test".getBytes()); 
     } 
    } 
} 

Super, sembra abbastanza semplice. Ho anche impostato il mio file di application.properties:

cloud.aws.credentials.accessKey = A******A 
cloud.aws.credentials.secretKey = i******K 

cloud.aws.credentials.instanceProfile = true 
cloud.aws.region.auto = true 

così mi sono messo la chiave e segreto nel profilo, e poi, infine, aggiungo la roba per il file build.gradle per ottenere la roba Primavera Cloud:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.4.RELEASE") 
     classpath("io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 
apply plugin: 'war' 
apply plugin: "io.spring.dependency-management" 

war { 
    baseName = 'server' 
    // version = '0.0.1' 
} 

dependencyManagement { 
    imports { 
     mavenBom 'org.springframework.cloud:spring-cloud-aws:1.0.2.RELEASE' 
    } 
} 

//jar { 
// baseName = 'gs-spring-boot' 
// version = '0.1.0' 
//} 

repositories { 
    mavenCentral() 
    jcenter() 
} 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

configurations { 
    providedRuntime 
} 

dependencies { 
    // tag::jetty[] 
    // compile("org.springframework.boot:spring-boot-starter-web") { 
    // exclude module: "spring-boot-starter-tomcat" 
    //} 
    compile("org.springframework.boot:spring-boot-starter-web") 
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") 

    // Spring Cloud AWS 
    compile 'org.springframework.cloud:spring-cloud-starter-aws' 

    //compile("org.springframework.boot:spring-boot-starter-jetty") 
    // end::jetty[] 
    // tag::actuator[] 
    compile("org.springframework.boot:spring-boot-starter-actuator") 
    compile("org.springframework.boot:spring-boot-starter-thymeleaf") 
    // end::actuator[] 
    testCompile("junit:junit") 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.4' 
} 

Infine, non so quanto questo sia importante, ma ho dato "AmazonS3FullAccess" e "AmazonEC2FullAccess" al ruolo elasticbeanstalk in AWS. Ho anche impostato le autorizzazioni per "Everyone" da elencare/caricare/eliminare.

Finora, tutto quello che ottiene è:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:644) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:295) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:68) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:113) 
    at org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:59) 
    at org.springframework.boot.context.web.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:106) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:673) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NullPointerException: null 
    at app.data.Storage.readTerminator(Storage.java:44) 
    at app.controllers.CodeController.getCode(CodeController.java:54) 
    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:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    ... 54 common frames omitted 

Come posso vedere, la resourceLoader non sta ottenendo nulla

Forse c'è qualche problema di autorizzazione? Forse l'ho configurato male? Immagino che questo non dovrebbe essere così difficile, quindi sto sicuramente facendo qualcosa di sbagliato! Se qualcuno ha qualche idea, è più che benvenuto.

+0

Saw questo post, e io sono uno studente come siete :) http://stackoverflow.com/questions/23407515/amazons3-connection-management –

risposta

3

Brian.

Se la causa è permessi errati si dovrebbe verificare se il vostro utente (vi ha creati IAM) dispone di autorizzazioni corrispondenti (Politiche):

AmazonS3FullAccess, AWSConnector

Spero che questo vi aiuterà.

+0

ho finito ammaraggio primavera Cloud e solo in esecuzione con la libreria del client AWS. Comunque grazie per la risposta! – Brian

+0

Ho avuto lo stesso problema, +1 Vladimir :) – fgonzalez

0

Verificare se il criterio del bucket consente di inserire gli oggetti non crittografati. Se questo non è il motivo, potrebbero esserci altri motivi per cui AWS S3 non consentirebbe il caricamento degli oggetti. Quando si utilizza la libreria AWS nativa, impostano molti valori predefiniti, ma le librerie primarie potrebbero non impostare tali valori predefiniti.

Stavo ricevendo lo stesso errore, fino a quando ho capito che il mio criterio bucket stava bloccando qualsiasi oggetto non crittografato da caricare.

{ 
     "Sid": "RequiredEncryptedPutObject", 
     "Effect": "Deny", 
     "Principal": "*", 
     "Action": "s3:PutObject", 
     "Resource": "arn:aws:s3:::my-bucket/*", 
     "Condition": { 
      "StringNotEquals": { 
       "s3:x-amz-server-side-encryption": [ 
        "AES256", 
        "aws:kms" 
       ] 
      } 
     } 
    }, 
Problemi correlati