Hyesung Oh

Terraform 입문하기 본문

Data Engineering/DevOps

Terraform 입문하기

혜성 Hyesung 2021. 1. 28. 00:01
반응형

Terraform이란

Terraform 공식 사이트에 소개된 내용을 한번 봅시다.

Terraform is an open-source infrastructure as code software tool that enables you to safely and predictably create, change, and improve infrastructure.

즉, HashiCorp사에서 만든 인프라를 HCL 이라는 언어(코드)로 관리할 수 있게 해주는 오픈소스 소프트웨어! 따라서

* HCL: HashiCorp Configuration Language. 쉽게말해, DSL (domain specific language)와 같은 것이라 보면 된다.

 

 

Mechanism

크게 세 단계로 나뉜다. refresh, plan, apply. 각 단계는 terraform cli command와 1대1 대응된다. 각각에 대해 간단히 살펴보자.

* 자세한 내용은 Terraform CLI docs 참고

Command: refresh

The terraform refresh command is used to reconcile the state Terraform knows about (via its state file) with the real-world infrastructure. This can be used to detect any drift from the last-known state, and to update the state file.

문장에서 알 수 있듯이, 기존의 state file에 기록된 infra의 상태와 실제로 지금 돌아가고 있는 infra의 상태 및 설정들을 비교한다. 만약, 다르다면 stateFile을 변경한다.

왜 이런 단계가 있느냐?는 질문에 간단히 대답하면, 실제 업무를 하다보면 infra를 code로 관리하고 있다가 급한 상황이 생겨 console에서 직접 infra를 변경하고 나중에 Terraform에 적용해야 할 때도 있다. 이런 경우, Terraform의 code와 실제 운영하고 있는 infra간에 차이가 생기게 되므로, 차이(변경사항)을 인지하는 단계가 필요한 것이다.

Command: plan

The terraform plan command is used to create an execution plan. Terraform performs a refresh, unless explicitly disabled, and then determines what actions are necessary to achieve the desired state specified in the configuration files.

마찬가지로, stat file 및 configuration file을 참고하여 infra를 새롭게 build 하기 위한 실행계획을 세우는 단계로 이해하면 충분! 

* configuration file: 여기서는 .tf 파일 확장자를 가진 파일이며, HCL로 작성되었다 정도로만 우선 알고 넘어가자. 

Command: apply

The terraform apply command is used to apply the changes required to reach the desired state of the configuration, or the pre-determined set of actions generated by a terraform plan execution plan.

쉽게 말해, 인프라를 실제로 세우는 단계라고 이해하면 충분하다.

 

HCL

이제 본격적으로 Terraform에서 지원하는 HCL이라는 language에 대해서 알아보자. 프로그래밍 언어의 특성과 작동 원리를 파악했다면 이제 해당 언어의 문법을 파악하는 단계로 넘어가는 것과 유사함.

* 자세한 내용은 Terraform Language docs 참고

공식 docs에 overview를 눌러보면 아래 코드 block이 눈에 띈다. 

출처: https://www.terraform.io/docs/language/index.html

첫인상은 참으로 낯설다.

하지만, 핵심 내용을 중심으로 구조화 해보면 알아야 할게 그리 많지는 않다는 사실..! 물론 세부설정으로 깊이 들어가면 알아야 할 것들이 많지만, 실제 업무를 하게 될 때 하나하나 찾아 보면서 작업하는게 훨씬 더 효과적이라 No Problem이라 할 수 있겠다. 

Block Type.

Terraform에서는 몇가지 block type을 정의 해놓았다. resource, input variables, output values, data sources 등이 있지만 그중에서도 infra object를 나타내는 resource가 가장 중요!

resource

우리가 정의하고 하나느 infra object와 1대1 대응이다. 예시를 들자면, AWS EC2 한대를 설정하고자 한다면 아래 코드가 동일한 일을 해주는 것이다. 

실제 사내 팀들에서 github으로 관리하고 있는 Terraform project repo를 보면, 복잡한 dierctory구조와 다수의 .tf 파일들로 구성이 되어있다. 하지만 결국엔 그 모든 디렉토리와 .tf 파일 내에 variable, provider 그리고 module Block들은 resource block을 정의 하기 위해 사용된다고 보면 된다. 즉, 최종 보스는 resource라는 것을 기억해두자. 

 

Block Label

여기서 block label에 위치한 "aws_instance"는 resource type으로 AWS resource를 remote로 사용할 수 있게 해주는 provider (쉽게 말해 plugin)을 import하여 사용할 수 있게 되는 것이다. 자기 맘대로 지어도 되지만 Terraform은 perfix + argument (뒤에서 설명)를 통해 provider의 resource를 식별한다. 여기서는 aws라는 perfix와 {} 내부에 정의된 각각의 argument들을 통해 Terraform이 aws provider에 의해 제공되는 EC2 resource임을 인식하는 것이다!

* argument: provider가 제공하는 각 resource별로 설정해야 하는 config 값이라 이해하면 된다.

* Terraform이 지원하는 provider들을 보고싶다면 -> registry.terraform.io/

더 자세한 내용은 공식 문서를 참고 

 

Block Name (혹은 Block Label)

위 그림에선 세번째 "web"에 해당되는 부분이다. 본인 마음대로 지어도 되지만 꼭 지켜야 할 약속이 한 가지 있다. 바로 block label + block name이 한 세트가 되어 identifier로서 역할을 하게 되는 것이므로 block label + block name은 configration file전체에서 unique해야 한다! (동일한 infra를 여러개 만들 때 -> block label은 동일하지만 block name은 다르게)

 

반응형
Comments