
Terraform으로 인프라를 코드로 정의하면 반복 가능한 환경 구축이 가능하고, 수동 설정보다 훨씬 안정적이다. 특히 AWS 리소스를 수십 개 생성해야 하는 상황에서는 코드로 관리하는 것이 유지보수 측면에서도 유리하다.
이번 글에서는 AWS에서 가장 기본이 되는 네트워크 인프라 구성을 Terraform 코드로 실습해본다.
대상 리소스는 VPC, Subnet, Internet Gateway, Route Table이며, 이후 EC2 배포로 이어진다.
다음과 같은 네트워크 구성을 코드로 정의한다:
이 구조는 가장 기본적인 퍼블릭 네트워크 환경 구성이며, EC2를 외부에서 접속 가능하게 만드는 전제 조건이다.

Terraform이 사용할 AWS 리전을 지정하고, 로컬에 설정된 AWS CLI 프로파일을 통해 인증 정보를 가져온다.
provider "aws" {
region = "ap-northeast-2"
profile = "youngyin" # 로컬 AWS CLI 프로파일
}
VPC는 모든 네트워크 리소스의 기반이 된다. enable_dns_hostnames 옵션을 켜야 퍼블릭 IP에 DNS 이름이 붙는다.
resource "aws_vpc" "MyVPC06" {
cidr_block = "10.0.0.0/16"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "MyVPC06"
}
}
퍼블릭 서브넷을 만들고, EC2 인스턴스가 퍼블릭 IP를 받을 수 있도록 map_public_ip_on_launch = true 옵션을 추가한다.
resource "aws_subnet" "MyPublicSubnet" {
vpc_id = aws_vpc.MyVPC06.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true
tags = {
Name = "MyPublicSubnet"
}
}
외부 인터넷과 연결할 수 있는 게이트웨이를 생성하고 VPC에 연결한다.
resource "aws_internet_gateway" "MyIGW" {
vpc_id = aws_vpc.MyVPC06.id
tags = {
Name = "MyIGW"
}
}
퍼블릭 서브넷에서 인터넷으로 나갈 수 있도록 기본 경로(0.0.0.0/0)를 IGW로 연결하는 라우팅 테이블을 만든다.
resource "aws_route_table" "MyPublicRouting" {
vpc_id = aws_vpc.MyVPC06.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.MyIGW.id
}
tags = {
Name = "MyPublicRouting"
}
}
앞서 만든 라우팅 테이블을 퍼블릭 서브넷에 연결하여, 외부로 나가는 경로가 유효하게 만든다.
resource "aws_route_table_association" "MyPublicRouteTableAssociation" {
subnet_id = aws_subnet.MyPublicSubnet.id
route_table_id = aws_route_table.MyPublicRouting.id
}
이제 Terraform 명령어를 통해 위 구성을 배포할 수 있다.
terraform init # 초기화
terraform plan # 실행 계획 미리보기
terraform apply # 실제 리소스 생성
이 상태에서 EC2 인스턴스를 퍼블릭 서브넷에 배포하면 외부에서 접속이 가능해진다. 물론 보안 그룹과 키페어 설정도 추가해야 한다.
이 글에서는 네트워크 인프라의 가장 기초가 되는 VPC, 서브넷, IGW, 라우팅 테이블을 Terraform으로 구성해보았다.
Terraform을 사용하면 이런 설정을 수십 번 반복해도 일관되게 관리할 수 있고, 실수로 잘못 연결할 가능성도 줄어든다.
다음 글에서는 이 네트워크 위에 EC2 인스턴스를 배포하고, 웹 서버를 띄워 실제 통신이 잘 되는지 확인하는 과정을 이어서 다룰 예정이다.