You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接故障排查

  1. 确认公网访问配置生效

    • 登录AWS控制台进入RDS实例详情,查看「连接性与安全性」→「公有可访问性」是否为「是」。若为「否」,即使安全组放开规则,也无法从公网访问,需通过Terraform更新publicly_accessible参数并重新执行apply。
  2. 验证DB子网组路由配置

    • RDS关联的DB子网组内的所有子网,必须绑定包含0.0.0.0/0指向互联网网关(IGW)的路由表。进入VPC控制台→「子网」→找到DB子网组对应的子网→查看关联路由表,确认存在IGW的默认路由。
  3. 补全安全组出站规则

    • 当前安全组仅配置了5432端口的入站规则,RDS需要出站流量完成DNS解析、服务同步等操作,需添加全量出站规则:
      egress {
        from_port   = 0
        to_port     = 0
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]
      }
      
  4. 测试端口可达性

    • 本地执行nc -zv <rds-endpoint> 5432或telnet <rds-endpoint> 5432,确认端口是否能正常连通:
      • 连接超时:网络层面存在阻塞(路由、安全组或本地网络限制)
      • 连接被拒绝:RDS未正常启动或端口配置错误
  5. 检查参数组配置

    • 确认RDS关联的参数组中,listen_addresses参数值为*(默认已配置),否则实例仅监听内部地址,无法响应外部连接。

二、EC2 SSH连接故障排查

  1. 确认实例公网访问能力

    • 检查EC2实例是否分配了弹性公网IP(EIP),或实例所在子网的「自动分配公有IP」选项是否开启。
    • 验证EC2关联的安全组是否添加了22端口入站规则:允许你的本地公网IP(或临时用0.0.0.0/0测试)访问22端口。
  2. 验证子网路由配置

    • 若EC2在公有子网,路由表必须包含0.0.0.0/0指向IGW;若在私有子网,需通过NAT网关访问公网,同时确保安全组允许出站流量。
  3. 排除本地网络限制

    • 尝试切换网络(如手机热点)测试SSH连接,确认是否是本地防火墙、公司网络封禁了22端口。

三、通用网络排查要点

  1. 检查VPC DNS配置
    • 进入VPC控制台→「你的VPC」→确认「DNS主机名」和「DNS解析」均设为「启用」,否则RDS无法生成可解析的公网端点,EC2也无法正常解析域名。
  2. 查看日志定位具体错误
    • 在CloudWatch中查看RDS的日志,获取连接失败的具体错误(如认证失败、端口未监听);查看EC2的系统日志,确认SSH服务是否正常启动。

内容的提问来源于stack exchange,提问作者Emir Mert ÇAMLI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:45:27