IaC(Infrastructure as Code)

Terraform 소개 및 간단하게 다루어보기

cwchoiit 2024. 3. 5. 11:52
728x90
반응형
SMALL
728x90
SMALL

 

Terraform 소개

Terraform으로 본격적으로 인프라를 코드로 관리하기 앞서 알고 가야할 기본 내용들이 존재한다.

우선 핵심이 되는 흐름인 "Write" - "Plan" - "Apply"에 대해서 알아보자.

 

Write

Write는 리소스를 정의하는 단계이다. 테라폼이 읽을 수 있는 언어로 여러 클라우드 프로바이더 중 내가 원하는 클라우드 프로바이더에 이것 저것 인프라를 구축하기 위해 필요한 리소스를 작성하고 설계하는 단계

Plan

Plan은 Write 단계에서 작성한 리소스에 대한 정의를 가지고 어떻게 만들어질 것인가를 알려주는 단계이다. "무언가가 생겨나거나 지워지거나 등 이렇게 구성될 것이다."에 대한 내용을 보여주는 단계

Apply

Apply는 Plan에서 보여준 내용을 실제로 적용하는 단계

 

이 세 가지 핵심 흐름을 이해하면 된다.

 

그리고 Provider라는 개념과 Module이라는 개념이 존재하는데 Provider는 위에서 말한 것처럼 클라우드 프로바이더를 의미한다. 

Provider는 AWS, GCP, Azure, Kubernetes 등 여러 프로바이더가 있고 이 중 내가 원하는 프로바이더에 대한 인프라를 코드로 구성할 수 있게 된다. Module은 인프라에 대한 리소스 그룹을 말한다. 예를 들어, AWS에서 EC2를 만들어 낼 때 이 인스턴스에 대한 여러 구성이 있을 것이다. Security group, EBS Volume 등. 이 각각의 리소스를 하나의 모듈로 그룹화해서 만들어 놓으면 다음에 같은 구성을 만들 때 이 모듈을 가져다가 사용할 수 있게 된다.

 

다음 링크에서 Provider와 Module을 구경할 수 있다.

 

Terraform Registry

 

registry.terraform.io

 

대표적인 Providers는 다음 사진과 같다.

 

Module도 둘러보면 사람들이 미리 만들어놓은 자주 사용되는 리소스 구성에 대한 그룹(Module)을 볼 수도 있다.

https://registry.terraform.io/browse/modules

 

Terraform Registry

 

registry.terraform.io

 

 

Workspace

Terraform에서 Workspace는 하나의 프로젝트 단위라고 보면 된다. 근데 이제 프로젝트 규모가 커지면 인프라 전체를 하나의 워크스페이스에서 관리하던 것이 분리될 수 있다. 예를 들면 인프라 전체를 다루던 워크스페이스가 Network Workspace, Account Workspace, Service Workspace 등등 분리가 가능해질 수 있다. 

 

이제 기본적인 내용은 다 다루어봤으니 코드를 작성해보자.

 

 

main.tf

일반적으로 이러한 이름의 파일로 시작하곤 한다. 가장 먼저 Provider를 지정해야 하는데 많은 프로바이더가 있지만 간단하게 알아보는 시간이니까 Local Provider를 이용한다. Local Provider는 그냥 현재 본인의 PC라고 생각하면 된다. 하단 링크는 Local Provider에 대한 링크이다.

 

Terraform Registry

 

registry.terraform.io

해당 링크에 들어가서 보면 우측 "USE PROVIDER" 버튼이 있다. 클릭해보면 코드가 나온다.

이 코드를 main.tf 파일에 작성하자.

그리고 그 옆 "Documentation" 버튼을 클릭하면 좌측에 Resources, Data Sources 두 개가 있다.

Resources는 어떤 리소스를 만드는데 필요한 부분, Data Sources는 Resources를 만들 때 필요한 데이터가 있을 수 있다. 그 때 사용하는 부분이다. 쉽게 보면 Data Sources는 데이터를 읽는 부분이고 Resources는 그 데이터를 쓰는 부분이라고 생각하면 되겠다.

 

Provider의 Resources

Resources에 local_file 섹션으로 들어가보자. 이러한 예시가 있다.

resource "local_file" "foo" {
  content  = "foo!"
  filename = "${path.module}/foo.txt"
}

 

 

여기서 path.module은 현재 main.tf 파일이 위치한 경로를 의미한다. 그래서 main.tf 파일이 위치한 경로에 foo.txt 파일이라는 의미가 된다. 그 파일에 "foo!" 라는 텍스트를 넣는것으로 보여진다. 

 

이 내용까지 main.tf 파일에 작성해보자. 

#main.tf

provider "local" {
}

resource "local_file" "foo" {
    content = "Hello World!"
    filename = "${path.module}/foo.txt"
}

 

이렇게 작성한 다음 명령어를 입력.

terraform init

 

다음과 같이 나와야 한다.

 

저 문구가 알려주는대로 이제 다음 명령어를 입력해보자. 

terraform plan

 

근데 terraform 계속 쓰는게 길고 여간 귀찮은 작업이 아니다. 그래서 다음과 같이 alias를 붙일 수 있다.

alias tf=terraform

 

plan 명령어를 수행하면 다음과 같이 어떤 것이 생성되고 변경되고 삭제될지 보여준다.

 

결과를 보면 local_file.foo가 생성될 것이라고 알려주고 있고, content는 "Hello World!"라고 되어 있다. 파일의 권한은 어떻게 만들어지는지 등 여러 정보를 알려주면서 하단 Plan: 1 to add, 0 to change, 0 to destroy. 라고 써져있다. 그래서 이렇게 plan 명령어로 어떤 일이 일어날지 알 수 있다. 

 

이제 알았으니 apply 명령어를 수행해보자.

tf apply

 

apply 명령어를 수행하면 다음과 같이 plan 명령어를 입력했을 때 보여지는 부분이 한번 더 최종적으로 리뷰할 수 있게 보여지고 이 액션을 수행할 것인지를 마지막으로 묻는다. "yes"를 입력하면 이 작업이 수행된다.

 

어떤 파일이 만들어졌는지 확인해보자.

 

foo.txt 파일의 생성은 예측이 가능했다. terraform.tfstate 파일은 무엇일까? 열어보자.

이 파일은 그러니까 상태에 대한 파일이다. main.tf 파일을 수정하고 그 수정한 파일에 대해 apply를 하면서 생겨나는 이력과 상태라고 보면 될 것 같다.

 

Provider의 Data Sources

Data Sources는 위에서 잠깐 언급했지만 데이터를 가져다가 사용할 때 쓰는 것이라고 했다. 문서에 보면 다음과 같은 예시가 있다.

data "local_file" "foo" {
  filename = "${path.module}/foo.bar"
}

resource "aws_s3_object" "shared_zip" {
  bucket  = "my-bucket"
  key     = "my-key"
  content = data.local_file.foo.content
}

 

딱 봐도 foo라는 파일이 가진 내용을 데이터로 받아서 AWS S3에 업로드 하는 코드인 듯하다. 이렇게 Resource는 말 그대로 리소스를 만들어내는 부분 Data Sources는 그 만들 리소스가 필요할 때 사용하는 데이터라고 보면 된다.

 

그래서 이제 우리 main.tf 파일을 다음과 같이 변경해보자.

provider "local" {}

resource "local_file" "foo" {
    content = "Hello World!"
    filename = "${path.module}/foo.txt"
}

data "local_file" "bar" {
	filename = "${path.module}/bar.txt"
}

 

이렇게 만들었으니 이제 main.tf 파일이 있는 경로에서 bar.txt 파일을 만들어야 할 것 같다. 맞다.

#bar.txt

Hello DevOps!

 

이 상태로 apply 명령어를 실행해보자. 잘 실행될 것이다. 파일을 만들어 내는 것은 아니니까 어떠한 파일도 생성되진 않을건데 이 Data Sources의 데이터를 보고 싶으니까 main.tf 파일 하단에 다음과 같이 입력해보자.

output "file_bar" {
	value = data.local_file.bar
}

 

이 상태에서 다시 apply 명령어를 수행해보자. 다음과 같이 Outputs: 이 보여진다.

 

결론

이렇게 간단하게 Resources, Data Sources, Provider, Terraform 언어인 HCL을 다루어 보았다. 다음 포스팅부턴 이제 AWS Provider를 활용해 볼 것이다.

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

AWS + Terraform (Module)  (0) 2024.03.06
AWS + Terraform  (2) 2024.03.05
패커(Packer), Ansible 설치 및 설정  (0) 2024.03.05
Terraform 설치 및 설정하기  (2) 2024.03.05
IaC 개요  (2) 2024.03.05