他的回复:
先给结论:安全组放通 3306 只是必要条件之一。FunctionGraph 连 VPC 内 RDS 超时,绝大多数不是"安全组没放通",而是下面四件事之一没对上:函数没真正启用 VPC 访问、函数和 RDS 不在同一个 VPC、连接串用的是公网地址、内网域名没解析成功。另外函数默认超时只有 3 秒,连接数据库基本都要调大。动手之前先花一分钟排除非网络原因,否则后面查一圈网络也没用:RDS 实例状态是否正常、连接地址是不是这个实例的(别拿成只读或代理地址)、数据库账号是否允许从该网段登录(user@host)、实例连接数有没有打满、函数所选子网还有没有可用 IP、函数和 RDS 是否在同一 region、RDS 端口是不是 3306。按顺序排查,每步都有明确的判断方法:1. 先确认"VPC 访问"是真的开启了这一步最容易被忽略。FunctionGraph 开启"函数访问VPC内资源"要求函数配置了包含 VPC 管理权限的委托,官方文档的原话是"开启此参数需要函数配置包含VPC管理权限的委托,若基本信息的委托中选择‘未使用任何委托’则无法开启"。权限用 VPC Administrator 可以,按最小权限自定义也可以,只要覆盖 VPC 相关操作。进函数的"配置"页(部分版本叫"设置")→ 权限,确认委托不是"未使用任何委托",且策略里含 VPC Administrator;同一页 → 网络配置,确认"函数访问VPC内资源"是开启状态,并且 VPC、子网都选中;如果开了内网域名解析,委托里还要有 DNS ReadOnlyAccess。判断依据:官方文档的说明是"函数将使用配置的VPC所绑定的网卡进行网络访问,同时禁用函数工作流的默认网卡"。默认网卡没了,函数出口就只剩这张 VPC 网卡,能不能访问公网取决于这个 VPC 有没有配 NAT。2. 函数和 RDS 必须在同一 VPC 内,跨 VPC 要单独打通华为云 FAQ 对"函数如何访问 MySQL"给的答案是:为函数设置与 MySQL 数据库相同的 VPC、子网。同一 VPC 内的不同子网默认是互通的(还要看安全组和网络 ACL);但如果 RDS 在另一个 VPC,光放通安全组没用,需要建对等连接并配置两端路由,或者把函数换到 RDS 所在 VPC。控制台上分别打开函数网络设置和 RDS 实例的"基本信息/网络"页,把 VPC ID 对一遍,别看名字。3. 安全组规则的"源地址"要写函数子网的网段这一步要查两张安全组,不是一张。RDS 侧之外,函数所在 VPC 的默认 default 安全组也有要求,官方原文是"需在默认'default'安全组中配置入方向ICMP规则(源地址为VPC网段)和出方向允许业务端口规则"。RDS 侧入方向:协议端口 TCP:3306,源地址填函数所在子网的 CIDR(换成你自己的网段),比逐个 IP 更省事;函数侧:VPC 控制台进入"安全组",找函数所选 VPC 的 default 安全组,入方向加 ICMP、源为 VPC 网段,出方向放通 3306;确认 RDS 实例绑定的确实是你在改的那个安全组(一个实例可以绑多个安全组,规则是叠加的)。这里要说明一点:ICMP 那条是文档要求,但它只影响 ping 这类探测,不会导致 3306 的 TCP 连接超时。如果 TCP 不通,重点看的是函数侧出方向 3306、RDS 侧入方向 3306 和后面的地址问题。判断方法:VPC 控制台 → 安全组 → 按 VPC 过滤,打开 default 的入/出方向规则逐条对照。很多"安全组已放通"只改了 RDS 那张,函数侧这张从没看过。4. 连接地址必须是 RDS 内网地址开启 VPC 访问后默认网卡被禁用,函数不能再直接出公网。如果代码里连的是 RDS 的公网地址,或者域名解析到公网 IP,表现就是连接超时。RDS 控制台的"连接管理"页会同时给出内网地址和公网地址,同一 VPC 场景要选内网那一行(内网域名或内网 IP)。如果确实需要函数同时访问公网,要么给 VPC 配 NAT 网关,要么接受"开 VPC 访问就没有默认公网出口"这个前提。5. 用内网域名连的话,DNS 解析要单独解决官方 FAQ 的说法是:函数默认无法解析 VPC 内域名,需要给函数配置带 DNS ReadOnlyAccess 和 VPC Administrator 权限的委托。解析失败时,如果代码没单独处理,日志里往往只剩一条连接超时,很容易误判成安全组问题。6. 超时时间:默认 3 秒,连库建议调到 30 秒以上你问的这点确实要调。FunctionGraph 函数默认执行超时时间是 3 秒,可设置范围为 3~259200 秒;同步调用时函数执行时间应在 900 秒内。数据库首次建连 + 冷启动 3 秒很容易不够。函数"配置 → 常规设置"里把超时改到 30 秒或更高,先排除"代码其实连上了但没跑完";同时给驱动设置连接超时:PyMySQL 的 connect_timeout 默认 10 秒,而 read_timeout、write_timeout 默认是 None(不超时),建议显式写成 connect_timeout=5、read_timeout=10,避免问题被拖到函数整体超时;函数里加了数据库驱动(如 PyMySQL)要一起打进依赖包,FunctionGraph 的 Python 运行时不会自带。7. 一段代码把故障分层:DNS / TCP / 认证不要直接上业务代码试,先用标准库把三层分开。下面这段只用 Python 内置模块,能明确区分"域名解析失败""3306 不通""端口通了但登录失败":import socket import time def handler(event, context): host = "" # 换成 RDS 实例的内网 IP 或内网域名 port = 3306 # 实例端口不是 3306 就一起改 if host.startswith(""): return "请先把 host 换成 RDS 的内网地址" t0 = time.time() try: infos = socket.getaddrinfo(host, port, type=socket.SOCK_STREAM) except Exception as e: print("dns failed:", repr(e)) return "dns failed" family, socktype, proto, _, addr = infos[0] print("dns ok:", addr[0], "cost=%.2fs" % (time.time() - t0)) s = socket.socket(family, socktype, proto) s.settimeout(5) t1 = time.time() try: s.connect(addr) print("tcp ok: %s:%d cost=%.2fs" % (addr[0], addr[1], time.time() - t1)) except socket.timeout: print("tcp timeout: %s:%d" % (addr[0], addr[1])) return "tcp timeout" except ConnectionRefusedError as e: print("tcp refused:", repr(e)) return "tcp refused" except Exception as e: print("tcp failed:", repr(e)) return "tcp failed" finally: s.close() return "reachable"注意:先把函数超时调到 30 秒以上再跑,脚本里 socket 等待是 5 秒,DNS 解析本身在 Python 里没有超时参数,别让它被函数的 3 秒默认超时截断。结果怎么读:请先把 host 换成 RDS 的内网地址 → 占位符还没换,先用 RDS"连接管理"页的内网 IP 跑通连通性;dns failed → 域名解析问题,看第 5 步的 DNS 委托,或直接换成内网 IP 再试;tcp timeout → 包被丢了,看第 2、3、4 步:VPC 是否同一张、两侧安全组的 3306 是否放通、连的是不是内网地址;tcp refused → 地址通但端口没人监听:端口填错、实例没起来、或连到了代理/只读地址;tcp ok 但业务代码仍报超时 → 问题在登录/驱动/超时设置,不在网络,直接看 PyMySQL 的报错码。小结你现在的状态是"安全组已放通、连接仍超时",最可能的顺序是:函数实际没有走 VPC 网卡(委托/开关问题)→ 连的是公网地址 → 函数侧 default 安全组出方向没放通 → RDS 安全组源地址没覆盖函数子网 → 内网域名没解析 → 默认 3 秒超时太短。按 1 到 6 逐项对一遍,再用第 7 步的脚本定位,多数情况能直接落到具体一层。如果还是不通,把函数网络设置页的 VPC/子网、RDS 实例的 VPC/子网、安全组入方向规则、以及第 7 步脚本的输出贴出来(密码打码),可以继续往下看。参考文档:· 配置函数的网络环境:https://support.huaweicloud.cn/usermanual-functiongraph/functiongraph_01_0222.html· 创建事件函数(委托与 VPC 访问开关):https://support.huaweicloud.cn/usermanual-functiongraph/functiongraph_01_1441.html· FunctionGraph 的函数执行需要多长时间:https://support.huaweicloud.cn/functiongraph_faq/functiongraph_03_0250.html· FunctionGraph 如何实现域名解析:https://support.huaweicloud.cn/functiongraph_faq/functiongraph_03_0872.html· 设置 RDS for MySQL 安全组规则:https://support.huaweicloud.cn/intl/zh-cn/usermanual-rds-mysql/rds_11_0009.html