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/
'DevOps 부트캠프 > etc.' 카테고리의 다른 글
쿠버네티스(Kubernetes)란? + workload (0) | 2022.04.25 |
---|---|
API Gateway와 Lambda를 이용한 서버리스 애플리케이션 (0) | 2022.04.17 |
마이크로서비스(MicroService)란? _MicroService와 Serverless (0) | 2022.04.06 |
Cloud Computing 이란? (0) | 2022.03.15 |
DevOps란?_DevOps와 CI/CD (0) | 2022.02.08 |
댓글