본문 바로가기

SYSTEM

[Terraform] Terraform 기본 및 예제

개요

인프라 구성을 코드형태로 관리하는 도구

HCL 언어로 작성이 된다.

모듈화가 가능하여 재사용 또한 가능.

기본 개념

Provider

특정 서비스에 인프라를 배포 및 구축하기 위해서 해당 특정 서비스에 대해 정의를 하는 모듈이다.

AWS, GCP, Azure 등 대중적인 클라우드 서비스 등 다양한 provider가 제공되고 있다. (https://registry.terraform.io/browse/providers?ajs_aid=b80c9fd9-90bf-46ae-a46e-0bab988deb00&product_intent=terraform )

Resource

특정 provider가 제공해주는 조작 가능한 최소 단위

AWS을 예로 어떤 리전을 선택할지, 인증에 필요한 key 설정 등을 정의할 수 있다.

output

인프라 구축이후 생성된 결과에 대해 정보를 얻을 수 있다. instance_id 등을 얻을 수 있다.

EC2 생성 terraform

vpc, subnet, keypair와 같은 것들은 인프라 팀에서 생성이 되어 있다는 가정 하에 해당 정보들을 참고해서 t2.micro 인스턴스를 띄워보자.

  • ec2_test.tf
provider "aws" {
  region = "ap-northeast-2"
}
resource "aws_instance" "example" {
    ami           = "ami-045f2d6eeb07ce8c0"
    instance_type = var.instance_type
    subnet_id = var.subnet_id
    security_groups = [ var.security_group_id ]
    key_name = var.key_name
    tags = {
        Name = var.instance_name
    }
}
  • variables.tf
variable "region" {
  default = "ap-northeast-2"
}
variable "instance_type" {
  default = "t2.micro"
}
variable "subnet_id" {
  description = "The ID of the existing Subnet"
  default = "subnet-0dbc67b8395509fe5"
}
variable "security_group_id" {
  description = "The ID of the existing Security Group"
  default = "sg-011cb69ce8921ef15"
}
variable "key_name" {
  description = "The name of the existing Key Pair"
  default     = "mcs-dev-kpair"  # 실제 키 페어 이름으로 교체하세요
}
variable "instance_name" {
  type = string
  default = "terraform-test-bk"
  description = "Instance Name"
}
  • output.tf
output "instance_id" {
  value = aws_instance.example.id
}
output "instance_public_ip" {
  value = aws_instance.example.public_ip
}

Environment 별로 다르게 세팅을 하고 싶을 경우

terraform에서 -var, -var-file 이라는 옵션이 존재. 이걸 활용해보면 좋을 것 같다는 생각이 든다. 특히 -var-file을 이용한다면 tfvars라는 파일을 각 환경에 맞게 정의를 해놓고 불러오면 될 것 같다.

## prod.tfvars

instance_name="prod-test-terraform-01"
## dev.tfvars

instance_name="dev-test-terraform-01"

입력값에 대한 validation 기능

variable 에서는 validation이라는 기능이 존재하는데, 해당 기능으로 입력 값에 대한 validation 체크를 할 수 있다.

variable "instance_name" {
  type = string
  default = "terraform-test-bk"
  description = "Instance Name"

  validation {
    condition = length(var.instance_name) > 5
    error_message = "Instance name should be longer than 5 characters"
  }
}

이 경우는 인스턴스 명은 5글자 이상이어야 하고, 미만일 경우에는 error_message를 밷어낸다 라는 정의이다.

AWS 관리 효율을 위해서 네이밍 규칙 등의 정책이 있을 경우, 해다 validation 기능을 활용하면 좋을 것 같다.

그리고 인프라 팀에서 공통 모듈을 만들고, 그 공통 모듈을 토대로 타 개발팀에서 가져와서 사용할 경우에도 저런 정책들이 있다라는 것을 안내하고 별도의 가이드 없이도 해당 정책대로 인스턴스 등 서비스들이 생성이 되도록 할 수도 있을 것 같다.