728x90
[Terraform] AWS Custom VPC 생성
AWS 콘솔에서 VPC를 생성하면 클릭 클릭으로 매우 간단하게 생성이 된다,
미리 보기를 보면 어떤 리소스들이 생성되는지 확인이 가능하다.
테라폼으로 Custom VPC를 생성하기 위해선 위와 같은 리소스들을 모두 생성해줘야 한다.
1. VPC 생성
vpc.tf 라는 새로운 파일을 하나 생성해준다.
위의 리소스를 모두 생성하려면 코드가 매우 길어지니 주석으로 분리를 해준다.
#aws_vpc
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
enable_dns_support = true
enable_dns_hostname = true
tags = {
Name = "tf-vpc"
}
}
- enable_dns_support
- enable_dns_hostname
: True로 설정하면 DNS 호스트 이름을 자동으로 받아온다
2. IGW (인터넷 게이트웨이) 생성
VPC 리소스가 인터넷 간의 통신을하기 위해서 IGW를 생성해줘야 한다.
위에서 생성한 VPC의 ID를 가져온다
#aws_internet_gateway
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.vpc.id
tag = {
Name = "tf-igw"
}
}
3. 서브넷 생성
- 퍼블릭 서브넷
map_public_ip_on_launch = true 옵션을 사용하면 public subnet 생성 가능
#aws_subnet (public)
resource "aws_subnet" "subnet_a" {
vpc_id = aws_vpc.vpc.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
availability_zone = "ap-northeast-2a"
tags = {
Name = "tf-subnet-a-01"
}
}
resource "aws_subnet" "subnet_c" {
vpc_id = aws_vpc.vpc.id
cidr_block = "10.0.2.0/24"
map_public_ip_on_launch = true
availability_zone = "ap-northeast-2c"
tags = {
Name = "tf-subnet-c-02"
}
}
- 프라이빗 서브넷
#aws_subnet (private)
resource "aws_subnet" "private_subnet_a" {
vpc_id = aws_vpc.vpc.id
cidr_block = "10.0.3.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "tf-private-subnet-a-01"
}
}
resource "aws_subnet" "private_subnet_C" {
vpc_id = aws_vpc.vpc.id
cidr_block = "10.0.4.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "tf-private-subnet-c-02"
}
}
4. Route Table
- 퍼블릭 라우팅 테이블
인터넷 간 통신해야하기 때문에 IGW로 경로를 지정해준다
#aws_route_table (public)
resource "aws_route_table" "rtb_pub" {
vpc_id = aws_vpc.vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "tf-rtb-public"
}
}
- 프라이빗 라우팅 테이블
확장성을 위해서 라우팅 테이블을 따로 놓아줌
#aws_route_table (private)
resource "aws_route_table" "rtb_private_01_a" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "tf-rtb-private-01-a"
}
}
resource "aws_route_table" "rtb_private_02_c" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "tf-rtb-private-02-c"
}
}
서브넷 <-> 라우팅 테이블 매핑
#aws_route_table_association
resource "aws_route_table_association" "a" {
subnet_id = aws_subnet.subnet_a.id
route_table_id = aws_route_table.rtb_pub.id
}
resource "aws_route_table_association" "c" {
subnet_id = aws_subnet.subnet_c.id
route_table_id = aws_route_table.rtb_pub.id
}
resource "aws_route_table_association" "a-private" {
subnet_id = aws_subnet.private_subnet_a.id
route_table_id = aws_route_table.rtb_private_01_a.id
}
resource "aws_route_table_association" "c-private" {
subnet_id = aws_subnet.private_subnet_C.id
route_table_id = aws_route_table.rtb_private_02_c.id
}
5. NAT GW 생성 (선택 사항)
보안을 위해서 퍼블릭 서브넷을 사용하지 않고 NAT를 사용하고 싶다면 사용
저는 돈이없어서 .... 😢
NAT를 생성하기위해선 고정 IP (Elastic IP) 가 필요하다
#aws_nat_gateway
resource "aws_eip" "eip" {
vpc = true
}
NAT 생성
resource "aws_nat_gateway" "nat" {
allocation_id = aws_eip.eip.id
subnet_id = aws_subnet.subnet_a.id
tags = {
Name = "NAT-gw"
}
}
라우팅 테이블 매핑 추가
resource "aws_route_table" "rtb_private_01_a" {
vpc_id = aws_vpc.vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_nat_gateway.nat.id
}
tags = {
Name = "tf-rtb-private-01-a"
}
}
6. Instance 생성
subnet_id를 추가해줌
resource "aws_instance" "web" {
ami = "ami-0c9c942bd7bf113a2" #ubuntu 22.04
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.web.id]
subnet_id = aws_subnet.subnet_a.id
user_data = templatefile("userdata.tftpl", {
server_port = var.server_port
})
tags = {
Name = "tf-ec2"
}
}
SG 그룹도 수정
resource "aws_security_group" "web" {
vpc_id = aws_vpc.vpc.id
name = var.security_group_name
description = "Allow HTTP inbound traffics"
ingress {
description = "HTTP from VPC"
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
7. 실행
terraform apply --auto-approve
콘솔도 확인해보자
반응형
'📚 IaC > Terraform' 카테고리의 다른 글
[Terraform] LoadBalancer 생성 (0) | 2023.07.04 |
---|---|
[Terraform] Key-Pair 생성 후 EC2 인스턴스 SSH 접속 (0) | 2023.07.03 |
[Terraform] 템플릿 파일(Templatefile) (0) | 2023.06.21 |
[Terraform] 테라폼 변수와 출력 (0) | 2023.06.20 |
[Terraform] Terraform으로 AWS EC2 서버 배포하기 (2) (0) | 2023.06.12 |