카테고리 없음

Terraform 시작하기

개발하는 가오나시 2023. 12. 1. 11:36
  • 개발 환경(인프라)를 코드로 관리할 수 있게 해주는 오픈 소스
  • 인프라 즉 EC2같은 인스턴스, 로드벨런스, 접근 관한등의 설정을 말한다.

그러면 인프라를 세팅하는 과정을 생각해보자.

  1. 어느 클라우드 서비스를 사용할지 선택하고
  2. 해당 클라우드 서비스의 config를 이용하여
  3. 필요한 서비스 (ec2, s3) 등을 설정한다.

간단하게 생각하면 이렇게 되는데 테라폼은 어떻게 이 과정을 거치는 지 알아보자.

먼저 테라폼의 핵심적인 플로우는 다음과 같다.

  1. write - 사용할 resource들을 정의한다.
  2. plan - 테라폼이 인프라 구성체를 생성하고, 수정하고 삭제하는 실행 계획을 생성한다.
  3. apply - 테라폼이 리소스의 종속성을 지키면서 동작한다.

알아보기 앞서서 테라폼의 파일 확장자명은 .tf 되시겠다.

명칭 알아보기

테라폼의 코드를 보면 알겠지만 블럭으로 이루어져있다.

블럭타입("provider, data, resource ...") "유형" "이름" {...}

블럭타입("Module","variable" ...) "이름" {...}  

// 이렇게 두 가지로 볼 수 있겠다.

Provider.tf

이 Provider.tf는 어느 클라우드 서비스에 접근할지에 대한 정보(config 등)를 가지고 있는다.

provider "아마존 ?네이버 ? 텐센트? 오라클?" {
	rigion = "클라우스 서비스 지역",
	// aws면 access_key나 secret_key같은 정보가 들어간다.
}

Resourse

테라폼에서 resourse라고 부르는 것은 테라폼으로 생성하고 관리할 자원을 의미 하며, 보통 main.tf 등의 파일에서 사용한다. 이를 resource block이라고 한다.

resource "aws_instance" "this" {    
    ami = "사용할 ami"
    instance_type = "인스턴스 타입"
    key_name = "키페어 명"
    ebs_block_device {
        device_name = "디스크 볼륨 이름"
        volume_size = "디스크 볼륨 사이즈"
    }

    vpc_security_group_ids = [
        "vpc-그룹"
    ]

    user_data = "유저 데이터"
}

위 코드는 테라폼으로 aws의 ec2 인스턴스를 세팅하는 코드이다. 이런 식으로 사용하게 된다.

Variables.tf (변수 선언)

테라폼으로 인프라를 세팅할 때, 고정된 값들을 사용하면 편하겠지만, 변수를 사용하는게 그렇지 않은가. 하나를 수정하려고 하니 다 찾아서 고쳐야하는 수고를 덜게하는 효과도 있는 것 처럼 테라폼도 변수를 지원한다.

# variables.tf 

variable "instance_name" {
	description = "이 변수에 대한 설명이다."
	type        = "변수의 타입이다."
	default     = "변수의 값"
}

이렇게 variables.tf파일에 선언한 변수는

# main.tf

module ec2 {
  instance_name = var.instance_name
}

이렇게 가져와서 사용할 수 있다.

Outputs.tf

테라폼이 일하고 나서 뱉어내는 결과값을 지정한다. 인스턴스를 만들었으면 퍼블릭 ip라도 알아야 접근하지 않겠는가.

# outputs.ts

output "result" {
	value = "(aws_instance 같은 리소스 명).app_server.public_ip"
}

Module

테라폼을 쓰게되면, ec2하나 s3하나 이렇게 인프라를 세팅하진 않을 것 같다.

ec2 올렸으니 올라간 인스턴스가 파일을 업로드 할 때 사용할 버킷을 만들고 인스턴스의 라우팅은 route53을 이용하고… 이런식으로 인프라는 유기적으로 구성되기 마련이다.

그렇기에 테라폼의 Module을 이용하면 그 구성들을 함께 관리할 수 있게 된다.

data "aws_vpc" "default_vpc" {
    default = true
}

module security_group {
  vpc_id = data.aws_vpc.default_vpc.id
}

module ec2 {
  sg_id = module.security_group.sg_id
}

구성하기

파일 구조

기본적인 파일구조를 짜보자

.
├── main.tf
├── modules
│    └── 모듈
│       ├── main.tf
│       ├── outputs.tf
│       └── variables.tf
├── outputs.tf
└── variables.tf

 

이렇게 폴더를 구성하고 

 

terraform plan -var="변수명=값"

 

해당 명령어로 테라폼의 계획을 설정하고 체크한다. 문제가 없으면

 

terraform apply -var="변수명=값"

 

해당 명령어로 실행한다.