서브넷 CIDR에 /0을 지정한 RDS 구성

RDS 서브넷에 유효한 주소 범위를 사용하고 라우팅과 접근 제어를 함께 확인하세요. /0은 AWS 서브넷에 사용할 수 없는 CIDR 크기입니다.

설명

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의 /0 CIDR은 AWS 서브넷에 사용할 수 없으므로 배포할 수 없는 구성입니다.
  • 변경 후: 두 서브넷을 같은 VPC의 서로 다른 가용 영역에 두고 유효한 사설 주소 범위를 지정합니다. 주소 범위 수정과 별도로 실제 라우팅과 접근 제어를 확인하세요.

참조