새소식

DevOps/Terraform

Terraform 이란?

  • -

#terraform

Terraform

테라폼은 인프라를 선언적으로 코딩하고 위한 도구로서 마이크로서비스 아키텍처와 시스템을 빠르게 구축한다는데 장점이 있습니다.

비교

인프라를 코드로 관리하는 것은 멋진 일이지만 코드형 인프라 도구(IaC)를 선택하는 과정은 그렇지 않습니다. 가장 널리 사용되는 구성 관리 및 프로비전 도구인 테라폼, 셰프, 퍼핏, 앤서블, 솔트스택, 클라우드포메이션 등을 비교 해보도록 하겠습니다.

 

구성관리 vs 프로비저닝

세프, 퍼핏, 앤서블 등은 구성 관리 도구인 반면 클라우드포메이션,테라폼은 프로비전 도구입니다. 일반적으로 사용하려는 목적에 맞는 도구를 선택하는 것이 바람직합니다.

도커와 패커 같이 서버 템플릿 도구를 이용하는 경우 대부분의 구성 관리요구가 이미 반영되어 있습니다. 도커 또는 패커 템플릿에서 이미지를 만들었다면 이미지를 실행할 인프라를 프로비저닝해야 합니다. 이럴 경우 프로비전 도구를 선택하는 것이 좋습니다.

 

 

가변 인프라 vs 불변 인프라

셰프, 퍼펫, 앤서블과 같은 구성 관리 도구는 일반적으로 가변 인프라 패러다임을 사용합합니다. 예를 들어 셰프에 새로운 버전의 OpenSSL을 설치하도록 지시하면 기존 서버에서 소프트웨어 업데이트가 실행되고 변경 사항이 적용됩니다. 시간이 지나면서 더 많은 업데이트를 적용하는데 변경 사항들을 각 서버의 고유 변경 기록에 기록합니다.

테라폼과 같은 프로비전 도구를 사용하여 도커 또는 패커에서 생성한머신 이미지를 배포하는 경우 ‘변경'이 아닌 ‘새로운 서버’로 교체하는것과 같습니다. 새 버전의 OpenSSL을 적용 하려는 경우 도커로 새 버전의 OpenSSL을 포함한 새 이미지를 작성하여 배포 하고 이전의 서버는 종료합니다.

 

 

절차적 언어 vs 선언적 언어

셰프와 앤서블은 원하는 최종 상태를 달성하는 방법을 단계별로 지정하는 절차적 스타일 코드를 권장합니다. 테라폼, 클라우드포메이션, 솔트스택, 퍼핏은 모두 원하는 최종 상태를 지정하는 선언적 방식의 코드를 권장합니다.

예를 들어 ubuntu 서버 10대가 있습니다. 5대를 늘리고 싶을 때의 앤서블 코드는 아래와 같습니다.

- ec2:
    count: 5
    image: ami-0454bb2fefc7de534 (ubuntu 20.04)
    instance_type: t2.micro

 

 

앤서블은 절차적 언어 이기 떄문에 15대라고 쓰면 15대를 업데이트해 25대가 됩니다. 이와 마찬가지로 서버의 이미지변경 또한 기존에 있었던 이미지와 비교를 해가면서 신중히 업데이트 해야합니다.

아래는 테라폼 코드입니다.

resource "aws_instance" "example" {
count = 15
ami = ami-0454bb2fefc7de534 (ubuntu 20.04)
instance_type: t2.micro
}

 

 

선언적 코드를 사용하는 테라폼의 경우 과거에 생성되었던 모든 상태를 인지하여 해당 서버를 종료 후 다시 업데이트 합니다. 서버의 이미지 변경 또한 그냥 ami를 바꿔주면 그만입니다.

이와 마찬가지로 절차적 방식을 사용하는 코드형 인프라도구에는 주요한 2가지 문제점이 있습니다.

  • 절차적 코드는 인프라의 마지막 상태 정보를 기록하고 있지 않습니다.
  • 앤서블 템플릿을 읽는 것만으로는 무엇이 배포되었는지 알 수 없습니다. 템플릿이 적용된 순서까지 알아야 무엇이 배포되었는지 알 수 있습니다.
  • 절차적 코드는 재사용 가능성을 제한힙니다.
  • 절차적 코드는 인프라의 현재 상태를 수동으로 고려해야 하기 때문에 재사용성이 본질적으로 제한됩니다. 인프라의 상태는 계속 변경 됩니다. 전에 작성한 코드는 또 다시 사용 할수 없습니다. 새롭게 업데이트 된 코드로 덮어 씌여지게 되기 때문입니다.

 

 

Terraform 의 선언적 방식을 사용하면 코드는 항상 인프라의 최신 상태를 나타냅니다. 또한 현재 상태를 수동으로 설명할 필요가 없으므로 재사용 가능한 코드를 작성하기도 쉽습니다.

 

 

마스터 서버 유무

셰프, 퍼핏, 솔트스택은 인프라 상태를 저장하고 업데이트를 배포하기 위해 마스터 서버를 실행합니다. 마스터 서버가 업데이트 내용을 모든 서버로 푸시하거나, 서버들이 주기적으로 마스터 서버에서 최신 업데이틀 가져옵니다. 마스터 서버가 있는 도구일 경우 몇가지 단점이 존재합니다.

  • 추가 인프라필요
  • 마스터 서버를 실행하려면 추가로 고가용성 및 확장성을 생각한 서버가 필요합니다.
  • 유지 관리
  • 마스터 서버를 유지, 확장, 백업, 모니터링 해야합니다.
  • 보안
  • 클라이언트가 마스터 서버와 통신 하고 있으므로 추가 포트를 사용해야 합니다. 하지만 이방법은 서버가 공격당할 가능성을 높입니다.

앤서블, 클라우드 포메이션, 테라폼은 기본적으로 마스터가 없는 도구입니다. 테라폼은 클라우드 업체가 제공하는 API를 이용하여 동작합니다. 사용자의 API키를 통해 이용할 수 있으며 추가 인프라나 추가 인증 매커니즘이 필요하지 않습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.