ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2판] 01. 왜 테라폼인가
    레거시/Terraform Up and Running 2021. 8. 2. 20:01
    반응형

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

    용어 정리

    "Devops"란

    Devops는 소프트웨어를 효율적으로 전달하는 프로세스이다. 다음과 같은 핵심 가치 4가지가 존재한다.

    1. Culture
    2. Automation
    3. Measurement
    4. Sharing

    이 책은 2번, 특히 인프라스트럭처 배포 자동화에 초점을 맞춘다.

     

    "IaC"란

    IaC는 "Infrastructure As Code"의 약자로써, 코드로 인프라를 관리하는 것을 의미한다. 서버, DB, 네트워크, 로그, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 작업을 코드로 관리할 수 있다.

    다음과 같은 도구들이 존재한다.

    1. 스크립트
    2. 설정 관리 도구
    3. 서버 템플릿 도구
    4. 오케스트레이션 도구
    5. 프로비전 도구

    "IaC"의 종류

    간단하게 IaC의 종류에 대해서 알아보자.

     

    스크립트

    먼저 스크립트는 Bash, Python, Ruby, Golang 등 여러 프로그래밍 언어로 작성될 수 있으며, 인프라를 관리를 자동화하는데 최소한의 도구이다. 예를 들어 서버에 php로 작성된 코드 기반의 웹 앱을 설치하고 apache2 서버를 구동하는 작업을 자동화한다고 해보자. 다음과 같이 Bash 스크립트로 작성할 수 있다.

    #!/bin/bash
    # 패키지 업데이트
    sudo apt-get update
    
    # apache2 웹서버, php 설치
    sudo apt-get install -y php apache2
    
    # php 프로젝트 클론 /var/www/html/app 에 코드를 품.
    sudo git clone github.com/foo/php-app /var/www/html/app
    
    # 웹 서버 구동
    sudo systemctl start apache2 

    구성 관리 도구

    대표적인 구성 관리 도구는 Chef, Puppet, Ansible 등이 있다. 이들은 실행 중인 서버의 구성을 변경하는 작업을 자동화할 때 자주 사용된다. 위의 예를 Anisble로 진행해보자. 다음과 같이 playbook을 작성해서 실행하면 된다.

    - name: Update the apt-get cache
      apt:
        update_cache: yes
    
    - name: Install PHP
      apt:
        name: php
    
    - name: Install Apache
      apt:
        name: apache2
    
    - name: Git clone Repository
      git: repo=https://github.com/foo/php-app dest=/var/www/html/app
    
    - name: Start Apache
      systemd: 
        name: apache2 
        state: started

    구성 관리 도구는 다음과 같은 특징이 있다.

    1. 코드 규칙
    2. 멱등성
    3. 분산형 구조

     

    서버 템플릿 도구

    대표적인 서버 템플릿 도구로 DockerPacker가 있다. 이들은 머신 이미지를 생성할 때 주로 사용된다. 즉 apache 서버 실행 등의 작업은 템플릿 도구로 생성된 이미지를 기반으로 서버를 실행할 때가 되서야 가능하다. 그 이전까지 작업은 이 도구로 자동화할 수 있다. Packer로 위의 예를 자동화해보자.

    packer {
      required_plugins {
        amazon = {
          version = ">= 0.0.2"
          source  = "github.com/hashicorp/amazon"
        }
      }
    }
    
    source "amazon-ebs" "ubuntu" {
      ami_name      = "learn-packer-linux-aws"
      instance_type = "t2.micro"
      region        = "us-west-2"
      source_ami_filter {
        filters = {
          name                = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
          root-device-type    = "ebs"
          virtualization-type = "hvm"
        }
        most_recent = true
        owners      = ["099720109477"]
      }
      ssh_username = "ubuntu"
    }
    
    build {
      name    = "learn-packer"
      sources = [
        "source.amazon-ebs.ubuntu"
      ]
      provisioner "shell" {
          inline = [
            "sudo apt-get update",
            "sudo apt-get install -y php apache2",
            "sudo git clone github.com/foo/php-app /var/www/html/app",
          ]
        }
    }

     

    이렇게 이미지를 만든 후에 이를 기반으로 서버를 구동한 뒤 user_data 등에서 sudo systemctl restart apache2 명령어를 작성해주면 된다. 서버 템플릿 도구는 Immutable Infrastructure 구성 시 핵심 역할을 하고 있으니 같이 알아두는 것이 좋다.

     

    오케스트레이션 도구

    오케스트레이션 도구는 일반적으로 수 많은 컨테이너를 관리하는데 필요한 도구이다. 보통 Docker 같은 컨테이너 런타임(Container Runtime) 위에 Kubernetes 같은 오케스트레이션 도구를 구축해서 컨테이너들을 관리한다. 다음과 같은 기능을 가졌다.

    • 블루-그린 배포 같은 배포 전략(롤링 업데이트)
    • 컨테이너 오토스케일링
    • 트래픽 로드 밸런싱
    • 셀프 리커버리
    • 서비스 디스커버리

    Packer, Docker 등의 템플릿 도구로 컨테이너 이미지를 구성한 후 Kubernetes 설정 파일을 통해서 여러 대의 컨테이너를 배포를 할 수 있다.

     

    프로비전 도구

    프로비전 도구는 서버뿐 아니라 데이터베이스, 네트워크 등 인프라스트럭처의 형상을 구성 및 관리할 수 있다. 대표적인 도구로 Terraform, AWS Cloudformation 등이 있다. Terraform으로도 위의 예를 구성할 수 있다.

    resource "aws_instance" "example" {
      ami           = "ami-005e54dee72cc1d00" 
      instance_type = "t2.micro"
      availability_zone = "us-east-1a"
    
      user_data = <<EOF
      #!/bin/bash
      sudo apt-get update
      sudo apt-get install -y php apache2
      sudo git clone github.com/foo/php-app /var/www/html/app
      sudo systemctl start apache2 
      EOF
    }

    일반적으로 Terraform은 다음과 같은 조합으로 구성하여 인프라스트럭처를 관리한다.

    1. Terraform + Packer + Ansible
    2. Terraform + Packer + K8S

    첫 번째 방식은 기존 클라우드 인프라를 관리하는 구성이다. Packer로 서버 이미지를 만든 후, Terraform으로 인프라스트럭처를 구성한다. 그 후 실행되는 서버 설정은 Anisble을 이용해 관리하는 것이다.

     

    두 번째 방식은 최신 컨테이너 형, 클라우드 인프라를 관리하는 구성이다. PackerDocker Image를 만든 후에, Terraform으로 인프라스트럭처를 구성한다. 이 때 Kubernetes 클러스터를 구성한다. Packer에 의해 생성된 Docker Image들은 Kubernetes가 참조하여 여러 컨테이너를 오케스트레이션한다.

    "IaC"의 장점

    IaC는 다음과 같은 장점을 얻는다.

    1. 배포 프로세스 자동화
    2. 속도와 안정성
    3. 문서화
    4. 버전 관리
    5. 유효성 검증
    6. 재사용성

    원래 관리자의 영역이었던 배포 프로세스가 자동화가 되면서 그 개발자들로만으로도 배포 프로세스를 실행시킴으로써 애플리케이션 배포가 가능하게 되었다. 또한, 컴퓨터가 작업함으로 사람이 수작업으로 할 때보다 매우 정확하고 빠르게 프로세스를 수행할 수 있다. 3-6번은 "소스 코드"의 장점이다. 이를 통해서 "행복함"을 얻을 수 있다고 한다.

Designed by Tistory.