테라폼(Terraform)에 대해 알아보자

사내에서 Pub/Sub을 관리하기 위해 인프라를 코드로 관리할 수 있는 테라폼을 활용해보고자 한다. 이전에 먼저 테라폼이 무엇인지에 대해 좀 더 자세히 공부해보고자 한다.

테라폼

  • 인프라를 코드로 관리하는 도구
  • HCL(HashiCorp Configuration Language) 이라는 테라폼의 고유한 언어를 사용하여 리소스를 생성할 수 있음
  • 테라폼은 현재 인프라 상태를 추적하여, 변경된 부분만 효율적으로 업데이트할 수 있음
  • 인프라 코드를 모듈화하여 재사용할 수 있도록 지원
  • terraform plan: 변경 사항을 미리 확인
  • terraform apply: 변경 사항을 인프라에 배포

테라폼 동작 방식

테라폼의 동작 방식은 설정 파일 작성, 플랜 생성, 적용, 상태 관리 단계로 나눌 수 있다.

1. 설정 파일 작성

인프라를 정의하는 코드를 작성하는 단계이다. .tf 확장자를 사용하고, HCL 혹은 JSON 형식으로 작성한다.

  • 프로바이더: 사용할 클라우드 플랫폼 정의
  • 리소스: 실제로 생성할 인프라 리소스
  • 변수: 코드 재사용을 위한 값들

pub/sub에서 스키마를 생성하는 예시 코드를 작성해보았다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
provider "google" {
  project = var.project
}

resource "google_pubsub_schema" "test_schema_yumin" {
  name = "projects/${var.project}/schemas/test_schema_yumin"
  type = "AVRO"

  definition = <<EOF
{
  "type": "record",
  "name": "User",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int"}
  ]
}
EOF
}

2. 플랜 생성 terraform plan

설정 파일 작성 후, 플랜을 생성한다. 사용자가 정의한 코드와 현재 인프라의 상태를 비교하여 어떤 리소스를 생성/변경/삭제할 것인지 예측할 수 있다.

설정 파일을 작성할 때 variables 을 사용했다면, terraform plan 의 출력 예시는 다음과 같다.

image

여기에서 사용하고자 하는 variables 의 값을 입력하면 된다. 나는 project를 variable 로 설정했기에 아래와 같이 입력해주었다.

image

image

사진과 같이 현재 인프라 상태와 변경하고자 하는 상태의 다른점을 확인할 수 있다.

참고: variables.tf

이때 variables.tf 라는 파일을 통해 variable들을 파일로 관리할 수 있다. 위와 같이 var.project를 사용하면 shell에서 직접 값을 입력하는데 이 방버의 단점은 값이 휘발된단느 것이다.

1
2
3
4
variable "project" {
  type = string
  default = "my-project"
}

위와 같이 값을 미리 설정하면 파일을 통해 변수 값들을 관리할 수 있다. 즉, variables.tf 를 통해

  • 코드 재사용성이 높아지고,
  • 유지보수성이 강화되며,
  • 안전성과 유연성이 증가해 IaC에서 더욱 효율적이고 안전한 인프라 관리를 할 수 있다!

✳️ IaC(Infrastructure as Code)

인프라를 코드로 정의하고 자동화하여 설정, 배포, 관리를 일관되게 처리하는 방식

3. 적용 terraform apply

생성한 플랜을 바탕으로 실제 인프라에 적용하는 단계이다.

variables 를 사용하면 플랜 생성 단계와 동일하게 값을 입력해아 하고, 결과는 다음과 같이 나온다.

image

실제로 Pub/Sub에 토픽과 구독자가 생성된 것을 확인할 수 있다!

4. 상태 관리

테라폼은 리소스를 생성할 때 상태 파일(State file)을 생성하고 이를 통해 인프라의 현재 상태를 추적하고 기록한다. 상태 파일은 인프라의 실제 상태와 코드를 동기화하고 관리하는 데 매우 중요한 역할을 한다.

terraform apply 를 실행하면 상태 파일인 .tfstate.tfsate.backup 파일이 생성 혹은 갱신된다. 여기에서 인프라의 상태를 관리하는 것이다. image

  • .tfstate: 현재 관리 중인 인프라의 실제 상태
  • .tfsate.backup: 이전 실행에서의 상태 파일 백업

만약 여러 개발자가 한번에 각자의 로컬에서 한 테라폼 파일을 통해 배포한다고 가정해보자. 그러면 인프라 상태가 동기화가 되지 않거나 충돌이 발생할 수 있다.

따라서 GCS와 같은 중앙 집중식 서버를 사용하면 상태 파일이 클라우드에 저장되고, 여러 사용자가 동시에 테라폼을 사용해도 상태 파일이 동기화되고 충돌을 방지할 수 있다!

그러면 동시에 요청이 들어왔을 때 테라폼은 이를 어떻게 관리할까?

테라폼에서 apply 를 할 때, Lock을 만들어서 해당 세션만 접근 가능하게 한다. apply를 하여 Lock을 만들면, 해당 세션은 gcs에 접근할 수 있고, apply가 완료되면 요청하여 lock을 없애는다.

그러면 다음 테라폼 apply에서 lock을 만들어 apply하는 과정을 반복한다!