Study/테라폼

테라폼 1일차

됵이 2022. 9. 15. 17:17

서문

IaC 인프라를 코드로 배포하고 관리하는 방법

Terraform 은 해시코프 사에서 만든 오픈소스 도구 이다. 

Terraform 은 선언적 언어를 사용해서 인프라를 코드로 정의 한다. 

AWS, GCP, 마이크로 소프트 애저, 디지털 오션 같은 다양한 퍼블릭 클라우드 공급자와 

오픈스택, VMware 같은 프라이빗 클라우드와 가상화 플랫폼에서 인프라배포하고 관리한다. 

https://www.terraform.io/docs 테라폼 공식 문서

 

데브옵스 : 소프트웨어를 효율적으로 전달하는 프로세스다.

코드형 인프라 도구의 5가지 범주

  • 애드훅 스크립트 : 수행할 작업을 단계별로 나눠서 선호하는 언어로 각 단계를 코드로 정의
    • 수행할 작업을 단계별로 나누고 배시 , 루비 , 파이썬 등 선호하는 언어를 사용해서 각 단계를 코드로 정의하고 작성된 스크립트를 서버에서 수동으로 실행 하는 것
    • 애드훅 스크립트는 소규모 일회성 작업에는 적합 하지만 모든 인프라를 코드로 관리하려면 작업 목적에 맞게 설계된 코드형 인프라 도구를 사용 해야 한다. 
  • 구성 관리 도구 : 셰프, 퍼핏, 앤서블, 솔트스택
    • 코딩 규칙 : 앤서블은 문서화, 파일 레이아웃, 명확한 매개변수 , 시크릿 관리등을 포함하는 일관되고 예측 가능한 구조를 제공 이처럼 구성관리 도구에는 코딩 규칙이 있어 코드를 쉽게 탐색 할 수 있도록 도와준다. 
    • 멱동성 : 실행 횟수에 관계 없이 올바르게 동작하는 코드
      • 앤서블 롤은 설정 파일을 사용하여 아파치가 설치되지 않았을 경우에만 설치하고 아파치 웹 서버가 동작하지 않는 경우에만 동작 하도록 한다. 
    • 분산형 구조 
      • 애드훅 스크립트 : 단일 로컬 머신에서만 실행
      • 앤서블과 같은 구성 관리 도구 : 원격의 수많은 서버를 관리
  • 서버 템플릿 도구 : 구성 관리 도구의 대안 (도커 , 패커 , 베이그런트)
    • 서버 템플릿 도구를 서버 이미지(운영체제 , 소프트웨어, 파일 및 기타 필요한 내용을 포함)에 함께 담아서 스냅숏 이미지를 생성하여 코드형 인프라도구(앤서블)을 사용하여 모든 서버에 이미지를 설치 
    • 가상머신 : 하드웨어를 포함한 전체 컴퓨터 시스템을 에뮬레이트
      • 장점 : 호스트 시스템 및 다른 가상 머신 이미지와는 완전히 분리되어 개인 컴퓨터 , QA서버 , 실제 운영 환경등 모든 환경에서 정확히 동일한 방식으로 실행
      • 단점 : 하드웨어 가상화 및 다른 VM과도 완전히 분리 했기 때문에 별도의 CPU, 메모리, 리로스가 할당되는 오버헤드가 발생한다.
    • 컨테이너 : OS의 사용자 공간을 에뮬레이트 
      • 장점 : 호스트 시스템 및 다른 컨테이너와는 격리되어 개인 컴퓨터, QA서버, 실제 운영 환경 등 모든 환경에서 정확히 동일하게 실행 
      • 단점 : 단일 서버에서 실행되는 모든 컨테이너가 해당 서버의 OS 커널과 하드웨어를 공유 하므로 VM을 사용하는 것만큼의 격리 및 보안 수준을 달성하기가 훨씬 어려울 수 있다는 것.
      • 하지만 커널과 하드웨어가 공유 됨으로 밀리세컨드 단위로 부팅이 가능하며 CPU, 메모리에 대한 오버헤드가 없다. 
    • 서버 템플릿 도구들의 각각의 목적 
      • 패커 : 프로덕션 서버에서 직접 실행하는 이미지를 생성하는데 사용
      • 베이그런트 : MAC OS나 WINDOWS 랩톱에서 실행되는 버츄얼박스 이미지와 같이 개발 컴퓨터에서 실행되는 이미지를 만드는데 사용
      • 도커 : 개별 응용 프로그램의 이미지를 만드는데 사용
    • 불변 인프라 : 한번 배포된 서버는 다시 변경되지 않는다. 
      • 새 버전의 코드를 배포해야하는 경우 이미지를 새로 만들어 서버를 다시 배포해야한다. (배포된 부분을 관리하기 쉽다)

프로덕션 서버는 라이브 웹 사이트 또는 웹 응용 프로그램을 배포하고 호스팅하는 데 사용되는 서버 유형입니다. 프로덕션 준비 상태로 검증되기 전에 광범위한 개발 및 테스트를 거친 웹 사이트 및 웹 응용 프로그램을 호스팅합니다.

 

※하이퍼 바이저 : 호스터머신 위에 올라가는 가상 머신들을 제어하는 소프트웨어

  • 오케스트레이션 도구 (쿠버네티스, 마라톤/메소스,아마존 ECS, 도커 스웜, 노마드)
    • 쿠버네티스 : 도커 컨테이너 관리를 코드로 할 수 있다 .
      1. 서버들의 그룹을 배포 (쿠버네티스를 지원 하는 서비스 : GKE(구글), AKS(애저),EKS(아마존)
      2. 동작하는 클러스터가 있다 => 도커 컨테이너를 어떻게 실행 할 껀지 YAML 파일에 코드로 정의 
    • 함께 실행할 도커 컨테이너 그룹 : 파드(POD)

※ 클러스터(컴퓨터) : 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합

※ 클러스터(서버) :

  • 각기 다른 서버들을 하나로 묶어서 하나의 시스템같이 동작하게 함으로써 클라이언트들에게 고가용성의 서비스를 제공하는 것을 의미
  • 클러스터로 묶인 한 시스템에 장애 발생시, 정보의 제공 포인트는 클러스터로 묶인 다른 정상적인 서버로 이동된다. 서버클러스터는 사용자로 하여금 서버 기반 정보를 지속적이고 끊기지 않고 제공받을 수 있도록 한다
  • 프로비전 도구(테라폼 , 클라우드포메이션, 오픈스택 히트)
    • 데이터베이스 , 캐시, 로드밸럿너, 큐, 모니터링 , 서브넷 구성, 방화벽 설정, 라우팅 규칙 설정 , SSL 인증서 등 거의 모든 부분을 프로비저닝 할 수 있다. 

코드형 인프라의 장점 

인프라가 코드로 정의 되면 다음과 같은 배포 프로세스를 개선 할 수 있다.

  • 자급식 배포(SELF-SERVICE) : 전체 배포 프로세스를 자동화 할 수 있다. 
  • 속도와 안정성(SPEED AND SAFETY) : 사람이 배포 하는것 보다 빠르다. 수동으로 진행 할 때보다 오류가 적다
  • 문서화 (Documentation) : 인프라가 문서화 되어있어 관리자가 자리를 비워도 조직의 다른 사람이 업무를 볼 수 있다.
  • 버전 관리(Version control) : 버전업을 하여 문제가 발생 했을때 어떤 부분이 문제가 되었는지 쉽게 찾을 수 있다. 
  • 유효성 검증(Validation) : 정적 분석 프로그램에 코드를 전달하여 오류발생 위험을 줄일 수 있다. 
  • 재사용성(Reuse) : 모든 제품을 처음부터 배포하는 대신 문서화되고 검증된 파일을 일관되게 배포 가능 
  • 행복(Happiness) : 지루한 반복작업을 하지 않아도 되고 개발자가 코드 개발에 집중 할 수 있도록 제시할 수 있다. 

 

테라폼의 작동 방식 

운영체제마다 바이너리 파일이 존재하는데 Go 코드는 하나의 바이너리 파일로 컴파일 되며 terraform 이라는 명령어로 실행이 가능하다, 이 바이너리를 사용하여 랩톱이나 빌드 서버 또는 다른 어떤 컴퓨터에서든 인프라를 배포할 수 있다. 

terraform 바이너리가 aws, 애저, 구글 클라우드, 디지털 오션 , 오픈스택 등의 공급자를 대신해 API를 호출하여 리소스를 생성한다. 

 

테라폼이 어떻게 API를 호출 할까

생성하려는 인프라 정보가 담긴 텍스트로 이루어진 테라폼 구성 파일을 생성하여 API를 호출한다. ==> 코드형 인프라를 만드는 그 '코드'이다. 

테라폼 구성 파일에 서버, 데이터베이스 , 로드 밸런서, 네트워크 토폴로지 등 전체 인프라를 정의 버전관리를 할 수 있다.

'terraform apply' 명령어로 인프라를 배포 할 수 있다. 

 

테라폼과 다른 코드형 인프라 도구 비교 

고려해야할 사항들

  • 구성관리 vs 프로비저닝
    • 서버 템플릿 도구를 사용하지 않는 경우 구성관리 및 프로비전 도구를 함께 사용하는 것이 좋다.
      • 예 : 테라폼으로 서버 프로비저닝 셰프를 사용하여 각 서버를 구성  
  • 가변 인프라 vs 불변 인프라 
    • 구성 관리 도구 : 가변 인프라 
    • 프로비전 도구 : 불변 인프라  => 버전업이 되는 경우 새로운 서버를 배포하는 것과 동일
  • 절차적 언어 vs 선언적 언어
    • 절차적 언어 : 셰프, 앤서블 (원하는 최종 상태를 달성하는 방법을 단계별로 지정)
    • 선언적 언어 : 테라폼, 클라우드포메이션,솔트스택, 퍼핏, 오픈스택 히트 (원하는 최종 상태를 지정하는 선언적 ㅈ방식의 코드를 사용)
      • 선언적 언어 : 구현하려는 최종 상태를 지정하는 코드 (아래 예시는 기본 서버가 10대가 있지만 5대를 추가하는 경우)
      • AMI ID가 다른 버저의 앱을 배포 할때는 절차적 같은 경우는 선 배포 되었던 10대의 서버를 추적 하여 다른 템플릿으로 작성하여 새 버전으로 업데이터 해야하지만 선언적 접근 방식은 동일한 구성 파일에서 ami 구성만 변경 해주면 된다. 

절차적 / 선언적 

  • 마스터 서버가 있는가
    • 마스터 서버 유 : 셰프, 퍼핏, 솔트스택
    • 마스터 서버의 장점 :
      • 인프라의 상태를 살펴보고 관리할 수있는 단일한 중앙 저장소 역할
      • 백그라운드에서 지속적으로 실행되어 구성의 일관성을 유지 (누군가 서버를 변경 하더라도 마스터 서버가 되돌려 놓는다.)
    • 마스터 서버의 단점 :
      • 추가 인프라 필요 (추가 서버 또는 고가용성 및 확장성을 위해 클러스터링된 서버가 필요)
      • 유지관리 (마스터 서버를 유지 , 업그레이드 , 백업, 모니터링 및 확장 해야한다)
      • 보안 (클라이언트가 마스터 서버와 통신 , 마스터 서버가 다른 모든 서버와 통신하기 위해 추가 포트를 열어야 하는데 그만큼 공격 받을 가능성이 높아진다)
      • 크론을 사용하여 정지적으로 에이전트가 마스터서버가 아닌 버전관리 시스템에서 최신 업데이트를 가져오게 해야한다.
    • 마스터 서버 무 : 앤서블, 클라우드포메이션, 오픈스택 히트 , 테라폼 
      • 테라폼은 클라우드 업체가 제공하는 API를 이용하여 동작 
      • 앤서블을 SSH로 각 서버에 직접 연결하여 작업 
  • 에이전트가 있는가
    • 에이전트 유 : 셰프 , 퍼핏, 솔트스택 
      • 구성하려는 서버에 에이전트 소프트웨어를 설치해야한다. 
      • 에이전트 단점 
        • 부트스트랩 : 어떻게 서버를 할당하고 에이전트 소프트웨어를 설치해아할까 , 부트스트랩은 일회용 명령을 실행하여 클라우드업체가 제공하는 API로 서버로 할당하고 SSH를 통해 해당 서버에 에이전트 소프트웨어를 설치한다. 
        • 유지관리 : 마스터 - 에이전트가 동기화된 상태를 유지하도록 에이전트 소프트웨어를 정기적으로 업데이트 해줘야 한다. 
        • 보안 : 에이전트 소프트웨어가 마스터 서버 에서 구성을 가져올때 모든 서버에 아웃바운드 포트를 열어야 하는데 모든 서버에서 인바운드 포트를 열어야 하는데 이때 공격당할 가능성이 높아진다. 
    • 에이전트 무 : 앤서블, 클라우드포메이션, 테라폼 (일부는 사용중인 인프라의 일부로 이미 설치되어 있다. )
  • 커뮤니티가 크고 활성화 되어 있는가
    • 프로젝트 주변의 생태계가 기술 자체의 품질보다 사용자 경험에 더 큰 영향을 줄 수있다, 커뮤니티에는 프로젝트에 참여하는 사람 수 사용 가능한 프럴그인 수 통합 및 확장 프로그램 수 등 여러가지 도움을 준다.
  • 성숙한 기술인가 아니면 최첨단 기술인가
    • 테라폼은 다른 도구들 중에서 가장 최근에 나온 도구 이며 그만큼 성숙되지 않았다 즉 버그가 아직은 발생한다는게 가장 큰 약점이 될 수 있다. 
  • 여러 도구를 함께 사용할 것인가.
    • 각 도구들마다 장단점이 존재하며 이것을 최대로 발휘하기 위해서는 알맞은 조합으로 사용하는것이 좋다. 
    • 프로비저닝과 구성 관리 : 테라폼 , 앤서블 조합
      • 테라폼을 이용해서 기본 인프라를 배포 하고 앤서블을 이용해서 서버에 앱을 배포한다.
      • 테라폼이 서버에 태그를 추가 앤서블은 추가한 태그를 이용해서 서버를 식별하고 구성을 진행
      • 하지만 앤서블은 변경 가능한 형태로 사용하면 절차적인 요소가 많은 코드를 작성 하여 추후 관리가 어렵다.
    • 프로비저닝과 서버 템플릿 : 테라폼, 패커 
      • 패커를 이용해서 앱을 VM이미지로 패키징
      • 테라폼을 이용해서 인프라 구축 후 배포 
      • 단점 
        • VM을 구축하고 배포하는데 시간이 걸리므로 배포 속도가 늦어질 수 있다. 
        • 복잡한 배포 스크립트를 많이 작성해야할 수 있다 , 오케스트레이션 도구를 사용할 수 있다. 
    • 프로비저닝 서버템플릿 오케스트레이션 도구 
      • VM이미지 생성 : 도커, 쿠버네티스가 설치된 VM이미지를 패커를 이용해서 생성 하고 테라폼으로 배포
      • 장점 : 도커이미지가 상당히 빠르게 빌드 되고 로컬 컴퓨터에서 테스트가 가능하며 쿠버네티스의 모든 내장 기능을 사용할 수 있다. 
      • 단점 : 추가적인 인프라가 필요하므로 운영이 복잡하다.

 

'Study > 테라폼' 카테고리의 다른 글

(Azure) Azure 계정 인증  (0) 2023.03.06