설명
RDS의 publicly_accessible은 인스턴스의 공개 주소 사용을 제어합니다. 공개 접근이 활성화되어 있고 서브넷 라우팅과 보안 그룹도 외부 연결을 허용하면 인터넷에서 데이터베이스 연결을 시도할 수 있습니다. 실제 데이터 접근에는 데이터베이스 인증과 권한도 필요합니다.
내부 연결만 필요한 데이터베이스는 공개 주소를 사용하지 않도록 구성하고, 필요한 애플리케이션과 관리 경로만 허용해야 합니다.
잠재적 영향
- 데이터베이스 접근이 필요 없는 외부 클라이언트도 데이터베이스 연결을 시도할 수 있는 경로가 생깁니다.
- 유출된 자격 증명이나 과도한 권한 등이 함께 있으면 무단 데이터 조회·변경 위험이 커질 수 있습니다. 공개 주소만으로 인증 없이 데이터에 접근할 수 있는 것은 아닙니다.
해결 방법
- 내부용 인스턴스에는
publicly_accessible = false를 명시하세요. 모듈을 사용한다면 입력값이 실제 인스턴스 설정에 반영되는지 확인하세요. - 직접적인 인터넷 경로가 없는 서브넷을 사용하고 보안 그룹과 네트워크 ACL로 필요한 클라이언트만 허용하세요. 외부 사설망에는 VPN이나 Direct Connect 등 필요한 프라이빗 연결을 준비하고 DNS와 인증을 시험하세요.
- 공개 접근 변경은
apply_immediately와 관계없이 즉시 적용되며 DB 자체의 중단은 발생하지 않지만, 공개 경로를 쓰던 클라이언트는 연결을 잃을 수 있습니다. 대체 경로를 먼저 확인하고terraform plan에서 함께 적용되는 다른 변경의 영향도 검토하세요.
예시
아래 부분 예제는 같은 리소스의 공개 접근 설정을 바꿉니다. 지원되는 db_instance_class, 같은 VPC의 DB 서브넷 그룹과 필요한 보안 그룹 ID 변수를 정의하세요. 라우팅과 접근 규칙을 구성하고 RDS가 관리하는 비밀번호와 Terraform 상태에 대한 접근도 보호해야 합니다.
변경 전
hcl
resource "aws_db_instance" "public_instance" {
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
db_subnet_group_name = var.db_subnet_group_name
vpc_security_group_ids = var.db_security_group_ids
publicly_accessible = true
}
변경 후
hcl
resource "aws_db_instance" "public_instance" {
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
db_subnet_group_name = var.db_subnet_group_name
vpc_security_group_ids = var.db_security_group_ids
publicly_accessible = false
}
설명:
- 변경 전: 공개 주소를 사용하도록 설정합니다. 실제 외부 연결에는 라우팅과 보안 그룹의 허용도 필요합니다.
- 변경 후: 공개 주소 사용을 비활성화합니다. 필요한 클라이언트가 프라이빗 경로로 연결되고 올바른 인증과 권한을 사용하는지 확인하세요.