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

mFe*_*ein 3 java aws-lambda firebase-authentication aws-api-gateway firebase-admin

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

然后我尝试向像 一样的测试 API 发出 HTTPS 请求https://postman-echo.com/get?foo1=bar1&foo2=bar2,并且它具有相同的行为,我也收到超时,这让我认为这是 Lambda 调用 HTTPS 请求的问题。

现在我所知道的:

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

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

[main] ERROR 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) at com.google.firebase.auth.FirebaseAuth$4.execute(FirebaseAuth.java:423) at com.google.firebase.internal.CallableOperation.call(CallableOperation.java:36) at com。 google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:388) 在 com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:362) 在 com.example.project.filters。

Mar*_*k B 8

我的 lambda 位于通过 Internet 网关访问 Internet 的子网内

单独的 Internet 网关不会提供驻留在对 Internet 的 VPC 访问中的 Lambda 函数。这是因为 VPC 内的 Lambda 函数不接收公有 IP 地址。您必须使用 NAT 网关为 VPC 内的 Lambda 函数提供 Internet 访问。

  • 我发现 AWS 实际上提供了一个可以作为 NAT 的 EC2 实例映像,对于 t2.micro 来说它似乎便宜 3 倍,所以我至少现在可能会选择这个选项。 (3认同)
  • 您可以将 EC2 实例配置为 NAT 实例,而不是使用 Amazon 的 NAT 网关,这可能会更便宜,但需要更多管理,并且您需要将其配置在自动扩展组或其他内容中,以便自动处理灾难恢复。 (2认同)