通过AWS ALB+WAF访问EKS部署的pgAdmin4报AttributeError求助
问题场景
将新版pgAdmin4部署为AWS EKS Pod,通过配置HTTPS证书的公网ALB+WAF对外提供服务,后端数据库为同VPC内的AWS RDS。多数功能正常,但执行部分查询时触发以下报错:
Traceback (most recent call last): File "/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/venv/lib/python3.11/site-packages/flask_login/utils.py", line 290, in decorated_view return current_app.ensure_sync(func)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/pgadmin4/pgadmin/tools/sqleditor/__init__.py", line 979, in poll conn._Connection__async_cursor._query) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute '_query'
特殊情况:直接通过Pod端口转发或K8s Service访问时,所有查询均可正常执行。
根因分析
报错核心是pgAdmin4异步查询的状态轮询过程中,异步游标对象变为None。结合仅通过ALB访问时出现问题的现象,主要原因是ALB的闲置超时设置过短,导致长连接被提前断开:
pgAdmin4的SQL编辑器采用异步查询模式,前端会定期向后端轮询查询状态。若ALB的闲置超时时间短于查询执行时长或轮询间隔,ALB会强制断开后端连接,导致后端丢失异步查询的上下文,最终触发NoneType属性访问错误。此外,WAF规则或K8s Service会话亲和性配置不当也可能引发类似问题。
解决方案
1. 调整ALB闲置超时时间
ALB默认闲置超时为60秒,将其调整为更长时间(如300秒),确保异步查询的整个生命周期内连接不会被中断:
- AWS控制台操作:进入ALB配置页面,在「属性」中找到「闲置超时」,修改为目标值。
- AWS CLI命令:
aws elbv2 modify-load-balancer-attributes --load-balancer-arn <你的ALB ARN> --attributes Key=idle_timeout.timeout_seconds,Value=300
2. 排查WAF规则干扰
暂时禁用WAF,测试查询是否恢复正常。若恢复,检查WAF中是否存在限制长连接、请求超时的规则,调整规则以允许pgAdmin4的异步查询相关请求。
3. 配置pgAdmin4反向代理参数
在pgAdmin4的config_local.py中添加以下配置,确保后端正确解析ALB传递的代理头,维持连接上下文:
PROXY_X_FOR_COUNT = 1 PROXY_X_PROTO_COUNT = 1 PROXY_X_HOST_COUNT = 1
4. 开启K8s Service会话亲和性
确保pgAdmin4对应的K8s Service开启ClientIP会话亲和性,避免同一用户的请求被分发到不同Pod,导致异步查询上下文丢失。在Service YAML中添加:
spec: sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 300
内容的提问来源于stack exchange,提问作者Anton Balashov

