융무의 기술블로그
article thumbnail
Published 2023. 10. 14. 00:09
IaC와 Terraform Back-End Development

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 도구는 선언형 프로그래밍 방식을 채택하고 있습니다.

Terraform

https://developer.hashicorp.com/terraform/tutorials/aws-get-started/infrastructure-as-code#standardize-your-deployment-workflow

  • 테라폼은 해시코프사에서 만든 오픈 소스 도구로 간단한 선언적 언어를 사용하여 인프라를 코드로 정의합니다. 몇 가지 명령을 사용하여 다양한 퍼블릭 클라우드 공급자와 오픈스택, 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를 포함한 다양한 클라우드 서비스와 연동할 수 있습니다.

Reference

'Back-End Development' 카테고리의 다른 글

모놀리틱 아키텍처와 마이크로서비스 아키텍처  (0) 2023.03.27
클라우드와 온프레미스  (0) 2023.03.26
인프라 기초  (0) 2023.03.25
profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!