ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 01. 왜 테라폼인가
    24년 11월 이전/Terraform Up and Running 2021. 5. 17. 22:17
    반응형

    이 문서는 책 "테라폼 설치에서 운영까지"을 읽고 작성되었습니다. 최대한 요약해서 책 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 책을 구매하시는 것을 추천드립니다. => 책 링크

    Devops란 무엇인가

    Devops의 목적은 소프트웨어를 전달하기 위한 절차와 방법을 훨씬 더 효율적으로 만드는 것이다. 잘 적용된 Devops는 서비스 개발/운영/배포에 걸리는 소요 시간과 비용을 매우 크게 절감할 수 있다. Devops의 핵심 가치는 크게 4가지가 있다.

    1. 문화
    2. 자동화
    3. 측정
    4. 공유

    이 책에서는 자동화에 대한 기술에 초점을 맞춘다.

    IaC란 무엇인가

    IaC(Infrastructure as Code)란 코드 형태로 인프라를 작성, 정의, 배포, 업데이트하는 것을 의미한다. 인프라를 관리하는 모든 것을 코드 형태로 관리하는 것이다. IaC의 종류는 크게 다음의 4가지가 있다.

    1. 애드 훅 스크립트
    2. 구성 관리 도구
    3. 서버 템플릿 도구
    4. 서버 프로비전 도구

    애드 훅 스크립트는 Python, Ruby, Bash 등의 스크립트 언어로, 인프라를 관리하는 것이다. 모든 IaC의 기본이라고 보면 된다. 매우 큰 장점은 도입하기가 쉽다는 것이다. 반면에 개발자/운영자 역량에 따라 코드 품질, 구조가 매우 상이하다는 단점이 있다.

     

    구성 관리 도구에는 Ansible, Puppet, Chef 등의 기술들이 있다. 서버에 소프트웨어를 설치/관리하는 목적으로 사용한다. 최근에는 마스터만 있어도 운영 가능한 Ansible이 가장 핫하다. 이들이 애드 훅 스크립트보다 좋은 점은 다음과 같다.

    • 명확하고 동일한 코딩 규칙
    • 멱등성
    • 분산형 구조

    간단하게 말하면 애드 훅 스크립트는 소규모, 단발성에 좋고 구성 관리 도구는 대규모 분산 환경에 알맞은 기술이라고 보면 된다.

     

    서버 템플릿 도구에는 Docker, Packer, Vargrant 등의 기술이 있다. 쉽게 설명하면, 설치 구성품이 저장된 서버의 스냅샷을 이미지로 만들어서 서버 생성 시에 이 이미지를 이용하는 것이다. 서버의 이미지는 크게 가상 머신과 컨테이너로 구분할 수 있다. 서버 템플릿 도구는 Immutable Infrastrucutre를 만드는데 필수 불가결한 기술이며, 함수형 프로그래밍처럼 가변적인 변수를 제거하여 항상 값을 불변으로 유지하는 것이 큰 특징이다.

     

    서버 템플릿 도구만으로는 구성 관리 도구를 모두 대체할 수 없다. 서버 프로비전 도구와 함께여야 비로소 대체가 가능하다. 서버 프로비전 도구는 서버 자체를 구성하기 위한 도구로써 Terraform, CloudFormation 등의 기술이 있다. 인스턴스는 물론, 데이터베이스, 네트워크, 서브넷 등 여러 인프라 요소들을 구성할 수 있다.

     

    이것은 지극히 나의 생각인데 자신의 회사가 AWS 종속적인 회사라면, AWS에서 제공하는 서버 템플릿 도구인 Image Builder, 서버 프로비전 도구인 CloudFormation을 통해서 Immutable Infrastrucutre를 구성하는 것이 좋다. 반면 여러 인프라 기술이 혼합된 경우, 하이브리드 형태라면 서버 템플릿 도구는 Packer, 서버 프로비전 도구는 Terraform 조합으로 인프라스트럭처를 구성하는 것이 좋다.

     

    이젠 IaC의 장점을 알아보자. 책에 나온 장점은 다음과 같다.

    1. 셀프 서비스
    2. 속도와 안정성
    3. 문서화
    4. 버전 관리
    5. 확인 및 검사
    6. 재사용성

    IaC로 배포 작업을 자동화하게 되면 개발자가 원하는 시점에 배포할 수 있으며, 컴퓨팅 리소스가 배포하기 때문에 수작업보다 빠르고 안전하게 배포가 가능하다. 또한 코드이기 떄문에 그 자체로 문서화가 된다고 볼 수 있으며, 변경 사항과 커밋 이력이 남기 때문에 버전 관리도 할 수 있다. 코드 리뷰를 통해서 변경되는 인프라스트럭처를 확인할 수 있고 모듈 형태로 재사용할 수가 있다. 개인적으로 IaC는 그냥 코드가 갖는 장점을 모두 가져간다라고 보면 될 것 같다.

    Terraform의 장점

    다른 IaC도구 특히, Ansible과 같은 설정 관리 도구에 비해서 Terraform이 갖는 장점은 다음과 같다.

    1. 선언형 언어이다.
    2. 마스터/에이전트가 아니다.

    요즘은 정말 많은 곳에서 MSA를 도입하고 있다. MSA에 적절한 인프라스트럭처는 바로 Immutable Infrastructure이다. 이에 적절한 언어는 바로 선언형 언어이다. Ansible과 같은 구성 관리 도구는 보통 절차형 언어라고 보면 된다. 처음 인프라스트럭처를 구성할 때는 구성 관리 도구와 서버 프로비전 도구는 동일한 결과를 나타낸다. 하지만 그 다음부터가 복잡하다. 이 예를 한 번 살펴보자. 만약 인프라스트럭처의 10대의 서버가 필요하다고 해보자.

     

    Ansible의 경우는 다음 코드로 그 구성을 할 수 있다.

    - ec2:
        count: 10
        image: ami-40d28157
        instance_type: t2.micro

    Terraform은 다음과 같이 구성할 수 있다.

    resource "aws_instance" "example" {
        count = 10
        ami = "ami-40d28157"
        instance_type = "t2.micro"
    }

    근데 5대를 추가해야 한다고 해보자 Ansible은 다음과 같이 코드를 업데이트 해야 한다.

    - ec2:
        count: 5              # 이미 10대가 있으니까 나머지 5대
        image: ami-40d28157
        instance_type: t2.micro

    Terraform은 다음과 같이 코드를 업데이트한다.

    resource "aws_instance" "example" {
        count = 15
        ami = "ami-40d28157"
        instance_type = "t2.micro"
    }

    여기서 중요한 점은 Terraform은 구성될 인프라스트럭처의 "최종 결과"를 선언한다는 것이다. Ansible의 경우에는 변경 이력을 모두 알고 있어야 원하는 인프라스트럭처 구성을 할 수 있다. 만약 자신은 10대라고 생각하고 5대를 추가했는데 이미 누군가 2대를 추가하면 어떨 것 같은가? 이러한 변경 이력을 모르면 결국 리소스 낭비가 이루어진다는 것이다. 이런 점에서 Terraform은 매우 큰 장점을 가지고 있다.

     

    또한 마스터/에이전트 구조가 아니다. 따라서 서버를 나눌 필요도 없으며 모든 서버에 설치할 필요도 없다. 일반적으로는 (Terraform을 설치해서 인프라스트럭처를 관리하는 용도의 서버를 1대 두는 듯 하다.) 구성 관리 도구는 Ansible을 제외한 나머지 기술들은 모두 마스터 서버와 각 서버들에 에이전트를 설치해야 한다. 이는 운영하는데 복잡도를 높이는 한 요인이 된다. Terraform은 운영 면에서도 구성 관리 도구에 비해 쉽다는 장점을 갖게 된다.

     

    뭐 매우 큰 커뮤니티라는 장점이 있긴 한데 IaC 기술 중에서는 비교적 가장 최신의 기술이기 때문에(아직 1.x도 안됐다..) 덜 성숙했다는 단점이 더 커서 이는 생략한다.

    728x90
Designed by Tistory.