Terraform에 대해 간단하게 알아보자

제훈·2024년 10월 16일

DevOps

목록 보기
7/16

Terraform

Terraform은 Infra Structure를 코드로 관리(Iac)하는 오픈 소스로 리소스와 서비스를 선언적 구성 파일로 정의하고 Provisioning한다.

Provisioning : 사용자가 요청한 IT 자원을 사용할 수 있는 상태로 준비하는 것


등장배경

2014년 HashiCorp의 Mitchell Hashimoto와 Armon Dadgar에 의해 처음 개발되었다.

클라우드 Infra Structure의 복잡성이 증가하면서 수동 관리의 한계와 일관성 유지의 어려움이 대두되었고, Terraform은 이러한 문제를 해결하기 위해 등장했다.

결국 인프라를 코드로 정의하고 버전 관리할 수 있는 도구를 통해 이러한 요구를 충족하는 툴로 빠르게 채택되어 현재는 다양한 클라우드 제공업체를 지원하는 유연성과 선언적 구문의 간결함이 주요 장점이 되었다.


장단점

장점

  • 선언적 구성: 인프라를 코드로 정의하여 가독성과 유지보수성이 높다.
  • 멀티 클라우드 지원: 다양한 클라우드 제공업체와 서비스를 단일 도구로 관리할 수 있다.
  • 상태 관리: 인프라의 현재 상태를 추적하고 관리하여 일관성을 유지한다.

단점

  • 학습 곡선: 테라폼 문법과 개념을 익히는 데 초기 시간 투자가 필요하다.
  • 제한적인 동적 구성: 일부 동적 구성이나 복잡한 로직 구현에 제한이 있을 수 있다.

주요 개념 및 WorkFlow

주요 개념

  • HCL(Hashicorp Configuration Language): 테라폼의 설정 언어이며 .tf를 사용한다.
  • 프로바이더(Provider): 테라폼과 클라우드 서비스를 연결하는 플러그인이다.
클라우드 서비스 모델프로바이더
IaaSAWS, Azure, GCP, Alibaba, Oracle Cloud
PaaSKubernetes, Docker AWS Elastic Beanstalk
SaaSGithub, GitLab, Atlassian(Jira, Confluence)

Iaas : Infrastructure as a Service
Paas : Platform as a Service
Saas : Software as a Service

  • Resource : Provider를 통해 생성/관리되는 인프라 요소
    ex. 쿠버네티스 객체 (Manifest 파일과 유사하지만 HCL 문법으로 작성), EC2 Instance, 보안 그룹 등

WorkFlow

  1. Write (작성) : 인프라를 코드로 정의
  2. Plan (계획) : 변경 사항 미리 확인
  3. Apply (적용) : 인프라에 변경 사항 적용

실제 코드로 작성하고 적용할 때 -> tf config 파일 작성 이후 init -> plan -> apply

  • 초기화(Init)
    • 명령어: transform init
    • 역할: 프로젝트 디렉토리 초기화, 필요한 프로바이더 다운로드
    • 중요성: 모든 테라폼 프로젝트의 첫 단계
  • 계획(Plan)
    • 명령어: transform plan
    • 역할: 설정 파일 분석, 변경 예정 사항 미리 보기를 통해 해당 디렉토리 이하 모든 .tf 파일 적용 가능 확인
    • 결과: 생성/수정/삭제 될 리소스 목록 제공
  • 적용(Apply)
    • 명령어: transform apply
      • 역할: 계획된 변경 사항을 실제 인프라에 적용(생성, 수정, 삭제)
    • 특징: 실행 전 최종 확인 단계 제공

활용해보기

이전 게시글에 했던 것들을 활용해 이어서 해보자.

우선 해야 할 것이 환경변수 설정을 해야 한다.

https://developer.hashicorp.com/terraform/install

눌러서 압축을 푼 뒤, C드라이브에 'terraform' 이름으로 폴더를 만든 뒤 라이센스와 실행 파일을 옮기자.

확인을 눌러준 뒤 cmd 창에서 terraform -version

잘 된 것을 볼 수 있다.


쿠버네티스했던 폴더로 가서 terra_prac 폴더 만들기

VSCode로 해당 폴더를 연 뒤 main.tf 파일 만들고 아래 코드 적용

# Kubernetes 프로바이더 설정
provider "kubernetes" {
  config_path = "~/.kube/config"  # 로컬 Kubernetes 설정 파일 경로
}

# Spring Boot Deployment
resource "kubernetes_deployment" "boot002dep" {
  metadata {
    name = "boot002dep"
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "boot002kube"
      }
    }

    template {
      metadata {
        labels = {
          app = "boot002kube"
        }
      }

      spec {
        container {
          image = "jojehuni/nine_b_proj:latest"
          name  = "boot-container"
          image_pull_policy = "Always"

          port {
            container_port = 7777
          }
        }
      }
    }
  }
}

# Spring Boot Service
resource "kubernetes_service" "boot002ser" {
  metadata {
    name = "boot002ser"
  }

  spec {
    selector = {
      app = "boot002kube"
    }

    port {
      port        = 8001
      target_port = 7777
    }

    type = "ClusterIP"
  }
}

# Vue.js Deployment
resource "kubernetes_deployment" "vue002dep" {
  metadata {
    name = "vue002dep"
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "vue002kube"
      }
    }

    template {
      metadata {
        labels = {
          app = "vue002kube"
        }
      }

      spec {
        container {
          image = "jojehuni/nine_v_proj:latest"
          name  = "vue-container"
          image_pull_policy = "Always"

          port {
            container_port = 80
          }
        }
      }
    }
  }
}

# Vue.js Service
resource "kubernetes_service" "vue002ser" {
  metadata {
    name = "vue002ser"
  }

  spec {
    selector = {
      app = "vue002kube"
    }

    port {
      port        = 8000
      target_port = 80
    }

    type = "ClusterIP"
  }
}

# Ingress
resource "kubernetes_ingress_v1" "sw_camp_ingress" {
  metadata {
    name = "sw-camp-ingress"
    annotations = {
      "nginx.ingress.kubernetes.io/ssl-redirect" = "false"
      "nginx.ingress.kubernetes.io/rewrite-target" = "/$2"
    }
  }

  spec {
    ingress_class_name = "nginx"

    rule {
      http {
        path {
          path = "/()(.*)$"
          path_type = "ImplementationSpecific"
          backend {
            service {
              name = "vue002ser"
              port {
                number = 8000
              }
            }
          }
        }
        path {
          path = "/boot(/|$)(.*)$"
          path_type = "ImplementationSpecific"
          backend {
            service {
              name = "boot002ser"
              port {
                number = 8001
              }
            }
          }
        }
      }
    }
  }
}

이제 git bash 터미널 창을 열고 아래 사진과 같이 명령어를 입력해 켜져 있는 deployment와 service, ingress 들을 삭제하자.

Terraform으로 한 번에 띄우는 것을 확인하기 위해 삭제한 것이다.


terra_prac 폴더 위치에서 terraform init 명령어 실행

주의할 점
계속 terrform command not found 라는 오류가 떠서 왜 그러나 찾아봐도 방법이 나오지 않았다..

그럴 땐 VSCode 열린걸 다 끄고 다시 키면 된다.. main.tf도 꼭 저장을 하자. (이건 이미 돼 있었는데.. 안 꺼서 안 됐던 것)

terraform plan 명령어로 뷰를 확인할 수 있다.

terraform apply 를 하면 끝난다.

tf 파일 남기고 나머지를 지우는 방법은

  • rm -rf .terraform*
  • rm terraform.tfstate* 2개 명령어를 순차적으로 사용해 지울 수 있다.
profile
백엔드 개발자 꿈나무

0개의 댓글