我正在开发一个 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.com
或bbc.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 路由表添加适当的路由规则是正确的做法。