
1. 개요
Terraform 을 통해 간단한 AWS VPC 구성을 해보려고 한다. default vpc 하나를 두고 public, private subnet 을 구성한 다음 IGW 와 NAT 를 두어볼 것이다. 전체 구성도는 아래와 같다.

2. 테라폼 코드 작성
테라폼 파일 구조의 경우에는 root 의 main.tf 에는 version 설정과 region 설정을 위한 provider 를 구성하고 custom_vpc 폴더를 만들어 vpc 를 구성시키는 코드를 작성하여 root 의 main 에서 module 호출을 통해 vpc 를 구성시킨다. 전체적인 파일구조는 아래와 같다.
.
├── custom_vpc
│ └── main.tf
└── main.tf
2-1. ./main.tf
terraform {
required_providers {
// version 설정
aws = {
source = "hashicorp/aws"
version = "4.48.0"
}
}
}
// region 설정
provider "aws" {
region = "ap-northeast-2"
}
// vpc 구성을 위해 만든 모듈 호출
module "default_custom_vpc" {
source = "./custom_vpc"
}
2-2. ./custom_vpc/main.tf
// default vpc 생성
resource "aws_vpc" "default" {
// cidr 설정
cidr_block = "10.0.0.0/16"
// console 에서 확인할 수 있는 name 설정
tags = {
Name = "default_vpc"
}
}
// public subnet 생성
resource "aws_subnet" "public_subnet_1" {
// vpc 의 id 값을 통해 연결
vpc_id = aws_vpc.default.id
cidr_block = "10.0.0.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "public_subnet_1"
}
}
// private subnet 생성
resource "aws_subnet" "private_subnet_1" {
vpc_id = aws_vpc.default.id
cidr_block = "10.0.100.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "private_subnet_1"
}
}
// private 에 연결할 nat 생성
resource "aws_nat_gateway" "private_nat" {
connectivity_type = "private"
subnet_id = aws_subnet.private_subnet_1.id
}
// igw 생성
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.default.id
}
3. 결과
마지막으로 결과는 작성한 terraform 코드를 실행하고 제대로 생성이 되었는지 AWS console 화면에서 살펴본다.
3-1. terraform init
먼저 init 명령어를 통해 미리 선언해 두었던 provider 플러그인을 설치한다. 그러면 아래 사진과 같이 파일들이 생긴다.

3-2. terraform plan
다음으로 작성한 코드들을 통해 AWS 에 실제로 생성이 가능한지 확인을 위한 plan 명령어를 실행한다. 그리고 적용하게 될 때 어떤 작업들이 진행되는지 보여준다. 위 코드를 plan 하게 되면 아래와 같이 다섯 개의 리소스가 생성되는 것을 확인할 수 있다. (vpc, public_subnet, private_subnet, igw, nat)

3-3. terraform apply
그리고 apply 를 통해 plan 에서 확인했던 내용을 실행한다. 다만 plan 에서는 정상적으로 적용가능한 것으로 나와도 실제 apply 시에는 실패할 수 있다. plan 시에는 로컬에 있는 기준으로 수행이 가능한지 아닌지를 보기 때문에, 만약 AWS 에 이미 생성되어 있는 리소스를 terraform 통해 다시 생성하려고 하면 plan 시에는 생성 가능하다고 나올지라도 실제로 apply 해보면 실패하는 경우가 발생하기도 한다. 마지막으로 위 코드를 apply 진행해 보고 AWS console 에서 vpc 대시보드를 확인해 보면 아래와 같이 생성된 리소스들을 확인할 수 있다.
