연재 시리즈

테라폼으로 EKS만들기 프로젝트 3-2편 - 테라폼 동작원리

악분 2023. 6. 24. 23:33
반응형

이 글은 테라폼이 어떻게 동작하는지 설명합니다. 3편에서 실행했던 hello world예제를 참고합니다.

 

▶ 테라폼 동작원리 유투브 영상: https://youtu.be/47FJVP437nk

 

1. 동작원리

테라폼은 코드를 읽어 코드가 실행가능한지 분석합니다. 이 후, 대상에서 지원하는 API를 사용하여 코드를 대상에 반영합니다.

 

테라폼 내부(아키텍처)는 테라폼 공식문서에서 설명합니다. 테라폼은 코어와 플러그인으로 구성되어 있습니다.

    코어는 테라폼 코드를 읽어 코드 문법검사와 실행 순서를 결정합니다. 실행 순서 형태를 리소스 종속성 그래프(resource dependency graph)라고 부릅니다.

    코어는 테라폼 코드 실행을 플러그인에게 요청합니다.

    플러그인은 provider 설정을 읽어 적절한 API를 호출합니다. API호출 로직은 client library에 구현합니다.

 

2. 테라폼 언어 HCL

2.1 테라폼 코드는 어떤 언어로 작성될까?

테라폼 코드는 ".tf"확장자를 갖는 파일입니다. tf확장자 파일은 HCL언어로 작성되어 있습니다. HCL이 프로그래밍 언어와 차이점이 구성(Configuration)을 표현하는 것에 집중합니다.

 

 

2.2 HCL 기본단위

HCL언어는 block이라는 단위로 구성됩니다. 아래 그림은 테라폼 공식문서에서 가져왔습니다. 흰색글씨인 Block type과 Block body는 필수이고 노란색글씨인 Block label은 옵션입니다. Bloack label은 0개 이상 있습니다.

출처:  https://developer.hashicorp.com/terraform/language

 

Block 타입은 Block이 어떤 동작을 하는지 결정합니다. 예를 들어 hello world예제에서는, helloworld.txt파일 생성을 위해 resource block을 사용했습니다.  

 

resource block이 생성하는 리소스 종류는 첫 번째 block label이 담당합니다. local_file block label은 테라폼을 실행하는 로컬PC에 파일을 생성합니다. resource block은 여러 개 사용할 수 있으므로, 두 번째 block label에 block이름을 설정함으로써 resource block을 구별합니다.

 

block body에는 block의 설정입니다. block body에 입력된 내용을 인자(argument)라고 부릅니다. 인자는 테라폼 함수, 테라폼 변수, 조건문, 반복문 등과 함께 사용가능합니다. 사용예제는 앞으로 실습할 예제에서 중간중간 설명합니다.

 

3. 루트 모듈과 테라폼 코드 인식 범위

테라폼 코드를 실행하는 경로를 루트 모듈이라고 합니다. 루트 모듈에 있는 모든 tf파일은 테라폼이 실행합니다.

 

하지만 하위모듈(폴더)에 있는 tf파일은 실행하지 않습니다. 예제를 실습하면서 정말 실행이 안되는지 확인해보겠습니다. 예제는 예제 git 저장소에 ignore_submodule폴더에 있습니다.

git clone https://github.com/choisungwook/terraform_practice.git example
cd example
cd ignore_submodule

 

ignore_submodule폴더에는 submodule폴더가 있습니다. submodule폴더에는 main.tf파일이 있습니다.

 

ignore_submodule폴더에서 terraform init과 terrafrom apply명령어를 실행해보세요. 결과가 어떤가요? 아무런 테라폼 코드가 실행되지 않았습니다. terraform 명령어를 실행한 위치에서 tf파일이 없기 때문에, 테라폼 코드를 읽지 못했습니다. 즉, submodule에 있는 tf파일은 읽지못했습니다.

 

4. 테라폼 코드 실행 순서

테라폼은 코드를 분석하여 실행순서를 설정합니다. 코드 실행 선후관계가 없다면 코드는 병렬로 실행됩니다. 반대로 선후관계가 있는 코드는 순서대로 실행됩니다.

 

테라폼은 최종 실행순서를 종속성 그래프(resource dependency graph)로 표현합니다. 종속성 그래프는 terraform graph명령어로 생성할 수 있고 graphviz뷰어로 볼 수 있습니다.

 

예제를 실습하면서 테라폼 종속성 그래프를 만들어보겠습니다. 예제는 예제 git 저장소에 dependency폴더에 있습니다.

git clone https://github.com/choisungwook/terraform_practice.git example
cd example
cd dependency

 

main.tf파일을 보면 first, second, third resource블럭이 있습니다. first와 second는 선후관계가 있습니다. second.condtent가 first.content를 참조하기 때문입니다. third는 선후 관계가 없습니다.

 

결국, main.tf가 실행되면 first resource가 실행된 후에 second resource가 실행됩니다. 그리고 third는 선후관계가 없으므로 first resource가 실행될 때 병렬로 실행됩니다.

 

terraform graph를 사용하면 실행순서를 추출할 수 있습니다. 확장자는 .dot파일형식입니다.

 

graphviz 뷰어를 사용하면 terraform graph내용을 시각화 할 수 있습니다. visual studio code extension에서 graphviz 뷰어를 쉽게 설치 가능합니다

 

리다이렉션을 이용하여 terraform graph결과를 파일로 저장합니다. 그리고 graphviz 뷰어로 추출한 파일을 시각화합니다. 추출한 파일을 열고 오른쪽 위 graphviz버튼을 클릭하면 뷰어가 열립니다.

terraform graph > graph.dot

 

선후관계에 따라 종속성 그래프가 그려졌습니다. first resource와 second resource는 선후 관계가 있어서 실행순서가 설정되었습니다. 그리고 third resource는 선후관계가 없어서 first resource와 같이 병렬로 실행됩니다.

 

5. Provider

provider는 테라폼 코드가 어떤 대상에 적용할지 설정합니다. aws, gcp 등이 있습니다. provider를 설정하지 않으면, 코드를 적용할 대상이 없기 때문에 에러가 발생합니다. 테라폼이 지원하는 provider종류는 browser에서 볼 수 있습니다.

 

provider코드는 terraform block에 설정합니다. required_provider인자에 provider이름과 버전을 설정합니다. 아래 예제는 local 2.4.0버전 provider를 사용합니다.

 

각 provider코드 예제는 provider 문서에 있습니다. provider문서에서 우측 상단 "USE PROVIDER"버튼을 클릭해보세요. 해당 provider코드 예제가 나옵니다.

반응형