IaC란 코드를 작성 및 실행하여 인프라를 생성, 배포, 수정, 정리하는 것을 말합니다. 코드형 인프라스트럭처는 물리적 하드웨어 구성이나 인터페이스 구성 도구가 아닌 기계가 읽을 수 있는 정의 파일들을 통한 컴퓨터 데이터 센터의 관리 및 프로비저닝 과정으로 관리되는 IT 인프라스트럭처는 베어 메탈 서버 등의 물리 장비와 가상 머신 및 관련 구성 리소스를 모두 구성합니다.
수동 프로세스가 아닌 스크립트나 선언형 정의를 사용할 수 있으나 이 용어는 선언적 접근을 제고하기 위해 사용되는 일이 더 많습니다.
IaC를 구성하는 정의 파일은 JSON, YAML, XML 혹은 자체적으로 사용하는 도메인 특화 언어 DSL(Domain Specific Language)로 구성된 정의 파일을 이용해서 인프라를 구성합니다.
데브옵스의 핵심은 서버, 데이터베이스, 네트워크, 로그 파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 것을 코드로 관리할 수 있다는 것입니다.
코드형 인프라의 장점은 리소스의 모든 정보가 코드로 캡처되므로 언제든지 terraform apply 명령어를 사용하여 모든 리소스를 다시 생성할 수 있다는 것으로 인프라의 이력을 추적할 수 있도록 최신 변경 사항을 깃에 저장할 것을 권합니다.
자급식 배포(Self-service) : 인프라를 코드로 정의하면 전체 배포 프로세스를 자동화할 수 있으며 개발자는 필요할 때마다 자체적으로 배포를 진행할 수 있습니다.
속도와 안정성(Speed and safety) : 자동화된 프로세스는 일관되고 반복 가능하며 수동으로 진행했을 때보다 오류가 적게 발생하기 때문에 더 안전합니다.
문서화(Documentation) : 시스템 관리자 조직만 인프라에 관한 정보를 독점하는 것이 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있습니다.
버전 관리 : 인프라의 변경 내용이 모두 기록된 코드형 인프라 소스 파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있습니다.
유효성 검증(Validation) : 인프라 상태가 코드로 정의되어 있으면 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 실행할 수 있으며, 정적 분석(static analysis) 프로그램에 코드를 전달하여 오류 발생 위험을 줄일 수 있습니다.
재사용성 : 인프라를 재사용 가능한 모듈로 패키징할 수 있으므로 모든 제품을 매번 처음부터 배포하는 대신 문서화되고 검증된 모듈로 일관되게 배포할 수 있습니다.
많이 사용되는 툴
Chef
Puppet
Ansible
Saltstack
Terraform
IaC의 코드 작성 방식
명령형(Imperative)
프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종으로 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것입니다.
C, Java, Python, Ruby과 같은 전통적인 프로그래밍 언어는 명령형 프로그래밍 방식으로 프로그래머가 실행될 알고리즘을 명시해 주어야 합니다.
선언형(Declarative)
명령형 프로그램은 알고리즘을 명시하고 목표를 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것으로 YAML 파일 등에 진행할 작업을 지정하는 형태가 선언형 프로그래밍 방식입니다.
멱등성을 유지하기 위해 대부분의 IaC 도구는 선언형 프로그래밍 방식을 채택하고 있습니다.
테라폼은 해시코프사에서 만든 오픈 소스 도구로 간단한 선언적 언어를 사용하여 인프라를 코드로 정의합니다. 몇 가지 명령을 사용하여 다양한 퍼블릭 클라우드 공급자와 오픈스택, VM웨어 같은 프라이빗 클라우드와 가상화 플랫폼에서 해당 인프라를 배포 및 관리하게 합니다.
테라폼을 실행할 때마다 테라폼은 생성한 인프라에 대한 정보를 테라폼 상태 파일에 기록합니다. 구성 파일(.tf)의 테라폼 리소스가 실제 리소스의 표현으로 매핑되는 내용을 기록하는 사용자 정의 JSON 형식이 포함되어 있습니다.
Terraform은 클라우드 플랫폼 및 다양한 서비스의 리소스를 API를 통해 생성하고 관리하는 도구로 AWS, Azure, GCP, Kubernetes 등 다양한 플랫폼과 서비스에 대한 리소스 관리를 지원합니다. 이를 지원하기 위한 provider라는 모듈이 있으며, 이는 Terraform 레지스트리에서 확인 가능합니다.
워크플로
write: 리소스의 구성을 코드로 정의합니다.
plan: 변경사항에 대한 실행 계획을 생성합니다.
apply: 실행 계획에 따라 리소스를 생성, 수정 또는 삭제합니다.
테라폼 프로젝트의 파일 레이아웃
variables.tf : 입력 변수
outputs.tf : 출력 변수
main.tf : 리소스
명령어
terraform init : 프로바이더 및 상태 초기화를 진행함
terraform plan : tf 파일에 정의한 코드가 인프라의 어떤 변화를 초래할지를 사전에 보여줌
terraform apply : tf 파일에 정의한 코드를 토대로 실제 인프라의 변화를 발생시킴
terraform destroy : tf 파일에 정의한 인프라를 종료함. 테라폼은 생성한 리소스를 추적하기 때문에 destroy 명령어를 실행해 간단히 정리할 수 있습니다. destroy 명령어는 실행 취소(undo)를 할 수 없기 때문에 실제 운영 환경에서는 주의해서 실행해야 합니다.
terraform state list : 현재 Terraform 상태 파일(terraform.tfstate)에 저장된 리소스의 목록을 표시합니다.
terraform state rm : Terraform의 상태 파일에서 특정 리소스를 제거하는 데 사용됩니다
terraform refresh : 현재 Terraform 코드와 실제 클라우드 환경의 리소스 상태를 비교하여 상태 파일을 최신 상태로 업데이트하려고 합니다.
프로바이더
https://developer.hashicorp.com/terraform/intro
프로바이더(Provider) : 테라폼(Terraform)이 연동하려는 클라우드 서비스를 지정합니다.
프로바이더를 설정하고 접근 access key와 secret key를 지정한 뒤 terraform init 명령어를 실행하면 .terraform 폴더가 생성되고 프로바이더와 연관된 코드가 다운로드됩니다.
테라폼은 AWS, GCP, Azure를 포함한 다양한 클라우드 서비스와 연동할 수 있습니다.