发出外部HTTPS请求时,AWS Lambda超时

时间:2019-07-05 01:50:21

标签: java aws-lambda firebase-authentication aws-api-gateway firebase-admin

我需要在我的AWS Lambda项目中使用Firebase Admin Java,但是Firebase Auth Admin试图在Google服务器中获取公钥时会抛出SocketTimeoutException。我知道Firebase Admin的配置正确,因为我可以在Tomcat实例中本地运行它,而无需担心。

然后我尝试向诸如https://postman-echo.com/get?foo1=bar1&foo2=bar2之类的测试API发出HTTPS请求,并且它具有相同的行为,并且也会超时,这使我认为这是Lambda调用存在的问题HTTPS请求。

现在我所知道的:

  1. 我的lambda与API网关集成
  2. 我的lambda位于子网中,可以通过Internet网关访问Internet
  3. 我的lambda的安全组已完全开放
  4. 我知道此问题发生在HTTPS请求上,我不确定纯HTTP。这很难测试,因为我找不到一个无法自动从HTTP重定向到HTTPS的API,并且现在无法滚动自己的API。

为了完整起见,我将从Firebase Admin Java获得的SocketTimeoutException留在这里,尽管我不确定在Firebase Admin库中还是AWS Lambda + HTTPS或两者都存在问题一起:

  

[main]错误com.example.project.filters.FirebaseAuthenticationFilter   -解析或验证令牌com.google.firebase.auth.FirebaseAuthException时出错:验证时出错   签名。在   com.google.firebase.auth.FirebaseTokenVerifierImpl.checkSignature(FirebaseTokenVerifierImpl.java:160)   在   com.google.firebase.auth.FirebaseTokenVerifierImpl.verifyToken(FirebaseTokenVerifierImpl.java:92)   在   com.google.firebase.auth.FirebaseAuth $ 4.execute(FirebaseAuth.java:426)   在   com.google.firebase.auth.FirebaseAuth $ 4.execute(FirebaseAuth.java:423)   在   com.google.firebase.internal.CallableOperation.call(CallableOperation.java:36)   在   com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:388)   在   com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:362)   在   com.example.project.filters.FirebaseAuthenticationFilter.filter(FirebaseAuthenticationFilter.java:55)   在   org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:132)   在   org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:68)   在   org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)   在   org.glassfish.jersey.server.ServerRuntime $ 1.run(ServerRuntime.java:269)   在org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:272)在   org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:268)在   org.glassfish.jersey.internal.Errors.process(Errors.java:316)在   org.glassfish.jersey.internal.Errors.process(Errors.java:298)在   org.glassfish.jersey.internal.Errors.process(Errors.java:268)在   org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)   在   org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)   在   org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)   在   com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:91)   在   com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)   在   com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:206)   在   com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:184)   在   com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:76)   在   com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:177)   在   com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:209)   在   com.example.project.StreamLambdaHandler.handleRequest(StreamLambdaHandler.java:39)   在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   在java.lang.reflect.Method.invoke(Method.java:498)在   lambdainternal.EventHandlerLoader $ StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:350)   在   lambdainternal.EventHandlerLoader $ 2.call(EventHandlerLoader.java:888)   在lambdainternal.AWSLambda.startRuntime(AWSLambda.java:293)在   lambdainternal.AWSLambda。(AWSLambda.java:64)在   java.lang.Class.forName0(本机方法),位于   java.lang.Class.forName(Class.java:348)在   lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)由以下原因引起:   java.net.SocketTimeoutException:连接在以下位置超时   java.net.PlainSocketImpl.socketConnect(本机方法)位于   java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)   在   java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)   在   java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)   在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)在   java.net.Socket.connect(Socket.java:589)在   sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666)位于   sun.net.NetworkClient.doConnect(NetworkClient.java:175)在   sun.net.www.http.HttpClient.openServer(HttpClient.java:463)在   sun.net.www.http.HttpClient.openServer(HttpClient.java:558)位于   sun.net.www.protocol.https.HttpsClient。(HttpsClient.java:264)在   sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)在   sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)   在   sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)   在   sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)   在   sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)   在   sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:162)   在   com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:104)   在   com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981)   在   com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager.refresh(GooglePublicKeysManager.java:172)   在   com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager.getPublicKeys(GooglePublicKeysManager.java:140)   在   com.google.firebase.auth.FirebaseTokenVerifierImpl.isSignatureValid(FirebaseTokenVerifierImpl.java:226)   在   com.google.firebase.auth.FirebaseTokenVerifierImpl.checkSignature(FirebaseTokenVerifierImpl.java:152)   ...还有38

1 个答案:

答案 0 :(得分:1)

  

我的lambda位于子网中,可以通过Internet网关访问Internet

仅Internet网关不会提供驻留在VPC上的Lambda功能,以访问Internet。这是因为VPC内的Lambda函数不会接收公共IP地址。您必须使用NAT网关来提供对VPC内Lambda函数的Internet访问。