IaC(Infrastructure as Code)
- 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 도구는 선언형 프로그래밍 방식을 채택하고 있습니다.
- 명령형(Imperative)
Terraform
- 테라폼은 해시코프사에서 만든 오픈 소스 도구로 간단한 선언적 언어를 사용하여 인프라를 코드로 정의합니다. 몇 가지 명령을 사용하여 다양한 퍼블릭 클라우드 공급자와 오픈스택, 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 코드와 실제 클라우드 환경의 리소스 상태를 비교하여 상태 파일을 최신 상태로 업데이트하려고 합니다.
- 프로바이더
- 프로바이더(Provider) : 테라폼(Terraform)이 연동하려는 클라우드 서비스를 지정합니다.
- 프로바이더를 설정하고 접근 access key와 secret key를 지정한 뒤 terraform init 명령어를 실행하면 .terraform 폴더가 생성되고 프로바이더와 연관된 코드가 다운로드됩니다.
- 테라폼은 AWS, GCP, Azure를 포함한 다양한 클라우드 서비스와 연동할 수 있습니다.
Reference
'Back-End Development' 카테고리의 다른 글
모놀리틱 아키텍처와 마이크로서비스 아키텍처 (0) | 2023.03.27 |
---|---|
클라우드와 온프레미스 (0) | 2023.03.26 |
인프라 기초 (0) | 2023.03.25 |