본문으로 건너뛰기

카카오클라우드에서 IaC로 인프라 자동화하기

· 약 15분
IaC

안녕하세요! 이번 글에서는 TerraformAnsible이라는 대표적인 IaC 도구들을 사용해 카카오클라우드 인프라를 코드로 정의하고 자동화하는 방식을 소개하려 합니다.

인프라를 코드로 관리한다는 말, 들어보셨나요? 마치 개발자가 코드를 작성하듯, 서버나 네트워크 같은 인프라를 코드로 작성하고 관리하는 방법을 IaC(Infrastructure as Code) 라고 합니다.

클라우드 환경에서 인프라의 복잡성이 증가하면서, 이를 해결하기 위해 많은 기업이 인프라를 코드로 관리하는 방식을 도입하고 있습니다. 인프라를 코드로 정의함으로써 일관된 환경 구성을 보장하고, 자동화를 통해 배포 시간을 단축하며, 인프라 변경 사항을 추적할 수 있기 때문인데요, 이는 클라우드 환경에서의 복잡성을 해소하고, 운영 생산성을 높이는 데 큰 도움이 됩니다.

왜 IaC를 사용할까?

IaC를 적용하는 이유는 자동화, 일관성, 그리고 버전 관리로 설명할 수 있습니다.

  1. 자동화: IaC를 통해 인프라를 코드로 관리함으로써 반복적인 수작업을 크게 줄일 수 있습니다. 몇 줄의 코드만으로 수십, 수백 대의 서버를 빠르게 프로비저닝할 수 있어 시간과 비용을 절약할 수 있습니다. 이는 운영 효율성을 높이고, 인프라 설정 및 배포 과정을 빠르고 쉽게 만들어줍니다.
  2. 일관성: 자동화와 밀접하게 연관된 부분으로, 사람이 직접 설정하는 경우 실수가 발생할 수 있지만, 코드로 인프라를 정의하면 동일한 결과를 반복해서 얻을 수 있습니다. 덕분에 개발, 테스트, 프로덕션 환경을 동일하게 유지할 수 있어 환경 차이로 인한 문제를 최소화할 수 있습니다. 일관된 환경에서는 디버깅이 용이하고, 안정적인 시스템 운영이 가능합니다.
  3. 버전 관리: IaC를 사용하면 코드로 설계한 인프라 구성의 버전 관리를 할 수 있습니다. Git과 같은 버전 관리 시스템을 사용하면 인프라 변경 이력을 기록하고 효율적인 협업이 가능하기 때문에 변경 사항의 투명성을 확보하고, 신속하게 문제를 해결할 수 있습니다.

Terraform vs. Ansible

IaC를 구현하기 위한 다양한 도구들이 존재하지만, 가장 널리 사용되는 대표적인 IaC 도구는 Terraform과 Ansible 입니다. Terraform은 선언적 구문을 사용해 인프라 리소스를 정의하고 관리합니다. 다양한 클라우드 프로바이더(AWS, Azure, GCP, OpenStack 등)를 지원하여, 클라우드 자원을 통합적으로 관리할 수 있습니다. Ansible은 YAML 기반의 플레이북을 사용해 설정 관리 및 배포 작업을 자동화합니다. 에이전트 없이 SSH를 통해 시스템을 관리합니다.

Terraform과 Ansible은 모두 IaC(Infrastructure as Code) 도구로서 인프라의 자동화를 목표로 하지만 방식은 다릅니다. 가장 큰 차이점은 상태 관리 유무프로그래밍 패러다임(절차형 vs. 선언형) 입니다.

상태 관리

현재 인프라 상태를 추적하고, 이를 바탕으로 필요한 변경을 결정하는 상태 관리는 인프라에서 매우 중요한 과정입니다. Terraform은 상태 파일을 통해 인프라 상태를 지속적으로 추적하고 관리하는 반면, Ansible은 상태 파일 없이 각 실행 시마다 목표 상태로 설정하는 방식으로 작동합니다.

  • Terraform: Terraform은 인프라의 상태를 추적하기 위해 상태 파일(state file) 을 사용합니다. 이 파일에는 현재 인프라의 구성 정보가 저장되어 있어, 이를 통해 현재 상태와 원하는 상태를 비교하고 어떤 변경이 필요한지 결정합니다. 예를 들어, 카카오클라우드에서 인스턴스를 생성한 후 설정을 변경하려면, Terraform은 상태 파일을 사용하여 현재 상태와 새로운 설정을 비교하고 필요한 부분만 변경합니다. 이 과정에서 Terraform은 기존 인스턴스를 삭제하고 새로운 인스턴스를 생성하는 작업을 자동으로 처리하며, 필요한 최소한의 변경만 수행하여 효율성을 극대화합니다.

  • Ansible: 반면 Ansible은 상태 파일을 사용하지 않습니다. 즉, Ansible은 현재 인프라의 상태를 추적하지 않으며, 실행 시마다 플레이북(playbook) 을 기준으로 인프라를 설정합니다. 카카오클라우드에서 인스턴스를 생성한 후 설정을 변경하는 같은 상황에서, Ansible은 현재 상태를 알지 못하기 때문에 각 실행 시마다 목표 상태를 설정하고, 필요시 인스턴스를 새로 설정하거나 기존 인스턴스를 삭제하고 새로 생성하는 작업을 수동으로 처리해야 합니다. 이는 반복적인 작업이 필요할 수 있다는 단점이 있습니다.

프로그래밍 패러다임 (절차형 VS 선언형)

프로그래밍 패러다임은 IaC 도구가 인프라를 어떻게 정의하고 관리하는지를 결정합니다. Terraform은 선언형 언어를 사용하는 반면, Ansible은 절차형 언어를 사용합니다.

  • Terraform: 선언형 언어에서는 최종 상태를 정의하고, 그 상태에 도달하기 위한 과정을 자동으로 처리합니다. 사용자는 원하는 최종 상태만 명시하면, Terraform은 해당 상태에 도달하기 위한 모든 단계를 자동으로 수행합니다. 예를 들어, 사용자는 "서버 A가 존재해야 한다"라고 선언하고, Terraform은 서버 A를 생성하는 모든 단계를 처리합니다. 이는 사용자가 인프라 구성의 세부 사항에 신경 쓰지 않아도 된다는 장점이 있습니다.

  • Ansible: 절차형 언어에서는 실행 단계를 명시적으로 정의해야 합니다. 사용자는 인프라를 설정하기 위한 구체적인 단계를 작성해야 하며, 각 단계는 순차적으로 실행됩니다. 예를 들어, 사용자는 "서버 A를 생성하고, 그 후에 소프트웨어 B를 설치하고, 설정 파일 C를 복사한다"와 같은 순서로, 명시적으로 작성해야 합니다. 이는 사용자가 모든 단계를 세밀하게 제어할 수 있다는 장점이 있지만, 설정 과정이 복잡할 수 있습니다.

이러한 차이점들은 Terraform과 Ansible의 사용 사례와 접근 방식에 큰 영향을 미칩니다. 상태 파일을 통해 인프라 상태를 지속적으로 추적하고 관리하는 Terraform은 선언형 접근 방식을 통해 사용자에게 더 높은 수준의 추상화를 제공합니다. 반면, 상태 파일 없이 각 실행 시마다 목표 상태로 설정하는 Ansible은 절차형 접근 방식을 통해 사용자가 세부 단계를 명시적으로 제어할 수 있게 합니다.

카카오클라우드에서 IaC로 인프라 자동화

카카오클라우드 기술문서에서는 Terraform과 Ansible 방식으로 웹서비스 인프라를 자동화하는 방법을 소개하고 있습니다. Terraform을 사용한 튜토리얼의 과정을 살펴보면 앞에서 설명해 드린 상태 파일의 활용과 선언형 구조를 좀 더 이해하실 수 있습니다.

  1. Terraform Provider 설정: OpenStack Provider로 IaaS 리소스를 관리하기 위한 정보를 상태 파일에 작성합니다. Terraform의 버전 및 필요한 공급자로 OpenStack을 설정하고, 환경 설정에 필요한 다양한 변수를 정의합니다.

    Terraform provider 설정
    terraform { 
    required_version = ">= 1.0"
    required_providers {
    openstack = {
    source = "terraform-provider-openstack/openstack"
    version = ">= 1.40.0"
    }
    }
    }

    # openstack provider 설정
    provider "openstack" {
    auth_url = var.kc_auth_url
    application_credential_id = var.kc_application_credential_id
    application_credential_secret = var.kc_application_credential_secret
    region = var.kc_region
    }
  2. Terraform 스크립트 작성: 필요한 인프라 자원(예: VM, 네트워크)을 선언적으로 정의합니다.

    프로젝트 폴더 구성 확인
    kc-handson-config
    ㄴ instance.tf # bastion, app 서버, web 서버 가상머신
    ㄴ lb.tf # app 서버 로드밸런서, web 서버 로드밸런서를 생성하는 데 필요한 리소스(lb, lb-pool, lb-member, lb-monitor, lb-listener)
    ㄴ network.tf # bastion 공인 IP, bastion/app/web port 정의
    ㄴ security.tf # bastion/app/web security-group 정의
    ㄴ data.tf # 클라우드 제공자에게 가져올 정보 및 사전에 필요한 클라우드 리소스(subnet, keypair ...) 정보를 정의
    ㄴ require.tf # 클라우드 프로바이더 및 테라폼 환경 정보 정의
    ㄴ variables.tf # 프로비저닝에 사용할 변수 정보 정의 (사용자 환경에 맞게 수정 필요)
    ㄴ terraform.tfvars # variables 파일에 있는 변수에 넣을 값을 지정
    ㄴ scripts
    ㄴ app-init.sh # app서버 프로비저닝에 사용할 스크립트 정의
    ㄴ bastion-init.sh # bastion호스트 프로비저닝에 사용할 스크립트 정의
    ㄴ web-init.sh # 웹서버 프로비저닝에 사용할 스크립트 정의
    ㄴtemplates
    ㄴ app-env.sh # app서버에서 spring애플리케이션 빌드 후 실행 정의
    ㄴ web-env.sh # 웹서버에서 react애플리케이션 빌드 후 실행 정의
  3. Terraform 적용: Terraform을 사용하여 작업 디렉터리를 초기화하고, 변경 사항을 미리 검토한 후, 실제로 인프라에 적용합니다.

    프로젝트 폴더 구성 확인
    terraform init # 작업 디렉터리 초기화
    terraform plan # 인프라 변경 사항 확인
    terraform apply # 인프라 변경 적용

Ansible을 사용한 인프라 자동화 과정은 Ansible로 웹서비스 인프라 자동화 튜토리얼에서 자세히 확인하실 수 있습니다.

마무리하며

인프라를 코드로 관리하는 것은 개발팀과 운영팀 간의 원활한 협업을 가능하게 하고, 인프라의 일관성과 안정성을 유지하며, 자동화를 통해 효율성을 극대화하는 데 필수적인 요소라고 생각합니다. 버전 관리와 코드 관리가 소프트웨어 개발에서 필수적이듯이, IaC는 현대의 클라우드 기반 환경에서 인프라 관리의 표준이 되어가고 있습니다. Terraform으로 웹서비스 인프라 자동화Ansible로 웹서비스 인프라 자동화 튜토리얼을 참고하여, 카카오클라우드에서 직접 인프라 자동화를 구현해 보시기 바랍니다. 이를 통해 효율적이고 일관된 인프라 관리 방법을 직접 경험하며, 보다 안정적이고 유연한 운영을 실현할 수 있기를 기대합니다.

감사합니다.