Among Us - Yellow Crewmate [Terraform] Terraform으로 AWS 웹서버 인프라 자동화하기

DevOps/Terraform

[Terraform] Terraform으로 AWS 웹서버 인프라 자동화하기

감쟈! 2021. 4. 4. 17:49

이전에 AWS로 3티어 아키텍처를 설계하여 웹서버를 구축 했었는데, 프리티어에서 작업 하다보니 인프라들을 계속 지웠다가 생성했다가 해줘야하는 번거로움이 있었다. 때문에 Terraform으로 인프라들을 코드화시켜 생성 및 삭제를 자동화 시켜보기로 했다. 

 

 

 

 

아래 그림은 구축했던 아키텍처이다.

이 아키텍처를 바탕으로 AWS 인프라를 Terraform으로 코드화 시켜보자

 

 

 


구성하기 전에..

1. Terraform이 설치되어 있어야 한다.

 

 

2. aws cli로 미리 access key 인증을 해줘서 provider에 key값이 들어가지 않도록 해준다.

 

 

3. 코드 작업은 Visual Studio Code에서 해준다.


1. Provider 지정

provider : aws를 프로바이더로 지정

region : aws의 ap-northeast-2 리전에서 인프라 생성

 


2. VPC 생성

 

resource   : aws_vpc로 정하고 terraform에서 정의하는 이름으로 terraform_vpc로 정해준다. 이 이름은 aws에서 사용되는 이름이 아니고 테라폼 내부에서 참조하기 위한 이름이다.

 

cidr_block : VPC가 사용하는 ip대역

tag          : vpc의 이름 terrform_vpc로 지정

 


3. Subnet 생성

 

resource : aws_subnet 지정

vpc_id : 참조할 vpc

cidr_block : ip 대역

availability_zone : 생성할 가용영역 지정

map_public_ip_on_launch : 이 서브넷에서 생성되는 인스턴스가 public ip 할당되어야 하는지 여부

tag : subnet 이름  

 

 


4. Internet gateway 생성

resource : aws_internet_gateway를 리소스로 지정

vpc_id : 참조할 vpc 지정

tags : internet gateway 이름 지정

 


5. EIP 생성

NAT 게이트웨이를 생성하려면 EIP가 필요하다.

 

resource : aws_eip

vpc : eip가 vpc에 위치하는지 여부

tags : eip 이름


6. NAT 게이트웨이 생성

 

resource : aws_nat_gateway 지정

allocation_id : 위에서 생성했던 eip를 nat에 할당

subnet_id : NAT가 위치 할 서브넷 지정

tags : NAT 게이트웨이 이름


7. Route_tables 생성

 

resource : aws_route_table 지정

vpc_id : 참조할 vpc 지정

cidr_block : ip 대역 지정

gatewat_id : 라우팅 할 IGW 지정

nat_gatewat_id : 라우팅 할 NAT 지정

 


8. route tables에 subnet 연결

resource : aws_route_table_association

subnet_id : 연결할 서브넷 지정

route_table_id : 연결할 라우팅 테이블 지정

 


9. Security Group 생성

 

resource : aws_security_group

vpc_id : 참조할 vpc 지정

name : sg의 이름

 


10. 인바운드 및 아웃바운드 규칙 추가

sg에서 사용할 인바운드 및 아웃바운드 규칙들을 하나씩 입력해줘야 한다.

 

resource : aws_security_group_rule

type : ingress & egress 지정

from_port :  port

to_port : port

protocol : 프로토콜 타입

cidr_blocks : ip대역

source_security_group_id : 특정 대상만 허용할 경우 사용 / (cidr_block과 둘중에 하나만 사용가능)

security_group_id : 규칙을 추가할 sg  

 


11. Key pair 생성

인스턴스에 사용할 key pair 생성

 

resource : aws_key_pair

key_name : key pair 이름

public_key : 사용할 public key


12. 인스턴스 생성

 

resource : aws_instance

ami : 인스턴스를 생성할 ami의 id. (amzon-linux2)

instance_type : 생성할 인스턴스의 타입

subnet_id : 위치할 서브넷 지정

vpc_security_group_ids : sg 지정

key_name : key 지정

associate_public_ip_address : public ip 할당 여부

 

user_data : 인스턴스가 생성된 후 아파치를 설치하는 스크립트 작성


13. ELB 생성

 

resource : aws_lb

name : elb 이름 지정

subnets : 로드밸런싱할 서브넷 지정

security_groups : elg 의 sg 지정

load_balancer_type : elb의 타입을 alb로 지정


14. target group 생성

 


15. subnet group 생성

rds를 생성하기 위해서는 subent group을 먼저 생성해야 한다.

 

 


16. RDS 생성

engine : mysql 로 생성

engine : mysql의 버전은 8.0.20

instance_class : db 인스턴스의 타입

name : 데이터베이스 이름

username : 데이터베이스 사용자 디름

password : 데이터베이스 패스워드

identifier : DB 인스턴스 이름

skip_final_snapshot : 최종 스냅샷 생성 여부

db_subnet_group_name : subnet group 지정

multi_az : multil az 사용 여부


여기까지 필요한 리소스를 Terraform 으로 생성하는 방법에 대해서 알아보았다. 전체 코드는 깃허브에 따로 올려놓아서 보관하기로 했다.

 

github.com/shingilyong/Terraform

 

shingilyong/Terraform

Terraform 사용하여 AWS 인프라 자동화 . Contribute to shingilyong/Terraform development by creating an account on GitHub.

github.com

 

 

 

 

이번에는 하나하나 하드코딩으로 작성했는데, 이렇게 작성하면 여러가지 문제가 있다고 한다... (재사용, 협업.. 등등)

다음에 Terraform 작성할때는 module, variables, output 까지 함께 사용해서 좀더 사용하기 쉬운 코드로 작성해봐야겠다. 

 

평소에 AWS 콘솔에서 마우스로 뚝딱뚝딱 하던것이... Terraform으로 작성하려니 생각해야할 것이 많았던 것 같다.

콘솔에서 생성할 때는 그냥 지나쳤던 옵션? 들에 대해서도 한번씩 더 보게 되고, 리소스들의 종속성이나 순서같은 것도 좀더 유념해서 살펴봐야겠다.

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

[Terraform] 테라폼 모듈  (0) 2021.04.06
[Terraform] Terraform 개념 다지기  (0) 2021.03.28