
– 서로 격리된 네트워크 환경을 만드는 기본 구조
운영 환경에서는 하나의 VPC만 사용하는 경우도 있지만, 보안 분리, 서비스 경계, 테스트 환경 분리 등의 이유로 VPC를 여러 개 나누는 경우도 많다.
예를 들어, 하나는 웹 서버용 퍼블릭 VPC, 다른 하나는 백엔드나 DB 서버용 VPC로 사용하는 식이다.
이번 글에서는 CloudFormation으로 VPC 두 개를 동시에 구성하고, 각 VPC마다 퍼블릭 서브넷, IGW, 라우팅 테이블, EC2 인스턴스까지 완전히 독립된 상태로 설정해보자.
이번 실습에서는 다음과 같은 구성을 만든다:
각 VPC는 자체 IGW, 서브넷, 라우팅 테이블을 가지며, 서로 완전히 격리된 네트워크 환경이다.

MyVPC06:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC06
퍼블릭 서브넷, IGW, 라우팅 테이블, EC2 인스턴스(MyWeb1)까지 구성한다.
기존과 크게 다르지 않지만, CIDR 대역을 VPC 2와 겹치지 않게 설정하는 것이 중요하다.
MyVPC07:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.1.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC07
여기에도 퍼블릭 서브넷과 EC2 인스턴스를 구성한다.
MyWeb2, MyWeb3 인스턴스는 나중에 로드 밸런서와 연결할 예정이다.
각 인스턴스는 자신이 속한 VPC와 서브넷에 배치되고, 보안 그룹도 별도로 설정된다. UserData를 활용해서 웹 서버를 자동으로 띄우고, 테스트 페이지를 출력하도록 한다.
예시:
UserData:
Fn::Base64: !Sub |
#!/bin/bash
hostnamectl --static set-hostname MyWeb2
echo "toor1234." | passwd --stdin root
sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
systemctl restart sshd
yum install -y httpd
systemctl enable --now httpd
echo "<h1>MyWeb2 test web page</h1>" > /var/www/html/index.html
MyWeb1, MyWeb2, MyWeb3는 모두 퍼블릭 IP를 가지고 있으므로 외부에서 바로 접속 가능하다.
보안 그룹에는 HTTP, HTTPS, SSH 포트를 모두 열어두었다.
각 VPC마다 별도의 IGW와 라우팅 테이블을 설정해주어야 한다.
이때도 0.0.0.0/0 → IGW 경로를 명시적으로 등록해주는 것이 핵심이다.
MyPublic2Default:
Type: AWS::EC2::Route
DependsOn: MylGW2attachment
Properties:
RouteTableId: !Ref MyPublic2Routing
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW2
각 인스턴스에 퍼블릭 IP가 할당되므로, 브라우저에서 직접 http://<퍼블릭_IP>로 접속했을 때
MyWeb1, MyWeb2, MyWeb3 각각의 테스트 웹 페이지가 정상 출력되는지 확인하면 된다.


지금까지 하나의 CloudFormation 템플릿 안에서 두 개의 독립된 VPC를 생성하고, 각각 퍼블릭 서브넷과 인스턴스를 배치하는 구성을 완성했다.
이제 이 구성을 바탕으로 서로 다른 VPC 간의 통신을 구성하거나, 로드 밸런서와 연결해서 트래픽을 분산시키는 구조로 확장할 수 있다.