brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Nov 09. 2022

19탄-11. 테라폼으로  AWS 미니 랜딩존 구축

다음은 주말 CloudNet 테라폼 스터디 내용 참고하여  정리한 부분입니다.

https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863



본 내용은 개인적으로 정리한 내용이라 틀릴 수 있습니다.

시작하는 기업에서 참조해 사용하면 좋을거 같습니다.

테라폼 공부하며 계속 업데이트됩니다.


최종 목표는 테라폼으로 최소한의 랜딩존을  구축하는 것이다.

테라폼으로 AWS 구축, 운영 자동화 하기




<1> 랜딩존 이란?

<2> 스타트업에서 테라폼으로 미니 랜딩존 구축하기

<3> 실제 업무 순서 - AWS 계정 생성과 기본 네트워크 구축  작업 순서

<4> 네트워크 구축  하기 - IP설계

<5> IP 넣어  기본 네트워크 구축하기

<100> (몰아보기) AWS 랜딩존 

<200> 테라폼 시작하기~



<1> 랜딩존 이란?


1

비행기 착륙을 안전하게 하는 착륙 지역이란 뜻이다.

안전한 착륙 지점.

AWS의 상품명은 '컨트롤 타워'이다.

비행기가 잘 운항되도록 제어하는 타워.

서비스를 위한 서버, 네트워크 등이 안전하게 구축될 수 있도록 해주는 것이다.

서비스를 운영하기 위한 인프라 기반 설계 구축 자동화이다.

이런 자동화로 빠르게 인프라를 구축하고, 표준화된 정책이 반영된 서버를 구축하는 것이다.


2

4가지를 관리한다.

사용자 계정 생성

시스템 운영정책

네트워크 , 보안 관리

로그 관리



3

나의 정의

크게 2가지를 관리한다.

비용 결제의 일원화 ,비용 결재 계정을 Payer 계정 1개로 통합하는 것.

안정성, 보안, 규정을 준수한 인프라를 코드로 만들어 관리하 것이다.



4

여기서는 '안정성, 보안, 규정 준수한 구축' 일부를 테라폼으로 자동화해 보자.

비즈니스를 하기 위해 기본 구성을 빠르게 자동화 해야 한다.

서버 생성, 로드벨런서 생성 , 디비 생성등은  점차 확대해 나갈 예정이다.



5

우선,  정책이 있어야 한다.  수작업으로 구현이 가능해야 자동화가 가능한 것이다.

실제로 콘솔에서 네트워크를 구성해보자.

이후, 테라폼으로 자동화를 구현할 수 있다.  코드가 이해 된다.





<2> 스타트업에서 테라폼으로 미니 랜딩존 구축하기


1

1단계 : 기본 네트워크 구축을 빠르게 하고, 비즈니스에 집중하자.

2단계 : 기본 네트워크 + 서버 구축을 빠르게 하고, 비즈니스에 집중하자.


2

정책 정의?

네트워크 설계 정책 정의 , IP블럭 정의를 해야한다.

여기서는 사무실 네트워크 ,  AWS 네트워크   2곳만 운영한다고 생각하자.


3

사무실 네트워크와 AWS 네트워크는 네트워크 IP 블록이 중복되지 않도록 구성한다.

사무실과 AWS 간 VPN 등으로 연결하여 통신하려면 동일 대역의 IP를 사용하면 안 된다.

AWS 네트워크  10.0.0.0/10

사무실 네트워크는  10.64.0.0/10

여기서는  AWS 네트워크만 구축하도록 한다.



4

참고

사용 가능 IP 블록

10.0.0.0/8

172.16.0.0/12

192.168.0.0/16


10.0.0.0 - 10.255.255.255 (10/8 접두사)

172.16.0.0 - 172.31.255.255 (172.16/12 접두사)

192.168.0.0 - 192.168.255.255 (192.168/16 접두사)


IPv4 VPC CIDR 블록

https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/configure-your-vpc.html


5

네트워크 정책?

우리는 여기서 10.0.0.0/8 대를 사용하도록 하자.

AWS 데이터 센터는 AZ-A , AZ-C  2곳을 사용하여 이중화한다.

네트워크 서브넷은 WEB, WAS, DB 서브넷으로 구성한다.




<3> 실제 업무 순서 - AWS 계정 생성과 기본 네트워크 구축  작업 순서


테라폼으로 가장 기본적이면서 정책이 반영된 네트워크(이중화된  네트워크)를  구축하자

이후 개발자가 안정적인 네트워크에 환경에서 개발자하도록 하자.


1

개발자 요청

업무 요청 시스템으로 AWS 신규 계정 생성 요청이 온다.

서비스를 하기 위한 기본 네트워크 구축을 해줘야 한다.

신규 개발 계정을 만들어야 한다.


2

클라우드 SE , 네트워크 엔지니어 작업  

작업 준비 , MGMT AWS 계정에서 작업을 한다. - 최초 1회.

명령을 내릴 리눅서 서버 1개 생성한다.

(mac pc라면  리눅스 서버 안만들고  pc에서 작업해도 된다.)


3

AWS 신규  개발  계정 만든다.

계정 생성은 현재 수동이다.

계정 생성하고 오가니제이션으로 Payer계정에 비용 처리를 묶는다.


4

계정 생성후 AWS 신규  개발  계정에서 작업?

서울 리전에 디폴트 VPC는 삭제한다.  IP체계에 맞는 구성을 해야 한다.

Admin role을 가진  계정을 받는다. Access-key , Secret-key를 발급받는다.

비용이 Payer 계정에서 일괄로  나가도록  오가니제이션으로 묶는다.



5

MGMT  AWS 계정에서

MGMT 명령 리눅스 서버에서 테라폼으로,  신규 개발 계정에  신규 개발 네트워크 VPC를 만들어보자.

수동으로 클릭 클릭해 VPC를 만드는 것보다 더 빠르고, 정확하게 만들어진다.

VPC는 10.0.0.0/20  IP 블록을 할당한다. /20을 표준으로 한다.

테라폼을 돌린다.




<4> 네트워크 구축  하기 - IP설계


작업 계정과 작성 내용


1

MGMT  AWS 계정에서

테스트

MGMT 명령 서버에서 s3 버킷 하나 만들어 보기

조회해 보기

콘솔에서 확인해보기



2

masterseo-dev-vpc  만들어 보자.

리눅스 서버에 로그인해 폴더를 만든다.

개발자 계정, 서비스 계정 등 테라폼 파일을 지정할 곳이다.


폴더 Tree


[root@ip-172-31-61-209 vpc]# pwd

/root/dev/vpc



3

IP설계?

전체 블럭은 10.0.0.0/8 로 함.

국내와 해외로 나눔

클라우드와 오피스,IDC로 나눔

AWS블럭 10.0.0.0/12 로 정의함

4

개발자 할당 블럭 ?

AWS블럭 10.0.0.0/12 로 정의함

개발과 서비스 블럭을 정의함 , 10.0.0.0/13 , 10.8.0.0/13


5

기본 VPC는 /20을 기준으로 함. C-Class 16개 할당.

상세 첨부




<5> IP 넣어  기본 네트워크 구축하기


수작업으로 인한 느린 업무처리 속도를 개선함


1

# pub2, pri2, pridb2, nat2

cat <<EOF > provider.tf

provider "aws" {

  region  = "ap-northeast-2"

}

resource "aws_vpc" "main" {

  cidr_block       = "10.0.0.0/20"

  tags = {

    Name = "terraform-101"

  }

}

resource "aws_subnet" "pub1" {

  vpc_id     = aws_vpc.main.id

  cidr_block = "10.0.0.0/23"

  availability_zone = "ap-northeast-2a"

  tags = {

    Name = "101subnet-1"

  }

}

resource "aws_subnet" "pub2" {

  vpc_id     = aws_vpc.main.id

  cidr_block = "10.0.2.0/23"

  availability_zone = "ap-northeast-2c"

  tags = {

    Name = "101subnet-2"

  }

}

resource "aws_internet_gateway" "igw" {

  vpc_id = aws_vpc.main.id

  tags = {

    Name = "main"

  }

}

# default route

resource "aws_route_table" "public" {

  vpc_id = aws_vpc.main.id

  route {

    cidr_block = "0.0.0.0/0"

    gateway_id = aws_internet_gateway.igw.id

  }

    tags = {

    Name = "main-default"

  }

}

resource "aws_route_table_association" "public_association_1" {

  subnet_id      = aws_subnet.pub1.id

  route_table_id = aws_route_table.public.id

}

resource "aws_route_table_association" "public_association_2" {

  subnet_id      = aws_subnet.pub2.id

  route_table_id = aws_route_table.public.id

}

resource "aws_subnet" "pri1" {

  vpc_id     = aws_vpc.main.id

  cidr_block = "10.0.4.0/23"

  availability_zone = "ap-northeast-2a"

  tags = {

    Name = "101subnet-private-1"

  }

}

resource "aws_subnet" "pri2" {

  vpc_id     = aws_vpc.main.id

  cidr_block = "10.0.6.0/23"

  availability_zone = "ap-northeast-2c"

  tags = {

    Name = "101subnet-private-2"

  }

}

resource "aws_subnet" "pri-db1" {

  vpc_id     = aws_vpc.main.id

  cidr_block = "10.0.8.0/23"

  availability_zone = "ap-northeast-2a"

  tags = {

    Name = "101subnet-pri-db1"

  }

}

resource "aws_subnet" "pri-db2" {

  vpc_id     = aws_vpc.main.id

  cidr_block = "10.0.10.0/23"

  availability_zone = "ap-northeast-2c"

  tags = {

    Name = "101subnet-pri-db2"

  }

}

# nat

resource "aws_eip" "nat_1" {

  vpc   = true

  lifecycle {

    create_before_destroy = true

  }

}

resource "aws_eip" "nat_2" {

  vpc   = true

  lifecycle {

    create_before_destroy = true

  }

}

resource "aws_nat_gateway" "nat_gateway_1" {

  allocation_id = aws_eip.nat_1.id

  # Private subnet이 아니라 public subnet을 연결하셔야 합니다.

  subnet_id = aws_subnet.pub1.id

  tags = {

    Name = "NAT-GW-1"

  }

}

resource "aws_nat_gateway" "nat_gateway_2" {

  allocation_id = aws_eip.nat_2.id

  subnet_id = aws_subnet.pub2.id

  tags = {

    Name = "NAT-GW-2"

  }

}

# private route table add

resource "aws_route_table" "public_private_1" {

  vpc_id = aws_vpc.main.id

  tags = {

    Name = "main-private-1"

  }

}

resource "aws_route_table" "public_private_2" {

  vpc_id = aws_vpc.main.id

  tags = {

    Name = "main-private-2"

  }

}

resource "aws_route_table_association" "public_association_private_1" {

  subnet_id      = aws_subnet.pri1.id

  route_table_id = aws_route_table.public_private_1.id

}

resource "aws_route_table_association" "public_association_private_2" {

  subnet_id      = aws_subnet.pri2.id

  route_table_id = aws_route_table.public_private_2.id

}

resource "aws_route" "private_nat_1" {

  route_table_id              = aws_route_table.public_private_1.id

  destination_cidr_block      = "0.0.0.0/0"

  nat_gateway_id              = aws_nat_gateway.nat_gateway_1.id

}

resource "aws_route" "private_nat_2" {

  route_table_id              = aws_route_table.public_private_2.id

  destination_cidr_block      = "0.0.0.0/0"

  nat_gateway_id              = aws_nat_gateway.nat_gateway_2.id

}

# pri-db1,2

# private route table add

resource "aws_route_table" "public_private_db1" {

  vpc_id = aws_vpc.main.id

  tags = {

    Name = "main-private-db1"

  }

}

resource "aws_route_table" "public_private_db2" {

  vpc_id = aws_vpc.main.id

  tags = {

    Name = "main-private-db2"

  }

}

resource "aws_route_table_association" "public_association_private_db1" {

  subnet_id      = aws_subnet.pri-db1.id

  route_table_id = aws_route_table.public_private_db1.id

}

resource "aws_route_table_association" "public_association_private_db2" {

  subnet_id      = aws_subnet.pri-db2.id

  route_table_id = aws_route_table.public_private_db2.id

}

EOF



2

생성

terraform init

terraform plan

terraform apply -auto-approve



3

삭제

 terraform destroy -auto-approve





다시 돌아가기


https://brunch.co.kr/@topasvga/3360



4

확인


퍼블릭 서브넷은 디폴트 라우팅이 인터넷 게이트웨이 이다.


프라이빗 서브넷은  디폴트가 NATGW이다.


프라이빗 디비 서브넷은 디폴트 라우팅이 없다.

보안상 외부와 통신 하지 않는다.


메인 디폴트 라우팅에는 퍼블릭 서브넷 2개가 연결 되어 있다.




5

업무 요청 시스템으로 개발자에게 작업 완료를 통보한다.







<100> (몰아보기) AWS 랜딩존 


https://brunch.co.kr/@topasvga/2802




<200> 테라폼 시작하기~


https://brunch.co.kr/@topasvga/2752


https://brunch.co.kr/@topasvga/2798


https://gasidaseo.notion.site/f336822864634d8b922e31caf4aea1f9




다음

https://brunch.co.kr/@topasvga/2798





https://brunch.co.kr/@topasvga/2421


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari