설명
0.0.0.0/0과 ::/0은 AWS 서브넷에 지정할 수 있는 유효한 CIDR 크기가 아닙니다. 서브넷은 VPC 주소 범위 안에서 지원되는 크기로 할당해야 합니다. 서브넷의 주소 범위와 라우팅 테이블의 목적지 범위는 서로 다릅니다.
서브넷이 공개되어 있는지는 인터넷 게이트웨이로 직접 연결되는 경로 등 라우팅 구성으로 판단합니다. 사설 주소를 사용하는 것만으로 데이터베이스가 격리되지는 않으며, RDS의 publicly_accessible 설정과 보안 그룹도 함께 확인해야 합니다.
잠재적 영향
- 유효하지 않은 서브넷 CIDR은 배포를 실패하게 할 수 있습니다.
- 공개 연결 경로와 넓은 접근 허용 범위가 결합되면 불필요한 데이터베이스 연결 시도가 가능해집니다. 실제 데이터 접근에는 인증과 권한도 필요합니다.
해결 방법
- VPC 주소 범위 안에서 서로 겹치지 않는 유효한 서브넷 CIDR을 사용하세요. DB 서브넷 그룹의 VPC와 필요한 가용 영역 구성을 확인하세요.
- 내부 연결만 필요하면 인터넷 게이트웨이로 직접 연결되지 않는 서브넷을 사용하고
publicly_accessible을false로 설정하세요. 라우팅, 네트워크 ACL과 보안 그룹으로 필요한 애플리케이션·관리 연결만 허용하세요. - 기존 인스턴스의 서브넷 그룹 변경은 중단을 일으킬 수 있습니다.
terraform plan의 교체와 연결 변경을 검토하고 백업·복구 및 작업 시간을 계획한 뒤 실제 클라이언트 접속을 시험하세요.
예시
아래는 서브넷 CIDR을 비교하는 부분 예제입니다. vpc_id, 서로 다른 가용 영역의 az_a·az_b, 지원되는 db_instance_class와 최종 스냅샷 이름을 정의하세요. 예시의 사설 범위는 해당 VPC에 포함되어야 하며 라우팅과 필요한 보안 그룹은 별도로 구성해야 합니다. RDS가 관리하는 비밀번호의 접근 권한과 Terraform 상태도 보호하세요.
변경 전
hcl
resource "aws_db_instance" "public_subnet_example" {
allocated_storage = 20
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
skip_final_snapshot = false
final_snapshot_identifier = var.final_snapshot_identifier
publicly_accessible = false
db_subnet_group_name = aws_db_subnet_group.subnetGroup.name
}
resource "aws_db_subnet_group" "subnetGroup" {
name = "main"
subnet_ids = [aws_subnet.frontend.id, aws_subnet.backend.id]
}
resource "aws_subnet" "frontend" {
availability_zone = var.az_a
vpc_id = var.vpc_id
cidr_block = "10.0.1.0/24"
}
resource "aws_subnet" "backend" {
availability_zone = var.az_b
vpc_id = var.vpc_id
cidr_block = "0.0.0.0/0"
}
변경 후
hcl
resource "aws_db_instance" "public_subnet_example" {
allocated_storage = 20
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
skip_final_snapshot = false
final_snapshot_identifier = var.final_snapshot_identifier
publicly_accessible = false
db_subnet_group_name = aws_db_subnet_group.subnetGroup.name
}
resource "aws_db_subnet_group" "subnetGroup" {
name = "main"
subnet_ids = [aws_subnet.frontend.id, aws_subnet.backend.id]
}
resource "aws_subnet" "frontend" {
availability_zone = var.az_a
vpc_id = var.vpc_id
cidr_block = "10.0.1.0/24"
}
resource "aws_subnet" "backend" {
availability_zone = var.az_b
vpc_id = var.vpc_id
cidr_block = "10.0.2.0/24"
}
설명:
- 변경 전:
backend의/0CIDR은 AWS 서브넷에 사용할 수 없으므로 배포할 수 없는 구성입니다. - 변경 후: 두 서브넷을 같은 VPC의 서로 다른 가용 영역에 두고 유효한 사설 주소 범위를 지정합니다. 주소 범위 수정과 별도로 실제 라우팅과 접근 제어를 확인하세요.