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

使用Terraform创建仅在内网私有子网运行的RDS实例

创建私有子网内的RDS实例(仅内网访问)

看起来你已经搭好了基础VPC环境,接下来只需要补充几个关键组件,就能让RDS完全跑在私有子网里,只允许你的应用访问。下面是具体的实现步骤和代码:

1. 完善私有子网配置

RDS要求DB子网组至少包含两个不同可用区的私有子网,先把你的私有子网补全(示例用两个AZ,可根据你的实际区域调整):

# 私有子网1(AZ us-east-1a)
resource "aws_subnet" "intranet_1" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"

  tags = {
    Environment = "Dev"
    Name        = "Private-Subnet-1"
  }
}

# 私有子网2(AZ us-east-1b)
resource "aws_subnet" "intranet_2" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "us-east-1b"

  tags = {
    Environment = "Dev"
    Name        = "Private-Subnet-2"
  }
}

2. 创建DB子网组

这个组会把你的私有子网关联起来,RDS会在这些子网内部署实例:

resource "aws_db_subnet_group" "private_rds_subnet_group" {
  name       = "private-rds-subnet-group"
  subnet_ids = [aws_subnet.intranet_1.id, aws_subnet.intranet_2.id]

  tags = {
    Environment = "Dev"
  }
}

3. 配置RDS安全组(核心:限制仅应用访问)

创建一个安全组,只允许你的应用服务器所在的安全组访问RDS的数据库端口(示例用MySQL的3306端口,可根据你的数据库类型调整):

# 引用你的应用服务器安全组(替换成你实际的应用安全组名称或ID)
data "aws_security_group" "app_server_sg" {
  name = "app-server-security-group"
}

resource "aws_security_group" "private_rds_sg" {
  name        = "private-rds-security-group"
  description = "Allow inbound traffic only from app servers"
  vpc_id      = aws_vpc.vpc.id

  # 仅允许应用安全组访问RDS的数据库端口
  ingress {
    from_port       = 3306
    to_port         = 3306
    protocol        = "tcp"
    security_groups = [data.aws_security_group.app_server_sg.id]
  }

  # 允许RDS必要的出站流量(如备份、同步等)
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Environment = "Dev"
  }
}

4. 创建私有RDS实例

关键配置:publicly_accessible = false(禁止公网访问),指定上面的DB子网组和安全组:

resource "aws_db_instance" "private_rds" {
  identifier             = "private-dev-rds"
  engine                 = "mysql" # 按需替换为postgresql等其他引擎
  engine_version         = "8.0"
  instance_class         = "db.t3.micro"
  allocated_storage      = 20
  storage_type           = "gp3"
  db_subnet_group_name   = aws_db_subnet_group.private_rds_subnet_group.name
  vpc_security_group_ids = [aws_security_group.private_rds_sg.id]
  
  # 核心:禁止公网访问,确保RDS仅在内网可见
  publicly_accessible    = false
  
  # 数据库认证信息(生产环境建议用Terraform敏感变量或AWS Secret Manager存储,不要硬编码)
  username               = "admin"
  password               = "your-strong-password"

  tags = {
    Environment = "Dev"
    Name        = "Private-Dev-RDS"
  }
}

关键注意点

  • 严格禁用公网访问:publicly_accessible = false是保障内网访问的核心,会让RDS只分配内网IP,完全隔离于公网。
  • 最小权限安全组:绝对不要用0.0.0.0/0开放所有来源,只允许你的应用安全组访问,从网络层面锁定访问范围。
  • 多AZ子网要求:DB子网组必须包含至少两个不同AZ的子网,这是RDS高可用部署的前提(即使你暂时不需要多AZ,也建议按此配置)。

这样配置后,你的RDS实例就完全运行在私有子网内,只有你的应用服务器能通过内网访问它,外部无法连接。

内容的提问来源于stack exchange,提问作者lapots

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:13:20