Docker容器内通过SSM隧道连接PostgreSQL数据库失败排查
问题现象
我在Docker容器内运行AWS SSM端口转发会话,以此连接远程PostgreSQL数据库,容器端口映射到本地5432端口。使用psql客户端连接时出现以下错误:
psql: 错误:连接到"127.0.0.1"端口5432的服务器失败:服务器意外关闭连接
这可能意味着服务器在处理请求之前或处理过程中异常终止。
环境与调试步骤
本地设备为mac m1,运行psql client 14.11。
[本地设备] 确认5432端口无进程监听,排除端口冲突:
netstat -an | grep LISTEN | grep 5432 echo $? > 1
[容器] Docker容器启动命令如下:
docker run --rm -it -p 5432:5432 \ --entrypoint=/bin/bash \ -v ~/.aws:/home/connect/.aws \ <image_name:version>
所使用的Docker镜像基于Debian,包含Ruby及相关gems,还有psql和mysql客户端。
随后启动AWS SSM会话:
aws ssm start-session --profile <PROFILE> \ --region <REGION> --target <INSTANCE_ID> \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters host=<HOSTNAME>,portNumber=5432,localPortNumber=5432
[本地设备] 确认容器已监听5432端口:
netstat -an | grep LISTEN | grep 5432 > tcp46 0 0 *.5432 *.* LISTEN
尝试连接数据库:
psql -h 127.0.0.1 -p 5432 -U <USER> -d <DB_NAME> -W Password: > psql: 错误:连接到"127.0.0.1"端口5432的服务器失败:服务器意外关闭连接 > 这可能意味着服务器在处理请求之前或处理过程中异常终止。
已尝试的解决方法
- 更换多个端口(5430、5433等),无效果;
- 尝试使用
localhost、127.0.0.1、0.0.0.0作为连接地址,结果一致; - 测试端口映射:将容器8080端口映射到本地,在容器内运行apache2服务,本地浏览器可正常访问,确认端口映射功能正常;
- 在本地直接运行AWS SSM端口转发会话,可成功通过psql客户端连接数据库,排除AWS IAM权限及安全组问题;
问题根因更新
最初推测是psql Mac客户端或Docker存在问题,后经排查确认,该问题为SSM插件的bug:在容器内运行时行为异常,未在端口上触发监听。
内容的提问来源于stack exchange,提问作者Anas Z.
相关产品推荐
相关产品推荐

