끄적이는 보송

[AWS] Terraform으로 간단한 VPC 구성하기 본문

STUDY/Terraform

[AWS] Terraform으로 간단한 VPC 구성하기

끄적이는 보송 2021. 7. 7. 18:46
반응형

Terraform을 통해 최소한의 기능만 하는 정말 간단한 VPC를 다음과 같이 구성하려 한다.

정말 SIMPLE 하다

 

 

1. Provider 구성

먼저 사용하는 Vendor는 AWS, 지역은 서울(ap-northeast-2)을 사용하며 다음과 같이 간단한 코드를 구성했다. 

 

#provider.tf

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

init 명령어로 Initializing 진행되며 Provider를 다운로드하였다. 다운로드하면 다음과 같이 .terraform 폴더가 생긴다.

Terraform 은 내부적으로 AWS의 API를 호출하여 동작하며 그러기 위해선 Library가 필요하다. init 명령어가 그 Library도 다운로드한다.

 

 

 

 

2. VPC & Public Subnet 생성

기본 틀이 되어줄 VPC와 Public Subnet을 생성해 준다. 

 

#vpc.tf

resource "aws_vpc" "simple_vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "simple_vpc"
  }
}

resource "aws_subnet" "public_subnet1" {
  vpc_id = aws_vpc.simple_vpc.id
  cidr_block = "10.0.0.0/24"
 
  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "public_subnet1"
  }
}

resource "aws_subnet" "public_subnet2" {
  vpc_id = aws_vpc.simple_vpc.id
  cidr_block = "10.0.1.0/24"

  availability_zone = "ap-northeast-2b"

  tags = {
    Name = "public_subnet2"
  }
}

 

 

 

 

3. IGW 생성

인터넷 통신을 위한 인터넷 케이트웨이 생성

 

resource "aws_internet_gateway" "IGW" {
  vpc_id = aws_vpc.simple_vpc.id
  tags = {
    Name = "simple_vpc_IGW"
  }
}

 

 

 

 

4. 라우팅 테이블 생성

aws_route_table로 라우팅 테이블 생성 / aws_route_table_association으로 서브넷을 라우팅 테이블에 연결. 하나의 라우팅 테이블로 여러 서브넷에 연결할 수 있으며, 서브넷은 연결된 라우팅 테이블을 참조하여 트래픽을 전달한다.

 

resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.simple_vpc.id

  tags = {
    Name = "public_rt"
  }
}

resource "aws_route_table_association" "public_rt_association_1" {
  subnet_id      = aws_subnet.public_subnet1.id
  route_table_id = aws_route_table.public_rt.id
}

resource "aws_route_table_association" "public_rt_association_2" {
  subnet_id      = aws_subnet.public_subnet2.id
  route_table_id = aws_route_table.public_rt.id
}

 

 

 

 

5. Private Subnet 생성

Public과 다르게 인터넷이 직접 접속하지 못하는 네트워크 대역이다. 생성 방법은 Public과 동일하지만 이것을 IGW 혹은 NAT Gateway에 연결하냐에 따라 Public / Private 이 결정된다.

 

resource "aws_subnet" "private_subnet1" {
  vpc_id     = aws_vpc.simple_vpc.id
  cidr_block = "10.0.2.0/24"

  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "private_subnet1"
  }
}

resource "aws_subnet" "private_subnet2" {
  vpc_id     = aws_vpc.simple_vpc.id
  cidr_block = "10.0.3.0/24"

  availability_zone = "ap-northeast-2b"

  tags = {
    Name = "private_subnet2"
  }
}

 

 

 

 

6. NAT 게이트웨이 생성 및 Private Network 환경 구축

Private Subnet 외부와 통신하기 위해서 NAT Gateway가 필요하며 다수의 서버가 하나의 NAT Gateway를 공유할 수 있다. 즉, 하나의 NAT Gateway IP(EIP)를 다수의 Private 서버가 공유한다는 소리. 그래야 Private 서버도 패키지 업데이트나 써드 파티 API를 인터넷을 통해 사용할 수 있다.

주의: NAT Gateway 생성 시, EIP를 연결해주고 위치는 Public Subnet에 배치해주되 연결은 Private Subnet과 연결해야 한다. 이유는 어쨌거나 NAT Gateway 자체는 외부와 통신이 되어야 하기 때문.

 

이 모든 것이 끝났다면 Plan으로 실행 가능한 코드인지 오류는 없는지 검토하고 Apply로 AWS 인프라에 적용해주자!

 

resource "aws_eip" "nat_ip" {
  vpc   = true

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_nat_gateway" "nat_gateway" {
  allocation_id = aws_eip.nat_ip.id

  subnet_id = aws_subnet.public_subnet1.id

  tags = {
    Name = "NAT_gateway"
  }
}

resource "aws_route_table" "private_rt" {
  vpc_id = aws_vpc.simple_vpc.id

  tags = {
    Name = "private_rt"
  }
}

resource "aws_route_table_association" "private_rt_association1" {
  subnet_id      = aws_subnet.private_subnet1.id
  route_table_id = aws_route_table.private_rt.id
}

resource "aws_route_table_association" "private_rt_association2" {
  subnet_id      = aws_subnet.private_subnet2.id
  route_table_id = aws_route_table.private_rt.id
}

resource "aws_route" "private_rt_nat" {
  route_table_id              = aws_route_table.private_rt.id
  destination_cidr_block      = "0.0.0.0/0"
  nat_gateway_id              = aws_nat_gateway.nat_gateway.id
}

 

아직 EC2는 없지만 실제로 내 AWS 계정에 적용된 것을 확인할 수 있었다. 처음이라 그런지 뿌듯하다. 테라폼을 알기 전까진 직접 콘솔 환경에서 모든 것을 다 했었다. 공부가 끝나면 돈 나가니까 리소스를 직접 기어 나는 대로 지워주다 보니 간혹 가다 남아있는 (EBS 라던지 EIP 라던지 RDS 라던지...) 리소스에 깜짝 과금 선물을 당하곤 했었다. 하지만 테라폼으로 만들어진 인프라는 코드를 수정하건 날리건 해서 테라폼으로 한 번에 지울 수 있으니 신세계 었다. 유용하고 흥미롭다.

 

 

성공이다 :)

 

 

 

vpc.tf
0.00MB
provider.tf
0.00MB

 

 

 

반응형

'STUDY > Terraform' 카테고리의 다른 글

[AWS] Terraform 구조  (0) 2021.07.04
[AWS] Terraform 설치 on Windows 10  (0) 2021.07.04
Comments