Infra & DevOps/Terraform

[Terraform] 테라폼 동작방식

용감한 개복치 2022. 4. 15. 18:04

1. 가변적(mutable) 인프라와 불변적(immutable) 인프라의 차이

 

가변적 인프라

수정사항이 발생 > 서버를 수정 후 배포

 

불변적 인프라

서버를 배포한 후 수정하지 않는 방식

서버 변경이 필요 > 폐기 후 새로 구성

이 과정에서 수정사항이 적용된 서버에 대한 테스트 후 새로 배포하는 방식.

 

2. Terraform의 선언적 방식으로 작성된 코드는 항상 인프라의 최신 상태를 의미합니다. Terraform은 어떤 방식으로 인프라를 최신 상태로 유지할 수 있는 걸까요? 

 

테라폼의 선언적 방식이란, 선언적으로 리소스릉 정의하고 관리할 수 있다는 것이다.이를 설명하기 위해서는 선언형에 대한 설명을 우선해야하는데, 선언형 프로그래밍으로 예를 들어보자.선언형이란 how가 아니라 what에 집중하는 방식이다.어떻게 웹 페이지 상에 다음 화면을 출력할 지가 아니라, 어떤 것을 웹페이지 상에 출력할 것인지를 우선 생각하는 것이다. 흔히 얘기하는 알고리즘을 이용한 c언어의 진행방식과는 조금 다른 방식이다. 절차지향적인 프로세스를 따르는 c, 자바 같은 전통 언어와 다르게 함수형 프로그래밍을 떠올리면 쉽게 이해 될 것이다.

이 방식을 테라폼에 적용하여 설명하자면, 리소스와 리소스 속성을 포함해 원하는 시스템의 상태를 정의하는 것이다. 이것을 코드로 하는 것이 IaC 이고 이것을 제공해 주는 솔루션 업체로 테라폼이 있는 것이다.

 

여기까지가 테라폼의 선언적 방식에 대한 설명이었다.그렇다면 어떻게 '항상 인프라의 최신방식으로 유지 할 수 있는가'에대한 의문이 남았다.테라폼의 선언적 방식으로 작성 된 코드 -가 하는 일은 단순하게 설명해서 aws의 인프라를 생성, 삭제 등 관리 할 수 있는 도구다. aws에서 개발을 위한 인프라를 설정하기 위해서는 각 단계별로 굉장히 복잡했는데 이 것을 코드로 관리 할 수 있게 워크플로우를 제공한다.

 

메인단계를 살펴보자.

refresh -> plan -> apply

Refresh : 테라폼의 입장에서 보는 인프라와 실제 인프라의 균형을 맞춘다. 테라폼은 infrastructure provider(VM, Azure, AWS, etc..)들에게 실제로 뭐가 돌아가고 있는지 쿼리하여 최신 상태를 유지한다.

Plan : 테라폼이 자신이 무엇을 해야하는지 알아내는 것. 현실에서 실제로 실행되는 것들과, 내가 실행하기 원하는 것들(desired configuration)을 맞추는 단계이다.

Apply : 실제 적용 단계. 여기서 해야할 일들을 계획하고, 실제 인프라 설정에 실행한다 테라폼은 우리가 배포하려는것들 중 무엇이 먼저 만들어져야하는지 등의 순서를 알아낸다.

 

예를 들면, 네트워크(VPC) -> SG -> VM(ec2 instance) -> LB 처럼 순서를 정한대로 인프라 구성을 적용한다.

즉, 구상 -> refresh -> plan -> apply 단계를 돌면서 쿼리를 통해 실제 환경과 테라폼에 선언된 환경을 비교하고 맞춰가며 최신상태로 유지한다. 그리고 실행하고, 생성하게 된다.

 

그렇게 만들어진 인프라를 업데이트하게 되면, ( ex dns레코드 추가, CDN 배포, VM 모니터링 시스탬 배포등..)

.tfstate 파일에 필요한 자원들의 정의를 추가하고 Refresh-Plan-Apply라는 워크플로우를 실행시킨다.

그러면 테라폼은 기존에 이미 존재하는 리소스들에 대해서는 할 게 없다는 것을 깨닫고, 추가된 리소스들만 생성한다. 이렇게 반복되면서 같은 워크플로우가 반복되고 업데이트된다.

 

 

*** 참고문헌 ***

https://terraform101.inflearn.devopsart.dev/preparation/terraform-basic/

 

Terraform 기본 :: Terraform & AWS 101

Terraform 기본 Terraform 기본 개념 다음은 테라폼 활용에 필요한 개념입니다. resource : 실제로 생성할 인프라 자원을 의미합니다. ex) aws_security_group, aws_lb, aws_instance provider : Terraform으로 정의할 Infrastr

terraform101.inflearn.devopsart.dev

 

 

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

[Terraform] 테라폼 기초 설명 & init 코드 구성 요소  (0) 2024.04.25
[Terraform] EKS IaC  (0) 2024.04.24