AWS Lambda Timeout при выполнении внешнего запроса HTTPS - PullRequest
0 голосов
/ 05 июля 2019

Мне нужно использовать Firebase Admin Java в моем проекте AWS Lambda, но Firebase Auth Admin выдает SocketTimeoutException, когда пытается получить открытый ключ на серверах Google.Я знаю, что Firebase Admin настроен правильно, потому что я могу запускать его локально в экземпляре Tomcat, не беспокоясь.

Затем я попытался просто сделать HTTPS-запрос к тестовому API, например https://postman-echo.com/get?foo1=bar1&foo2=bar2, и он имеетТакое же поведение, я также получаю тайм-аут, что заставляет меня думать, что это проблема с Lambda, вызывающим HTTPS-запрос.

Теперь, что я знаю:

  1. Моя лямбдаинтегрированный с API-шлюзом
  2. Моя лямбда находится внутри подсети с доступом в Интернет через интернет-шлюз
  3. Моя группа безопасности лямбды широко открыта
  4. Я знаю, что эта проблема возникает при запросах HTTPSЯ не уверен насчет чистого HTTP.Это трудно проверить, потому что я не могу найти там API, который не будет автоматически перенаправлять с HTTP на HTTPS, и я не могу развернуть свой собственный прямо сейчас.

Просто радиДля полноты я оставлю здесь SocketTimeoutException, который я получаю от Firebase Admin Java, хотя я пока не уверен, является ли это проблемой в библиотеке 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 (FirebaseTokenVeruth.g.baseb.baseb).выполнить (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.FirebaseFilter.Java: 55) на org.glassfish.jersey.server.ContainerFilteringStage.apply (ContainerFilteringStage.java:132) на org.glassfish.jersey.server.ContainerFilteringStage.apply (ContainerFilteringStage.java:68) на orgsey.process.j..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.процесс (Errors.java:268) в org.glassfish.jersey.process.internal.RequestScope.runInScope (RequestScope.java:289) в org.glassfish.jersey.server.ServerRuntime.process (ServerRuntime.java:256) в организации.glassfish.jersey.server.ApplicationHandler.handle (ApplicationHandler.java:703) на com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter (JerseyHandlerFilter.java:91) на com.amazonaws.serverless.prolet.ternal.FilterChainHolder.aContainerHandler.handleRequest (JerseyLambdaContainerHandler.java:184) по адресу com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest (JerseyLambdaContainerHandler.java:76) на сайте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 Ответ

1 голос
/ 05 июля 2019

Моя лямбда находится внутри подсети с доступом в Интернет через интернет-шлюз

Один только интернет-шлюз не будет обеспечивать функцию лямбда, находящуюся в доступе VPC к Интернету.Это связано с тем, что лямбда-функции внутри VPC не получают общедоступные IP-адреса.Вы должны использовать NAT-шлюз для обеспечения доступа в Интернет к лямбда-функции внутри VPC.

...