terraform 이란?

bo-yoon·2022년 6월 18일
2

참고

다음 문서를 참고하였습니다.

https://www.redhat.com/ko/topics/automation/what-is-infrastructure-as-code-iac

http://www.itdaily.kr/news/articleView.html?idxno=201814

https://www.44bits.io/ko/keyword/terraform

https://docmoa.github.io/04-HashiCorp/03-Terraform/01-Information/02-hcl.html

https://bangu4.tistory.com/143


IaC 란?

인프라를 프로그래밍한다는 개념을 들어본적 있는가? IaC는 Infrastructure as Code 는 말그대로 코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말한다. IaC를 활용하면 인프라 사양을 담은 구성파일이 생성되므로 항상 동일한 구성을 프로비저닝할 수 있다. 작성한 코드 기반으로 인프라를 설계하면 같은 구성의 인프라를 동시에 1000가지도 만들 수 있다. 또한 생성된 인프라는 같은 코드 베이스로 되어 있기 때문에 동일하고, 추가적으로 변경되는 것또한 막을 수 있다.

기존의 인프라가 데이터 센터의 물리적 하드웨어 방식에서 가상화, 컨테이너, 클라우드 컴퓨팅을 통해 인프라를 관리하게 되었다. 따라서 인프라 구성요소의 수가 늘어났고, 변경 빈도 또한 많아졌다. 이에 따라 인프라를 더 효율적으로 관라히기 위해서 IaC라는 개념이 등장하게 되었다.

IaC에 대한 접근 방식은 선언적 방식과 명령형 방식 2가지가 있다.

선언적 접근 방식은 최종 결과물을 코드로 구성하여 반영하는 방식이다.

명령적 접근 방식은 순차적으로 명령을 주어서 인프라를 구성한다. 따라서 인프라를 구성할 수 있는 코드가 적힌 스크립트를 IaC 툴로 생성하는데, 이 스크립트에는 인프라를 구성할 수 있는 코드가 포함되어 있다.


DevOps 에서 IaC

DevOps 는 기존에 분리 되었던 운영 조직과 개발조직을 하나로 묶어 개발자가 자기가 개발한 소스에 대해서 운영도 한다는 하나의 방법론이다. 따라서 개발자가 운영 환경에 대한 설정을 진행 할 수 있게 되었다는 것이다.

IaC는 기존 데이터 센터에서 벗어나서 인프라 프로비저닝을 개발자가 코드로 할 수 있게 해주는 개념이다


IaC의 장점

  • 비용 절감
    • 인력 관리에 대한 비용을 줄 수 있다.
  • 배포 속도 향상
    • 배포시 필요한 인프라 스트럭처에 대해서 빠르게 구성하므로 배포에 인프라 증설으을 많이 고려할 필요가 없어 진다.
  • 오류 감소
    • 수동으로 할 때와 다르게 휴먼 에러가 줄어든다.
  • 인프라 일관성 향상
    • 같은 코드 베이스로 되어 있기 때문에 인프라 구성에 대한 일관성이 생긴다.
  • 구 변동제거

IaC 툴

  • Chef
    • 루비와 얼랭으로 작성된 형상 관리 도구로 클라우드 기반 플랫폼들과 통합하여 자동으로 새로운 머신을 프로비저닝하고 구성할 수 있다.
  • Puppet
  • Saltstack
  • Terraform
  • AWS CloudFormation

이 중 테라폼에 대해서 알아보자!


Terraform

테라폼이란 클라우드 인프라스트럭처 자동화 도구

테라폼은 하시코프에서 오픈소스로 개발중인 클라우드 인프라 스트럭처 자동화를 지양하는 IaC 도구이다.

테라폼은 go 프로그램언어로 개발되고 있고 HCL(HashiCorp Configuration Language) 와 Json 이 코드의 영역을 담당하고 있다. HCL은 Json 과 서로 잘 호환된다. 초창기에는 HashiCorp 사가 인간 친화적이며 기계 친화적인 언어를 원했고, 그 조건에 해당되는 것은 Json 이었지만 코드가 너무 길어진다는 단점이 있기 때문에 Json과 호환되는 자체 언어를 만들기로 하였다. 따라서 이 HCL언어를 통해 인프라가 코드로 표현되고 곧 코드가 인프라이기 때문에 선언적인 특징을 가지고 있다.

이렇게 코드화된 인프라는 주 목적인 자동화와 더불어 쉽게 프로비저닝하여 히스토리를 관하고 함께 작업할 수 있는 계기를 얻는다.


테라폼 기본 개념

프로비저닝

  • 어떤 프로세스나 서비스를 실행하기 위한 준비 단계
  • 프로바이더로는 aws, 구글 클라우드 플랫폼, 마이크로소프트 애저와 같은 범용 클라우드 서비스를 비롯해 깃허브, 데이터 도그와 같은 특정 기능을 제공하는 서비스, mysql, 도커와 같은 로컬 서비스를 지원한다.

Resource

  • 리소스란 특정 프로바이더가 제공해주는 조작 가능한 대상의 최소 단위

Plan

  • 테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용을 실제로 적용 가능한지 확인 하는 작업
  • 테라폼은 이를 terraform plan 명령어로 제공하며, 이를 명령어로 실행하면 어떤 리소스가 생성되고, 수정되고, 삭제될지 보여줌

Apply

  • 테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용대로 리소스를 생성, 수정, 삭제하는 일을 적용

테라폼 명령어

terraform init

테라폼 프로젝트를 초기화 한다.

테라폼은 테라폼 프로젝트를 초기화 할 때 프로바이더 설정을 보고 필요한 플러그인을 설치한다.

terraform apply

코드로 작성한 테라폼 설정을 적용하여 aws 리소스 등을 생성


terraform destroy

테라폼으로 생성된 infrastructure 삭제

terraform plan

이 파일을 저장하고 infrastructure 실제로 적용하기 전에 변경 사항 체크



테라폼 타입

  • String
  • Number
  • Bool
  • List(type)
  • Set(type)
  • Map(type)
  • Tuple

테라폼 구성 요소

provider.tf

  • 리전이나 access key, secret key 같은 프로바이더에 대해 정의
provider "aws" {
  access_key = var.AWS_ACCESS_KEY
  secret_key = var.AWS_SECRET_KEY
  region     = var.AWS_REGION
}

vars.tf

  • 각 변수에 대해 정의하는 hcl 파일
variable "AWS_ACCESS_KEY" {
}

variable "AWS_SECRET_KEY" {
}

variable "AWS_REGION" {
  default = "eu-west-1"
}

variable "AMIS" {
  type = map(string)
  default = {
    us-east-1 = "ami-13be557e"
    us-west-2 = "ami-06b94666"
    eu-west-1 = "ami-0d729a60"
  }
}

terraform.tfvar

  • 리포지토리로 커밋하고 싶지 않는 중요 정보들을 저장한다.
AWS_ACCESS_KEY = ""
AWS_SECRET_KEY = ""
AWS_RESION = ""

instance.tf

resource "aws_instance" "example" {
  ami           = lookup(var.AMIS, var.AWS_REGION, "") # last parameter is the default value
  instance_type = "t3.micro"
}
profile
개발 로그 🍎 🍎 🍎

0개의 댓글