Terraform创建AWS RDS PostgreSQL无法连接及EC2 SSH问题求助
AWS RDS PostgreSQL & EC2 SSH连接故障排查方案
问题描述
通过Terraform在AWS创建PostgreSQL RDS实例,控制台显示状态正常,但DBeaver无法连接;同时EC2实例无法建立SSH连接,怀疑是网络连接问题。相关Terraform代码如下:
RDS模块代码 (postgres-db/main.tf)
# postgres-db/main.tf resource "aws_db_instance" "default" { allocated_storage = 20 storage_type = "gp2" engine = var.engine engine_version = var.engine-version instance_class = var.instance-class db_name = var.db-name identifier = var.identifier username = var.username password = var.password port = var.port publicly_accessible = var.publicly-accessible db_subnet_group_name = var.db-subnet-group-name parameter_group_name = var.parameter-group-name vpc_security_group_ids = var.vpc-security-group-ids apply_immediately = var.apply-immediately skip_final_snapshot = true }
RDS实例调用代码
module "service-db" { source = "./postgres-db" apply-immediately = true db-name = var.service-db-name db-subnet-group-name = data.terraform_remote_state.server.outputs.db_subnet_group identifier = "${var.app-name}-db" password = var.service-db-password publicly-accessible = true # TODO: True for now, but should be false username = var.service-db-username vpc-security-group-ids = [data.terraform_remote_state.server.outputs.security_group_allow_internal_postgres] }
安全组代码
resource "aws_security_group" "allow_internal_postgres" { name = "allow-internal-postgres" description = "Allow internal Postgres traffic" vpc_id = aws_vpc.vpc.id ingress { from_port = 5432 to_port = 5432 protocol = "tcp" cidr_blocks = [aws_vpc.vpc.cidr_block, "0.0.0.0/0"] # TODO: Remove public IP } }
已尝试修改安全组规则、设置实例公开可访问,问题仍未解决。
排查与解决步骤
一、RDS PostgreSQL连接故障排查
确认公网访问配置生效
- 登录AWS控制台进入RDS实例详情,查看「连接性与安全性」→「公有可访问性」是否为「是」。若为「否」,即使安全组放开规则,也无法从公网访问,需通过Terraform更新
publicly_accessible参数并重新执行apply。
- 登录AWS控制台进入RDS实例详情,查看「连接性与安全性」→「公有可访问性」是否为「是」。若为「否」,即使安全组放开规则,也无法从公网访问,需通过Terraform更新
验证DB子网组路由配置
- RDS关联的DB子网组内的所有子网,必须绑定包含
0.0.0.0/0指向互联网网关(IGW)的路由表。进入VPC控制台→「子网」→找到DB子网组对应的子网→查看关联路由表,确认存在IGW的默认路由。
- RDS关联的DB子网组内的所有子网,必须绑定包含
补全安全组出站规则
- 当前安全组仅配置了5432端口的入站规则,RDS需要出站流量完成DNS解析、服务同步等操作,需添加全量出站规则:
egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] }
- 当前安全组仅配置了5432端口的入站规则,RDS需要出站流量完成DNS解析、服务同步等操作,需添加全量出站规则:
测试端口可达性
- 本地执行
nc -zv <rds-endpoint> 5432或telnet <rds-endpoint> 5432,确认端口是否能正常连通:- 连接超时:网络层面存在阻塞(路由、安全组或本地网络限制)
- 连接被拒绝:RDS未正常启动或端口配置错误
- 本地执行
检查参数组配置
- 确认RDS关联的参数组中,
listen_addresses参数值为*(默认已配置),否则实例仅监听内部地址,无法响应外部连接。
- 确认RDS关联的参数组中,
二、EC2 SSH连接故障排查
确认实例公网访问能力
- 检查EC2实例是否分配了弹性公网IP(EIP),或实例所在子网的「自动分配公有IP」选项是否开启。
- 验证EC2关联的安全组是否添加了22端口入站规则:允许你的本地公网IP(或临时用
0.0.0.0/0测试)访问22端口。
验证子网路由配置
- 若EC2在公有子网,路由表必须包含
0.0.0.0/0指向IGW;若在私有子网,需通过NAT网关访问公网,同时确保安全组允许出站流量。
- 若EC2在公有子网,路由表必须包含
排除本地网络限制
- 尝试切换网络(如手机热点)测试SSH连接,确认是否是本地防火墙、公司网络封禁了22端口。
三、通用网络排查要点
- 检查VPC DNS配置
- 进入VPC控制台→「你的VPC」→确认「DNS主机名」和「DNS解析」均设为「启用」,否则RDS无法生成可解析的公网端点,EC2也无法正常解析域名。
- 查看日志定位具体错误
- 在CloudWatch中查看RDS的日志,获取连接失败的具体错误(如认证失败、端口未监听);查看EC2的系统日志,确认SSH服务是否正常启动。
内容的提问来源于stack exchange,提问作者Emir Mert ÇAMLI
相关产品推荐
相关产品推荐

