AWS Lambda执行Neptune查询超时,EC2可正常访问该如何排查?
故障排查与解决方案
- 网络配置校验
首先确认Lambda已部署在与Neptune集群相同的VPC下,且关联的安全组已开放出站到Neptune集群8182端口的规则;同时Neptune集群的安全组需开放允许Lambda安全组访问8182端口的入站规则。
另外确认Lambda部署的子网与Neptune子网路由可达,无网络ACL拦截8182端口流量。 - IAM权限校验
若环境变量USE_IAM设为true,需给Lambda执行角色添加neptune-db:connect权限,资源配置为你的Neptune集群ARN,示例权限如下:{ "Version": "2012-10-17", "Statement": [ { "Action": "neptune-db:connect", "Resource": "arn:aws:neptune-db:<区域>:<账号ID>:<集群资源ID>/*", "Effect": "Allow" } ] } - 代码错误修正
你当前代码getConnectionDetails的else分支中硬编码了my database endpoing(存在拼写错误,应为endpoint),若USE_IAM为false需替换为实际的Neptune端点,不要保留测试值。 - 连接初始化逻辑修正
这是最可能导致请求挂起的核心原因:DriverRemoteConnection建立WebSocket连接是异步过程,你当前的同步初始化逻辑在首次调用时,连接还未完成握手就直接返回了遍历源g,导致查询无响应。
需要将连接初始化逻辑改为异步,等待连接就绪后再返回,示例修正代码:
对应修改index.ts的调用逻辑:// connection.ts 修改部分 let conn = null; let g = null; export async function connection(){ // 原有getConnectionDetails、createRemoteConnection、createGraphTraversalSource逻辑保持不变 if (conn == null){ console.info("Initializing connection") conn = createRemoteConnection(); // 新增等待连接就绪逻辑 await conn.connect(); g = createGraphTraversalSource(conn); } return g; }import {connection} from "./connection" export async function handler(event, context): Promise<any> { const g = await connection() console.log("before query") const user = await g.V('1').values("name").next(); console.log("after query") return user } - 额外配置优化
可在创建DriverRemoteConnection时添加超时、心跳配置,避免无限制挂起:
也可在handler开头添加const c = new DriverRemoteConnection( url, { mimeType: 'application/vnd.gremlin-v2.0+json', headers: headers, connectTimeout: 10000, // 连接超时10秒 pingInterval: 60000 // 心跳间隔60秒 });context.callbackWaitsForEmptyEventLoop = false,避免Lambda等待空闲连接导致函数执行超时。
内容的提问来源于stack exchange,提问作者xeroshogun
相关产品推荐
相关产品推荐

