설명
RDS DB 서브넷 그룹에 포함할 서브넷의 CidrBlock에 0.0.0.0/0을 지정하거나 Ipv6CidrBlock에 ::/0을 지정하면 유효하지 않은 AWS 서브넷 구성이 됩니다. 이 값들은 전체 주소 공간을 나타내므로 서브넷에 할당할 수 있는 범위를 선택해야 합니다.
서브넷의 주소 범위와 라우트의 목적지는 서로 다릅니다. 인터넷 게이트웨이로 향하는 직접 경로가 있는 서브넷은 공개 서브넷입니다. 10.0.0.0/24 같은 사설 주소 범위를 사용해도 공개 서브넷일 수 있습니다. 내부 전용 데이터베이스는 서브넷 그룹, 라우팅, PubliclyAccessible, 보안 그룹을 함께 구성해 필요한 연결만 허용해야 합니다.
잠재적 영향
- 유효하지 않은 서브넷 CIDR은 리소스 생성이나 업데이트 실패로 이어질 수 있습니다.
- 주소 범위만 보고 내부 전용 네트워크라고 판단하면 의도하지 않은 인터넷 연결 경로를 남길 수 있습니다. 공개 주소와 네트워크 접근 권한이 함께 허용되면 외부에서 데이터베이스에 연결을 시도할 수 있습니다.
해결 방법
- VPC 주소 범위 안에서 AWS가 지원하는 서브넷 CIDR을 선택하고, 다른 서브넷과 겹치지 않도록 하세요. 유지 관리와 장애 조치에 필요한 여유 주소도 확보하세요.
- 내부 전용 데이터베이스에는 인터넷 게이트웨이로 직접 연결되지 않는 서브넷을 사용하세요. DB 서브넷 그룹의 모든 서브넷과 라우트를 검토하고
PubliclyAccessible: false및 필요한 클라이언트만 허용하는 보안 그룹을 구성하세요. 변경 전에 애플리케이션의 사설 연결 경로를 준비하고 연결을 테스트하세요. - 배포 위치의 서브넷 그룹 요구 사항을 확인하세요. 일반적인 리전 배포에는 서로 다른 두 가용 영역의 서브넷이 필요하며 Local Zone에는 별도 예외가 있습니다. 필수 속성과 참조, 기존 데이터베이스에 대한 변경 영향을 검증하세요.
예시
아래는 서브넷 CIDR을 비교하는 불완전한 템플릿입니다. 변경 전의 mySubnet1 정의와 두 예시의 DBSubnetGroupDescription, VpcId, 데이터베이스 생성에 필요한 속성이 생략되어 있습니다. 변경 후에도 일반적인 리전 배포에 필요한 두 가용 영역의 구성이 없습니다. 논리 ID가 서로 다르므로 기존 스택을 업데이트할 때는 대상 리소스를 확인하세요.
변경 전
yaml
Resources:
Positive1:
Type: AWS::RDS::DBInstance
Properties:
DBSubnetGroupName:
Ref: myDBSubnetGroup
myDBSubnetGroup:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
SubnetIds:
- Ref: mySubnet1
- Ref: mySubnet2
mySubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 0.0.0.0/0
변경 후
yaml
Resources:
Negative1:
Type: AWS::RDS::DBInstance
Properties:
DBSubnetGroupName:
Ref: myDBSubnetGroup0
myDBSubnetGroup0:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
SubnetIds:
- Ref: mySubnet10
mySubnet10:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
설명:
- 변경 전:
0.0.0.0/0은 유효한 AWS 서브넷 CIDR이 아닙니다. 공개 서브넷은 이 값을 주소 범위로 지정해서 만드는 것이 아니라 라우팅을 통해 구성합니다. - 변경 후:
10.0.0.0/24는 VPC 범위 안에 있고 다른 서브넷과 겹치지 않으면 사용할 수 있는 크기의 CIDR입니다. 내부 전용 접근을 보장하려면 예시에 없는 라우트, 공개 접근 설정과 보안 그룹도 구성해야 합니다.