본문 바로가기

Terraform

[Terraform] 테라폼으로 AWS 네트워크 환경 구축하기

728x90

오랜만에 돌아온 글...

이번엔 Terraform으로 AWS 네트워크 환경을 구축해보자.

 

가장 먼저 VPC를 만들자.

- resource 다음에 있는 aws_vpc는 VPC를 만든다는 의미이다.

- main은 main이라는 변수값을 주어서 다른 리소스 생성 시 참조할 수 있도록 값을 지정하는 것이다.

#vpc
resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"

  tags = {
    Name = "mgthon-vpc-apne2"
  }
}

 

 

그리고 VPC 내부에 서브넷을 만들어야한다.

- vpc_id에는 위에서 생성한 VPC를 참조하여 만들 수 있도록 하고,

- availability_zone을 지정하여서 각각 a와 c에 생성될 수 있도록 한다.

#Public subnet
resource "aws_subnet" "sbn-pub-a" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "mgthon-sbn-public-a"
  }
}

resource "aws_subnet" "sbn-pub-c" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.3.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "mgthon-sbn-public-c"
  }

 

 

Private 서브넷도 한꺼번에 만들자

#Private Subnet
resource "aws_subnet" "sbn-svr-a" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.11.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "mgthon-sbn-private-svr-a"
  }
}

resource "aws_subnet" "sbn-svr-c" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.13.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "mgthon-sbn-private-svr-c"
  }
}

#Private DB Subnet
resource "aws_subnet" "sbn-db-a" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.21.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "mgthon-sbn-private-db-a"
  }
}

resource "aws_subnet" "sbn-db-c" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.23.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "mgthon-sbn-private-db-c"
  }
}

 

 

Subnet만 만들고 끝이면 좋겠지만, 라우팅 테이블도 만들어야 한다.

그러면서 인터넷 게이트웨이, NAT 게이트웨이까지 만들어서 구성할 수 있도록 한다.

 

 

먼저 인터넷 게이트웨이를 생성한다.

#internet gw
resource "aws_internet_gateway" "igw" {
    vpc_id = aws_vpc.main.id

    tags = {
        Name = "mgthon-igw"
    }
}

 

 

퍼블릭 라우팅 테이블은 다음과 같이 만들 수 있다.

- route 부분에 위에서 생성한 internet gateway를 지정한다.

#public route table
resource "aws_route_table" "rt-pub" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.igw.id
  }

  tags = {
    Name = "mgthon-rt-public"
  }
}

 

 

서브넷을 생성했을 때는 기본 라우팅 테이블이 자동으로 생성되어서 붙어있기 때문에, 새로 생성된 라우팅 테이블을 서브넷과 연결해주어야 한다.

#public route table associate
resource "aws_route_table_association" "rt_asso_pub-a" {
    subnet_id = aws_subnet.sbn-pub-a.id
    route_table_id = aws_route_table.rt-pub.id
}
resource "aws_route_table_association" "rt_asso_pub-c" {
    subnet_id = aws_subnet.sbn-pub-c.id
    route_table_id = aws_route_table.rt-pub.id
}

 

 

나머지 Private subnet도 동일하게 진행할 수 있다.

Private subnet에 있는 프라이빗한 리소스들은 NAT 게이트웨이를 통해 인터넷으로부터 연결될 수 있다.

NAT Gateway에는 EIP가 붙는다 따라서 EIP를 먼저 생성하고, nat gateway를 생성하자.

#EIP
resource "aws_eip" "nat_1" {
  tags = {
    Name = "mgthon-eip"
  }
}

#nat gw
resource "aws_nat_gateway" "nat_gw" {
  subnet_id = aws_subnet.sbn-pub-a.id
  allocation_id = aws_eip.nat_1.id

  tags = {
    Name = "mgthon-ntgw"
  }
}

 

 

그리곤 Private Subnet에 부착할 라우팅 테이블을 만들어서 부착까지 하자!

#private route table
resource "aws_route_table" "rt-pri" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_nat_gateway.nat_gw.id
  }

  tags = {
    Name = "mgthon-rt-private-svr"
  }
}

#private route table associate
resource "aws_route_table_association" "rt_asso_pri-a" {
    subnet_id = aws_subnet.sbn-svr-a.id
    route_table_id = aws_route_table.rt-pri.id
}
resource "aws_route_table_association" "rt_asso_pri-c" {
    subnet_id = aws_subnet.sbn-svr-c.id
    route_table_id = aws_route_table.rt-pri.id
}

 

 

마지막으로 DB Subent에 연결할 Routing table까지 생성하자.

Private DB Subnet의 경우, 인터넷 게이트웨이에 연결하지도, NAT에 연결하지도 않기 때문에 아무것도 지정하지 않고 생성하면 된다.

#db route table
resource "aws_route_table" "rt-db" {
  vpc_id = aws_vpc.main.id

  route =[]

  tags = {
    Name = "mgthon-rt-private-db"
  }
}

#db route table associate
resource "aws_route_table_association" "rt_asso_db-a" {
    subnet_id = aws_subnet.sbn-db-a.id
    route_table_id = aws_route_table.rt-db.id
}
resource "aws_route_table_association" "rt_asso_db-c" {
    subnet_id = aws_subnet.sbn-db-c.id
    route_table_id = aws_route_table.rt-db.id
}

 

 

이렇게 하면 아래 아키텍처 리소스를 모두 완성한 것이다! 다음에는 S3를 생성해보자

 

끗-!

728x90