使用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
相关产品推荐
相关产品推荐

