Season 1/개발

Terraform이란?

작성자 - 현우는 5살

Terraform이란?

목차

  • Terraform이란?
  • Terraform의 작동 원리
  • 기본 문법 (Basic Syntax)
  • 목차 4

 Terraform이란?

- 인프라를 위한 디지털 설계도

 

우리가 집을 짓는다고 상상해 봅시다. 과거에는 인부들이 현장에서 직접 벽돌을 하나하나 쌓으며 "여기에 창문을 내고, 저기에 문을 달자"라고 즉흥적으로 소통하며 집을 지었습니다. 하지만 이 방식은 사람마다 기억이 다르고, 나중에 똑같은 집을 다시 지으려 할 때 정확히 복제하기 어렵다는 단점이 있습니다.

테라폼(Terraform)은 집을 짓기 위한 '디지털 설계도'를 만드는 도구입니다.

  • 정의: 하시코프(HashiCorp) 사에서 만든 오픈소스 도구로, 코드(Code)로 인프라(Infrastructure)를 구축하고 관리하게 해 줍니다. 이를 IaC (Infrastructure as Code)라고 부릅니다.
  • 왜 쓸까요?
    • 자동화: AWS, Azure, Google Cloud 등의 콘솔에 들어가서 버튼을 100번 클릭해야 할 일을, 코드 실행 한 번으로 끝냅니다.
    • 일관성: "어? 어제 만든 서버랑 설정이 왜 다르지?"라는 실수가 사라집니다. 코드가 같으면 결과물도 항상 같습니다.
    • 버전 관리: 코드이기 때문에 Git 같은 도구로 "누가, 언제, 무엇을 수정했는지" 기록하고 되돌릴 수 있습니다.

 


Terraform의 작동 원리

- 테라폼을 이해하려면 '선언적(Declarative)'이라는 개념과 '상태(State)'라는 개념을 알아야 합니다.

1. 선언적 프로그래밍

프로그래밍에는 크게 두 가지 방식이 있습니다.

  • 명령형(Imperative): "냉장고 문을 열어. 달걀을 꺼내. 프라이팬을 달궈. 달걀을 깨." 
  • 선언적(Declarative): "나에게 달걀 프라이를 줘."

테라폼은 선언적입니다. 여러분은 "나는 AWS EC2 서버 1대가 필요해"라고 코드에 적기만 하면 됩니다. 그것을 어떻게 만들지, API를 어떻게 호출할지는 테라폼이 알아서 처리합니다.

2. 테라폼의 뇌, tfstate (상태 파일)

테라폼은 terraform.tfstate라는 파일을 생성하여 현재 인프라의 상태를 기록해 둡니다. 이것은 테라폼의 '기억(Memory)'입니다.

  • 여러분이 코드를 수정해서 다시 실행하면, 테라폼은 이 '기억' '여러분이 작성한 코드'를 비교합니다.
  • 그리고 "아, 기존에 서버가 있었는데 이름을 바꾸라고? 그럼 기존 것을 수정하면 되겠네"라고 판단합니다.

3. 3단계 워크플로우

테라폼은 항상 다음 3단계를 거쳐 작동합니다.

  1. Write: 원하는 인프라를 코드로 작성합니다.
  2. Plan: 테라폼이 실제로 무엇을 할지 미리 계획을 보여줍니다. (미리보기 기능)
  3. Apply: 계획된 내용을 실제로 클라우드에 적용합니다.

 

 


기본문법

- 테라폼은 HCL (HashiCorp Configuration Language)이라는 언어를 사용합니다. 개발자가 아니어도 읽을 수 있을 만큼 직관적이고 쉽습니다.

resource "aws_instance" "my_web_server" {
  ami           = "ami-0c55b159cbfafe1f0" # 어떤 OS를 쓸지 (이미지 ID)
  instance_type = "t2.micro"              # 서버의 크기 (CPU, RAM 등)
  
  tags = {
    Name = "MyFirstTerraformServer"       # 콘솔에서 보일 이름
  }
}
  • resource: "나 뭔가 만들 거야"라고 선언하는 키워드입니다.
  • aws_instance: "AWS의 인스턴스(서버)를 만들 거야" (공급자가 정해놓은 이름)
  • my_web_server: "이 코드 안에서 나는 이걸 my_web_server라고 부를 거야" (변수명)
  • { ... }: 중괄호 안에는 세부 설정(옵션)들이 들어갑니다.

마치 식당 주문서에 메뉴 " ami-0c55b159cbfafe1f0 " " MyFirstTerraformServer " { instance_type = " t2.micro "}라고 적는 것과 똑같습니다.

조금 더 자세하게 설명해드리면,

1) Provider (공급자): "누구에게 일을 시킬까?"

가장 먼저 선언해야 하는 블록입니다. 테라폼에게 "나는 AWS를 쓸 거야", "나는 Azure를 쓸 거야"라고 알려주는 역할을 합니다.

provider "aws" {
  region = "ap-northeast-2"
}
  • 역할: 클라우드 서비스 제공자(AWS, GCP, Azure 등)와의 연결 고리 설정.

2) Resource (리소스): "무엇을 만들까?"

실제 인프라를 생성하는 가장 중요한 블록입니다.

resource "aws_s3_bucket" "my_data_bucket" {
  bucket = "my-unique-bucket-name-123" 
  
  tags = {
    Name = "My Bucket"
  }
}
  • 리소스 타입 (aws_s3_bucket): 정해진 이름입니다.
  • 내부 이름 (my_data_bucket): 테라폼 코드 안에서 이 리소스를 부를 이름입니다.
  • 속성 (bucket, tags): 리소스의 세부 설정값입니다.

3) Variable (변수): "값을 갈아 끼우고 싶다면?"

코드를 수정하지 않고 상황에 따라 값을 바꾸고 싶을 때 사용합니다. 마치 엑셀의 '참조 셀'이나 프로그래밍의 '매개변수'와 같습니다.

variable "server_port" {
  description = "서버가 사용할 포트 번호"
  type        = number
  default     = 8080
}

resource "aws_security_group" "instance" {
  name = "terraform-example-instance"
  
  ingress {
    from_port   = var.server_port  
    to_port     = var.server_port
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
  • var.이름: 이렇게 작성하면 변수에 저장된 값을 가져옵니다. 나중에 포트 번호를 바꾸고 싶을 때 variable 블록만 수정하면 됩니다.

4) Output (출력): "결과를 알려줘!"

인프라 생성이 끝난 후, 중요한 정보(IP 주소, DB 접속 주소 등)를 화면에 출력하거나 다른 곳에 전달할 때 씁니다. 영수증이나 결과 리포트라고 생각하면 쉽습니다.

output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "생성된 웹 서버의 공인 IP 주소"
}
  • terraform apply 완료 후: 터미널 마지막에 public_ip = "123.45.67.89"처럼 값이 찍혀서 바로 확인할 수 있습니다.

5) Data (데이터 소스): "이미 있는 정보를 조회해줘"

새로 만드는 게 아니라, 이미 클라우드에 존재하는 정보를 읽어올 때 사용합니다. "전화번호부 검색"과 같습니다.

data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"] # Canonical (우분투 제작사 ID)

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
}

 

 


Terraform 실습

- 기본적인 terraform 구성이 되어있다는걸 가정 후에 진행하겠습니다.

provider "aws" {
  region = "us-east-1"  
}

data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"] # Canonical (우분투 제작사 공식 ID)

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
}

resource "aws_instance" "example" {
  ami           = data.aws_ami.ubuntu.id  # 위에서 찾은 최신 ID를 사용
  instance_type = "t2.micro"

  tags = {
    Name = "Terraform-Blog-Example"
  }
}

이렇게 main.tf를 제작한 후에,

terraform init

해당 명령어를 입력해주면

후에

terraform  plan

해당 파일들이 생김을 확인할 수 있습니다.

terrraform apply

성공적으로 동작함을 확인할 수 있습니다.

terraform destroy

를 통해서

성공적으로 삭제됨을 확인할 수 있습니다. 

Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.