2016-03-30 10 views
0

Ich versuche, eine scala Play-Anwendung als AWS Lambda-Funktion am Beispiel here Die Klasse ist eine einfache Funktion auszuführen:AWS Lambda Play-Scala-Projekt mit VPC wirft Unknown

class PlayTask { 

    // AWS Lambda Handler 
    def exec(event: S3Event): String = WithApplication { App => 
    Play.current.configuration.getString("Play.Lambda.Greet").getOrElse("") 
    } 

    private def WithApplication[A](f: Application => A): A = { 
    val env = Environment(new java.io.File("."), getClass.getClassLoader, Mode.Prod) 
    val context = ApplicationLoader.createContext(env) 
    val app = ApplicationLoader(context).load(context) 
    try { 
     Play.start(app) 
     f(app) 
    } finally { 
     Play.stop(app) 
    } 
    } 
} 

Das Gefäß wird geladen auf S3-Container und verbunden mit VPC für den Zugang zu RDS und Internet. Jedoch beim Verbinden mit VPC und Ausführen von S3 Put-Test bekomme ich den folgenden Fehler.

at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80) [task/:na] 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:62) [task/:na] 
at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:984) [task/:na] 
at com.google.inject.util.Providers$GuicifiedProviderWithDependencies.initialize(Providers.java:149) [task/:na] 
at com.google.inject.util.Providers$GuicifiedProviderWithDependencies$$FastClassByGuice$$2a7177aa.invoke(<generated>) [task/:na] 
at com.google.inject.internal.cglib.reflect.$FastMethod.invoke(FastMethod.java:53) [task/:na] 
at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:57) [task/:na] 
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:91) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80) [task/:na] 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092) [task/:na] 
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80) [task/:na] 
at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:174) [task/:na] 
at com.google.inject.internal.Initializer.injectAll(Initializer.java:108) [task/:na] 
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:174) [task/:na] 
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110) [task/:na] 
at com.google.inject.Guice.createInjector(Guice.java:96) [task/:na] 
at com.google.inject.Guice.createInjector(Guice.java:73) [task/:na] 
at com.google.inject.Guice.createInjector(Guice.java:62) [task/:na] 
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126) [task/:na] 
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93) [task/:na] 
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) [task/:na] 
at example.PlayTask.WithApplication(PlayTask.scala:16) [task/:na] 
at example.PlayTask.exec(PlayTask.scala:9) [task/:na] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_71] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_71] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_71] 
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_71] 
at lambdainternal.EventHandlerLoader$PojoMethodRequestHandler.handleRequest(EventHandlerLoader.java:439) [lambda-sandbox.jar:na] 
at lambdainternal.EventHandlerLoader$PojoHandlerAsStreamHandler.handleRequest(EventHandlerLoader.java:370) [lambda-sandbox.jar:na] 
at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:972) [lambda-sandbox.jar:na] 
at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:231) [lambda-sandbox.jar:na] 
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59) [lambda-sandbox.jar:na] 
at java.lang.Class.forName0(Native Method) [na:1.8.0_71] 
at java.lang.Class.forName(Class.java:348) [na:1.8.0_71] 
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:93) [runtime/:na] 
Caused by: java.net.UnknownHostException: ip-10-0-77-249: unknown error 
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_71] 
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) ~[na:1.8.0_71] 
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) ~[na:1.8.0_71] 
at java.net.InetAddress.getLocalHost(InetAddress.java:1500) ~[na:1.8.0_71] 

Was ich von der java.net.UnknownHostException verstehen ist, dass die Funktion nicht den Hostnamen localhost und fallen zurück auf lokale Loopback finden.

Antwort

0

Es scheint, dass der Fehler auf AWS-Seite war. Nach der gestrigen Ausfallzeit von AWS auf den Lambda-Funktionen ist der Fehler verschwunden. Obwohl ich sehr neugierig bin, was die Ursache war.

1

Das Glas wird auf S3-Container geladen und mit VPC verbunden, um auf RDS und Internet zugreifen zu können.

Wenn Sie den VPC-Zugriff aktiviert haben, haben Sie den Zugriff auf alles außerhalb der VPC deaktiviert. Sie haben der Lambda-Funktion keinen Internetzugriff gegeben, indem Sie die VPC aktiviert haben, Sie haben tatsächlich den Internetzugang entfernt. Außerdem hat die Funktion keinen Zugriff mehr auf die AWS-API-Server. Daher erhalten Sie diesen Fehler, wenn Sie versuchen, auf S3 zuzugreifen. Sie sollten die "Dinge zu wissen" Abschnitt am Ende der this blog post announcing VPC support for Lambda lesen.

Wenn Sie möchten, dass die Lambda-Funktion Zugriff auf das Internet und AWS-APIs und alles andere außerhalb Ihrer VPC hat, müssen Sie eine zu Ihrer VPC hinzufügen.

Wenn Sie nur S3-Zugriff auf Ihre Lambda-Funktion hinzufügen möchten, gibt es eine zusätzliche Option, eine S3 VPC Endpoint zu verwenden.

+0

Vielen Dank für den Kommentar. Ich habe bereits den Zugriff auf das Internet und die AWS-APIs aktiviert, indem ich das NAT-Gateway zu meiner VPC hinzugefügt habe. Es wurde von der AWS-Unterstützung bestätigt, die bestätigte, dass die Konfiguration korrekt ist. Gibt es einen anderen Grund, der den obigen Fehler verursachen könnte? – binshi