티스토리 뷰

인프라/Terraform

Terraform 소개

_andy_ 2022. 8. 12. 12:00

지난 포스트를 통해 macOS 로컬에 Terraform 환경을 세팅했다. 이번 포스트부터는 테라폼을 본격적으로 훑어보고, 실제 코드를 통해 IaC 환경을 구축해 본다.

 

본 포스팅은 테라폼 공식 홈페이지 ( https://www.terraform.io/ ) 에서 참조한다.

HashiCorp 는 인프라 전문 기업이며, Terraform 외에도 정말 다양한 인프라 관련 소프트웨어를 제공하고 있다.

 

Terraform by HashiCorp

Terraform is an open-source infrastructure as code software tool that enables you to safely and predictably create, change, and improve infrastructure.

www.terraform.io

 

테라폼을 이루는 키워드 세 가지

테라폼을 통해 인프라를 관리할 때 가장 핵심적으로 말하는 키워드가 Write, Plan, Apply 이다.

  • Write : 인프라 코드를 작성하고,
  • Plan : 인프라 코드를 검증하고,
  • Apply : 인프라 코드를 실제 인프라에 반영하게 된다.

 

Write

테라폼은 HCL (HashiCorp Configuration Language) 를 기반으로 코드를 작성한다. 해당 언어는 YAML 코드와 상당히 비슷한 생김새이며, 굉장히 간결하게 작성되어 복잡한 인프라를 간단하게 정의할 수 있다.

 

다음은 Terraform 공식 문서에서 발췌한 예시 코드이다.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 1.0.4"
    }
  }
}

variable "aws_region" {}

variable "base_cidr_block" {
  description = "A /16 CIDR range definition, such as 10.1.0.0/16, that the VPC will use"
  default = "10.1.0.0/16"
}

variable "availability_zones" {
  description = "A list of availability zones in which to create subnets"
  type = list(string)
}

provider "aws" {
  region = var.aws_region
}

resource "aws_vpc" "main" {
  # Referencing the base_cidr_block variable allows the network address
  # to be changed without modifying the configuration.
  cidr_block = var.base_cidr_block
}

resource "aws_subnet" "az" {
  # Create one subnet for each given availability zone.
  count = length(var.availability_zones)

  # For each subnet, use one of the specified availability zones.
  availability_zone = var.availability_zones[count.index]

  # By referencing the aws_vpc.main object, Terraform knows that the subnet
  # must be created only after the VPC is created.
  vpc_id = aws_vpc.main.id

  # Built-in functions and operators can be used for simple transformations of
  # values, such as computing a subnet address. Here we create a /20 prefix for
  # each subnet, using consecutive addresses for each availability zone,
  # such as 10.1.16.0/20 .
  cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 4, count.index+1)
}

 

 

Plan

Terraform Plan 을 통해 해당 인프라 코드가 어떠한 변화를 가져올지 확인할 수 있다.

이전 인프라 대비 변경된 인프라 코드를 비교하여, 어떠한 리소스가 추가될 것인지, 어떠한 리소스가 수정될 것인지를 콘솔에 명시적으로 표현해 줌으로써 편리하게 인프라를 관리할 수 있다.

 

 

Apply

Plan 을 통해 변경된 사항을 확인한 후, Apply 를 통해 최종적으로 변경된 인프라 구조를 실제 환경에 반영할 수 있다.

 

 

Provider Agnostic

Terraform 은 AWS 에 의존적이지 않고, 여러 플랫폼 (GCP, Azure 등) 을 지원하는 소프트웨어이다.

  • Terraform AWS 소스를 가져다 쓰게 되면 AWS 인프라를 관리할 수 있게 되고,
  • Terraform GCP 소스를 가져다 쓰게 되면 GCP 인프라를 관리할 수 있게 되고,
  • Terraform Azure 소스를 가져다 쓰게 되면 Azure 인프라를 관리할 수 있게 된다.

 

 

Terraform Registry

Terraform Registry는 Provider 와 Module 을 제공하는 서드파티 공간이다.

  • Provider 는 GCP, AWS, Azure 와 같은 Service Provider 를 의미하며, 특정 플랫폼의 프로바이더를 사용하면 해당 플랫폼에 맞는 인프라를 관리할 수 있다.
  • Module 은 인프라 리소스의 그룹 템플릿이라 정의할 수 있다. 흔히 프로그램을 만들 때 공통 모듈을 분리하여 재사용성을 최대화할 수 있듯, Module 을 사용하면 이미 정의되어 있는 리소스 템플릿을 통해 반복 작업을 줄이고 효율적인 인프라 정의를 할 수 있다.

커뮤니티에서 다른 개발자들이 만든 모듈이나 플랫폼에서 공식적으로 제공하는 리소스를 활용할 때 Terraform Registry 를 참고하면 좋다.

 

Browser Providers 버튼을 클릭하면 현재 Terraform 에서 제공되는 수많은 리소스를 확인할 수 있으며, 상세 화면에서 해당 리소스를 사용하는 방법 등 다양한 문서를 확인할 수 있다.

'인프라 > Terraform' 카테고리의 다른 글

Terraform 다루어보기 (AWS Provider)  (0) 2022.08.19
Intellij HCL 설정하기  (0) 2022.08.16
Terraform 다루어보기 (local_file)  (0) 2022.08.15
Terraform 설치 및 기본 설정  (0) 2022.08.11
Terraform 이 무엇인가?  (0) 2022.08.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함