IaC(Infrastructure as Code)란? _ Terraform
본문 바로가기
DevOps 부트캠프/etc.

IaC(Infrastructure as Code)란? _ Terraform

by liveloper jay 2022. 4. 24.

 

Infrastructure as Code


 DevOps의 주요한 가치 중의 하나는 바로 자동화입니다. 코드형 인프라(Infrastructure as Code, IaC)는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말합니다. 즉 코드로 클라우드 인프라의 생성/수정/삭제를 자동화 한다고 볼 수 있습니다.

 

IaC를 사용하면 인프라 사양을 담은 구성 파일이 생성되기 때문에 구성을 편집하고 배포하기가 더 쉬워집니다. 또 이렇게 될 경우 구성에 대한 정보가 코드화 되어있기때문에 구성 변경 사항을 문서화하지않고, 임의로 변경되는 문제를 막을 수 있습니다. 이러한 IaC는 다음과 같은 특징 및 장점을 가집니다.

  •  인프라를 만드는 과정이 자동화되므로, 오류 발생확률이 줄어들고 안전합니다.
  •  코드로 작성되었기 때문에 공유가 쉽고, 버전관리에도 용이합니다.
  •  코드와 현재 상태를 비교하여, 추후 인프라 상태의 변경에 따르는 위험을 분석하고 검증할 수 있습니다.
  •  개발자 스스로가 배포하고 인프라를 통제할 수 있는 환경을 만들 수 있습니다.(시스템 관리자만의 영역x)

 

 

 

Terraform을 이용한 IaC


IaC 도구를 이용하면 GUI가 아닌 구성 파일을 사용한 인프라 관리가 가능합니다. 이러한 IaC를 위한 툴에는 Ansible, Terraform, Chef, AWS CloudFormation 등이 있지만 그 중에서 Terraform에 대해 알아보도록 하겠습니다.

 

Terraform은 hashicorp의 인프라로, 선언적 구성파일(JSON,YAML)에서 리소스 및 인프라를 정의하고 라이프사이클을 관리할 수 있습니다. (선언형 IaC도구)
Terraform을 이용하게 되면 인프라를 수동으로 관리하는 것에 비해 여러 이점이 있습니다

  • Terraform은 여러 클라우드 플랫폼에서 인프라를 관리할 수 있습니다.
  • 사람이 읽을 수 있는 구성언어를 사용하면 인프라 코드를 빠르게 작성할 수 있습니다.
  • Terraform 상태를 통해 배포 전반에 걸쳐 리소스 변경 사항을 추적할 수 있습니다.
  • 인프라에서 안전하게 협업하기 위해 버전제어에 구성을 커밋할 수 있습니다.

💡 선언형 IaC vs 절차형 Iac

 - 선언형 IaC : 선언형 언어 JSON,YAML 등을 사용합니다. 실제 인프라가 적용된 결과와 적용할 내용이 직관적으로 매핑됩니다.( cloudformation, Azure Blueprint, Terraform...)

 - 절차형 IaC : 프로그래밍 언어를 이용해 직접 순차적으로 인프라를 생성하도록 코드를 작성하는 방법입니다. 선언형에 비해 더 강력한 일들을 할 수 있으나, 실제 적용된 결과를 가늠하기 어렵고, 코드를 읽기에 직관적이지 않습니다. ( AWS CDK, Pulumi...)

 

 

 

 

 

 

Terraform 작동원리


 Terraform에는 코드, 상태, 인프라 라는 3가지 형상이 존재합니다. 

  • Local 코드 : 현재 개발자가 작성/수정 하고 있는 코드
  • AWS 실제 인프라 : 실제로 AWS에 배포되어 있는 인프라
  • Backend 에 저장된 상태 : 가장 최근에 배포한 테라폼 코드 형상

Terraform을 사용하면 코드로 자동화를 구축한 것이기 때문에 배포가 지속적으로 이루어지게 될 것이며, 여기서 중요한 점은 인프라와 상태가 완전히 일치하도록 만드는 것입니다. 여기서 인프라의 정의부터 최신코드를 인프라와 backend 상태에 저장하는 과정이 필요하게 되는데, 이 흐름은 아래의 명령어들을 통해 이루어집니다. (이 명령어들은 예제 적용시에도 사용됩니다.)

1. Terraform init

  • 지정한 Backend 상태 저장을 위한 .tfstate 파일을 생성합니다. -> 여기서 .tfstate 파일은 Terraform이 인프라를 최신상태로 유지할 수 있는 방법의 핵심입니다.
  • init 완료되면 .tfstate 내용을 담은 .terraform 파일이 생성됩니다.
  • 이미 .tfstate가 있는 경우에 init 작업을 통해 sync를 맞출 수 있습니다. 

2. Terraform plan

  • 정의한 코드가 어떤 인프라를 만드는지에 대한 예측 결과를 미리 보여줍니다.
  • plan 명령어만 가지고는 state에 변화를 주지는 않습니다.

3. Terraform apply

  • 실제 인프라를 배포하기 위한 명령어로, AWS 상에 실제로 해당 인프라가 생성되고 작업 결과가 .tfstate 파일에 저장됩니다.
  • 해당 결과는 local의 .terraform 파일에도 저장이 됩니다.

4. Terraform import

  • AWS 인프라에 배포된 리소스를 terraform state로 옮겨주는 작업을 수행합니다. 
  • 이는 local의 .terraform에 해당 리소스의 상태 정보를 저장해주는 역할을 합니다. (코드생성x)

 

 

 

 

 

Advance

  • 가변적(mutable) 인프라와 불변적(immutable) 인프라란?
  • Configulation Drift란?

 

 

 

 

 

 

 

참고자료:
codestates 학습 플랫폼 - Infrastructure as Code 자료

https://www.redhat.com/ko/topics/automation/what-is-infrastructure-as-code-iac

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

댓글