为什么向我的 AWS Fargate 实例发出 HTTP 请求时我的 Google Cloud Function 会超时?

为什么向我的 AWS Fargate 实例发出 HTTP 请求时我的 Google Cloud Function 会超时?

我正在开发一个 Google 云函数触发器beforeSignIn,它需要从托管在 AWS Fargate 实例上的微服务中获取一些数据。请求超时,但仅限于具有此特定域的 Google 云函数环境中。代码在本地运行良好。

代码的简化版本如下所示:

import { Auth } from 'gcip-cloud-functions';
import fetch from 'node-fetch';

const authClient = new Auth();

export const beforeSignIn = authClient.functions().beforeSignInHandler(async (userRecord, context) => {
  // ...
  const response = await fetch(process.env.MICROSERVICE_URL);
  // ...
});

URL 是从环境变量中读取的。如果我将此环境变量更改为另一个域,例如google.combbc.co.uk,甚至是指向另一个项目中的 Fargate 实例之一的域,则提取在 Google 云函数环境中可以正常工作,并且我会得到有效的响应。

否则,获取请求将超时且云功能将中止并记录以下内容:

Function execution took 20006 ms, finished with status: 'error'
FetchError: request to {url} failed, reason: connect ETIMEDOUT
    at ClientRequest.<anonymous> (file:///workspace/node_modules/node-fetch/src/index.js:108:11)
    at ClientRequest.emit (node:events:513:28)
    at ClientRequest.emit (node:domain:489:12)
    at TLSSocket.socketErrorListener (node:_http_client:502:9)
    at TLSSocket.emit (node:events:513:28)
    at TLSSocket.emit (node:domain:489:12)
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
{
  type: 'system',
  errno: 'ETIMEDOUT',
  code: 'ETIMEDOUT',
  erroredSysCall: 'connect
}

根据 CloudWatch 日志,请求未到达实例。我检查了 AWS 环境的网络配置,没有发现任何明显问题。

答案1

经过一番调查,我发现云功能正在尝试使用 IPv6,但 AWS 环境尚未设置来处理这个问题。

我通过在 VPC 路由表中添加一条新规则解决了该问题::/0,该规则的目标为互联网网关。之前,仅0.0.0.0/0针对互联网网关。

答案2

我很高兴听到您找到了问题的根本原因,并能够通过在 VPC 路由表中添加一条新规则来适应 IPv6 流量来修复它。您通过添加带有目标::/0 的规则并定位到互联网网关,启用了 AWS Fargate 实例和 Google Cloud Function 之间的 IPv6 通信。

为了保持各个系统之间的有效连接,IPv6 支持至关重要,尤其是在使用可能使用 IPv6 地址的云服务时。要允许 IPv6 流量到达您的 AWS 环境,向 VPC 路由表添加适当的路由规则是正确的做法。

相关内容