프로젝트/컴파일 설치로 AWS 3-Tier 구축하기(+테라폼)

[Terraform AWS 3Tier 1] 테라폼으로 네트워크 구축(VPC, Subnet, IGW, Route Table, NAT)

su-mmer 2023. 10. 6. 17:26
728x90

구성에 맞추어 아래 네트워크 구성을 작성하겠습니다.

  • VPC
  • Public Subnet 1, 2
  • Private Subnet 1, 2, 3, 4, 5
  • NAT Gateway
  • Internet Gateway
  • Route Table

환경 세팅

테라폼 버전입니다.

 

aws configure 되어있는 상태입니다.

 

코드 작성

기본 설정

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~>4.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-2"

  default_tags {
    tags = {
      Name = "terraform-frog"
    }
  }
}

aws 버전과 태그를 지정하지 않았을 때 자동으로 설정될 기본 태그를 설정했습니다.

 

VPC와 서브넷

# vpc
resource "aws_vpc" "main" {
  cidr_block = "10.0.180.0/24"
}

# public subnet
resource "aws_subnet" "public-2a" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.0/28"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "public-2a-nat"
  }
}

resource "aws_subnet" "public-2c" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.64/28"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "public-2c-bastion"
  }
}

# private subnet
resource "aws_subnet" "private-1a-web" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.16/28"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "private-1a-web"
  }
}

resource "aws_subnet" "private-1a-was" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.32/28"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "private-1a-was"
  }
}

resource "aws_subnet" "private-1a-db" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.48/28"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "private-1a-db"
  }
}

resource "aws_subnet" "private-1c-web" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.80/28"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "private-1c-web"
  }
}

resource "aws_subnet" "private-1c-was" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.180.96/28"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "private-1c-was"
  }
}

VPC cidr는 작게 주었습니다.

용도에 맞게 이름과 AZ를 설정해주었습니다.

 

라우팅 테이블과 인터넷 게이트웨이

# routing table 생성 - public subnet, igw 연결
resource "aws_route_table" "public_route_table" {
  vpc_id = aws_vpc.main.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main_igw.id
  }
  tags = {
    Name = "public_rt"
  }
}
# default routing table- private subent, nat 연결
resource "aws_default_route_table" "default_routing_table" {
  default_route_table_id = aws_vpc.main.default_route_table_id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_nat_gateway.main_nat.id
  }
  tags = {
    Name = "default_rt"
  }
}
# routing table에 public subnet 추가
resource "aws_route_table_association" "routing_a" {
  subnet_id      = aws_subnet.public-2a.id
  route_table_id = aws_route_table.main_route.id
}

resource "aws_route_table_association" "routing_c" {
  subnet_id      = aws_subnet.public-2c.id
  route_table_id = aws_route_table.main_route.id
}

# igw
resource "aws_internet_gateway" "main_igw" {
  vpc_id = aws_vpc.main.id
  tags = {
    Name = "terraform-frog-igw"
  }
}

라우팅 테이블은 통신이 어디로 갈지 적어둔 이정표 입니다.

여기서 '통신이 어디로 갈지'가 라우팅입니다.

서브넷이 통신을 하기 위해 라우팅 테이블에 IP를 보내면 테이블에서 해당하는 destination으로 통신을 연결합니다.

0.0.0.0은 구체적으로 정해진 cidr_block 외의 모든 IP 대역을 뜻합니다.

라우팅 테이블에는 기본적으로 내부 통신을 위한 destination(local)이 있습니다.

여기서는 추가적으로 정해진 cidr이 없기 때문에 local을 제외한 모든 통신 요청이 게이트웨이로 향합니다.

 

퍼블릭 서브넷은 외부와 통신이 가능하도록 하기 위해 인터넷 게이트웨이를 직접 연결합니다.

프라이빗 서브넷이 외부와 통신하기 위해서는 NAT 게이트웨이를 연결해줍니다.

 

새로운 라우팅 테이블을 생성(public_route_table)하고 인터넷 게이트웨이를 연결합니다.

라우팅 테이블에 서브넷을 연결하기 위해서는 aws_route_table_association 리소스를 사용해야 합니다.

ap-northeast-2a, c에 존재하는 퍼블릭 서브넷 2개를 main_route에 연결해주었습니다.

 

기본 라우팅 테이블은 VPC를 만들면 자동으로 생성됩니다. 해당 테이블은 직접 연결해주지 않은 서브넷이 모두 연결되어 있습니다.

기본 라우팅 테이블에 NAT 게이트웨이를 연결합니다. 프라이빗 서브넷이 외부와 통신할 때 방향을 지정해 줄 테이블입니다. 기본 라우팅 테이블에는 프라이빗 서브넷 전체가 들어갑니다.

 

 

NAT 게이트웨이 추가

# nat
resource "aws_eip" "nat-eip" {
  tags = {
    Name = "nat-eip"
  }
}
resource "aws_nat_gateway" "main_nat" {
  allocation_id = aws_eip.nat-eip.id
  subnet_id = aws_subnet.public-2a.id
  tags = {
    Name = "frog-nat"
  }
}

NAT에 EIP가 필요하므로 함께 생성해줍니다.

NAT는 ap-northeast-2a 영역에 있는 퍼블릭 서브넷에 생성하겠습니다.

 

다음은 퍼블릭 서브넷 2에 bastion 서버를 생성해보겠습니다.

 

해당 코드입니다.

https://github.com/su-mmer/terraform-aws-3tier/blob/dc2d3cb35512fb0dee1c6be0bd06489073cdb5a0/main.tf

 

728x90