이전에 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
이번에는 하나하나 하드코딩으로 작성했는데, 이렇게 작성하면 여러가지 문제가 있다고 한다... (재사용, 협업.. 등등)
다음에 Terraform 작성할때는 module, variables, output 까지 함께 사용해서 좀더 사용하기 쉬운 코드로 작성해봐야겠다.
평소에 AWS 콘솔에서 마우스로 뚝딱뚝딱 하던것이... Terraform으로 작성하려니 생각해야할 것이 많았던 것 같다.
콘솔에서 생성할 때는 그냥 지나쳤던 옵션? 들에 대해서도 한번씩 더 보게 되고, 리소스들의 종속성이나 순서같은 것도 좀더 유념해서 살펴봐야겠다.
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] 테라폼 모듈 (0) | 2021.04.06 |
---|---|
[Terraform] Terraform 개념 다지기 (0) | 2021.03.28 |