티스토리 뷰

지난 포스트에 이어 이번 포스트부터는 본격적으로 Terraform HCL 을 활용하여 코드를 작성하고, 인프라에 반영하는 작업을 진행하겠다. 우선 테라폼 워크스페이스를 생성하고, 이후 테라폼의 핵심 워크플로우의 Write, Plan, Apply 를 진행하겠다. 또한, 테라폼 워크스페이스의 리소스를 변경 및 제거하는 방식도 알아보겠다.

테라폼 워크스페이스 (Terraform Workspace)

시작에 앞서, 테라폼 워크스페이스가 무엇인지 간단히 알아보자. 간단히 말해, 인프라를 관리하기 위한 하나의 프로젝트 단위라고 할 수 있다. 기본적으로 조직의 규모에 따라 차이가 있는데, 처음에는 소규모 서비스이다 보니 관리하는 인프라의 규모도 굉장히 작다. 이럴 때는 하나의 워크스페이스에서 모든 인프라를 관리할 수 있지만, 규모가 커지면서 인프라가 복잡해지게 되면 인프라를 나눠서 관리해야 하는 연습을 할 필요가 있다. 기업의 규모가 커짐에 따라 인프라라는 전체 워크스페이스가 있었다가, Network, Accounts, Domain, ServiceA, ServiceB 와 같이 용도에 따라 인프라를 분리하게 된다.

또한, 테라폼은 인프라를 코드로 관리할 때 변경 사항을 추적할 수 있게 된다. 변경 사항에 대한 이력을 가지고 있어야 무엇이 추가, 삭제, 변경되었는지를 알 수 있기 때문이다. 이것을 상태 (State) 라고 하는데, 이는 테라폼에서 apply를 해보면 .terraform.tfstate 라는 파일이 생성되는 것을 볼 수 있다. 이 파일에서 해당 워크스페이스 상태를 관리하는 파일이다.

 

워크스페이스 생성하기

실제로 이번 포스트에서 사용할 워크스페이스를 만들어 보자. 우선 테라폼 프로젝트를 진행할 디렉토리를 생성한다.

mkdir terraform-workspace

 

이후, 해당 디렉토리로 이동한다.

cd terraform-workspace

 

테라폼 파일은 .tf 라는 확장자를 이용하여 테라폼 코드를 작성할 수 있다.

파일 편집은 우선 vim 에디터로 진행하는데, IntelliJ, VSCode 등 에디터를 사용할 수 있다.

nvim main.tf

프로바이더 (Provider)

테라폼 코드를 작성하기에 앞서, 어떤 프로바이더 (Provider) 를 사용할지 결정해야 하는데, 이는 Provider 페이지에서 볼 수 있다.

이번 포스팅에서는 Local Provider 를 사용해볼 것이다. 해당 페이지에 접속하여 우측 상단 USE PROVIDER를 클릭하면 해당 Provider를 사용하기 위한 설정을 볼 수 있다.

모든 Provider 는 terraform 블록 안의 설정과 provider 블록을 정의하는 설정을 통해 사용하게 되는데, terraform 블록 안에는 required_providers 를 통해 해당 프로바이더의 버전을 명시할 수 있으며, 버전을 명시하지 않으면 최신 버전을 사용할 수 있다.

 

그렇다면, 다음과 같이 provider 를 선언하여 Local Provider 를 사용하는 것을 명시해 주자.

provider "local" {
}

Local Provider 를 사용하도록 설정했고, 옆의 사이드바를 보면 Resources 와 Data Sources 로 나누어지는데, Resource 는 Local Provider 를 사용하여 관리할 수 있는 리소스를 의미하며, Data Sources 는 인프라 리소스를 관리할 때 데이터를 참조하여 관리할 때 사용하는 데이터 소스를 의미한다. Data Sources 는 데이터를 읽는 용도이며, Resources 는 데이터를 쓰기 위한 용도 (새로운 리소스를 만들기 위한 용도) 라고 이해하면 된다.

 

이제 Resources > local_file 에 접속해 보자. local_file 은 주어진 컨텐츠를 기반으로 로컬 파일 시스템에 파일을 생성하는 리소스이다. Example Usage 에 local_file 을 활용하는 방법이 나와 있다.

resource 지시어를 사용하여 foo 라는 local_file 을 생성하는 것을 확인할 수 있다. 이 코드를 tf 파일에 복사하고, 다음과 같이 작성해 보자.

provider "local" {
}

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

여기에서 생소한 문법이 나오는데, resource 블록 내의 filename 의 String 안에 ${} 형태의 변수가 있는 것을 확인할 수 있다. 이를 HCL 에서 String Interpolation 문법이라고 하는데, 문자열 내에서 HCL 에서 제공하는 변수나 Context 의 값을 가져올 수 있는 목적으로 활용될 수 있다.

path.module 은 해당 파일이 위치한 디렉토리 경로를 의미한다. 그래서 main.tf 파일이 위치한 디렉토리에 foo.txt 파일에 "Hello World!" 라는 텍스트를 가지고 생성을 한다는 의미이다.

 

이제 이 코드를 실행하기 위해 추가적인 작업을 진행해 보자.

init

terraform init 을 진행하고 나면, tf 파일에 정의된 프로바이더를 설치하게 된다.

terraform init

이후 디렉토리 목록을 조회해 보면 다음과 같이 .terraform 이라는 디렉토리가 생성된다.

ls -al

.terraform 디렉토리를 조회해 보면, 다음과 같이 main.tf 파일에 명시된 캐시와 데이터를 다운로드 받아서 보관하게 된다.

tree .terraform

또한 .terraform.lock.hcl 파일은 팀에서 협업을 하거나 CI/CD 파이프라인을 구성하기 위해 필요한 파일이다. 해당 프로바이더의 해시섬을 체크하고 버전을 락킹시켜 각 작업자들이 동일한 환경에서 동일한 코드를 apply 하기 위해 사용한다.

cat .terraform.lock.hcl

 

terraform plan

Plan 을 진행하면 main.tf 파일이 어떤 변경 사항을 발생시키는지 확인할 수 있다. 마지막 줄을 통해 핵심적으로 어떤 리소스가 추가, 변경, 제거되는지 확인할 수 있다.

terraform apply

이후 실제로 terraform apply 를 진행하면 plan 에서 조회되었던 변경 사항이 최종 반영될지 묻고, yes 로 답할 시 실제로 반영되는 것을 볼 수 있다.

terraform apply

yes

이 상태에서 다시 디렉토리 리스팅을 하게 되면, foo.txt 파일이 생성된 것을 확인할 수 있다.

ls -al

또한, 해당 foo.txt 파일을 열어 보면 다음과 같이 텍스트가 저장되어 있는 것을 확인할 수 있다.

cat foo.txt

또한 해당 디렉토리에 terraform.tfstate 파일이 생성된 것을 확인할 수 있는데, 해당 리소스의 상태를 기록하고 있는 것을 확인할 수 있다. 이 파일을 통해 추후 main.tf 파일을 변경할 때 변경 사항을 확인할 수 있다.

cat terraform.tfstate

 

Data Sources

지금까지는 로컬 파일 리소스를 활용해 보았는데, Data Sources 도 활용할 수 있다. local_file Data Source 는 로컬 파일 시스템으로부터 파일의 내용을 읽어오는 데이터 소스인 것을 확인할 수 있다.

데이터 소스의 경우 리소스와는 다르게 data 라는 지시어를 사용하여 정의한다. 다음과 같이 HCL 을 작성하고, apply 를 해 보자.

provider "local" {
}

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

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

terraform apply 를 해 보면, 다음과 같이 bar.txt 파일이 없어 오류가 발생하는 것을 확인할 수 있다.

terraform apply

해당 오류를 없애기 위해 직접 bar.txt 파일을 만들고 임의의 텍스트를 넣어 보자.

cat > bar.txt
Hello DevOps!

cat bar.txt

다시 apply를 해 보면, 다음과 같이 정상적으로 수행되는 것을 확인할 수 있다.

terraform apply

Data Sources 의 경우 단순히 데이터를 읽는 것이기 때문에 인프라상 변화가 없다.

 

output

읽어들인 데이터를 확인하고 싶을 경우 output 지시어를 사용하여 결과값을 출력할 수 있다.

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

 

다시 terraform apply 를 수행하면 다음과 같이 output 을 확인할 수 있다.

이렇게 해서 기본적인 Resources 와 Data Sources 를 다루어 보았다.

다음 포스트에서는 AWS 에서 제공하는 Provider 를 다루어 보겠다.

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

Terraform 다루어보기 (AWS Provider)  (0) 2022.08.19
Intellij HCL 설정하기  (0) 2022.08.16
Terraform 소개  (0) 2022.08.12
Terraform 설치 및 기본 설정  (0) 2022.08.11
Terraform 이 무엇인가?  (0) 2022.08.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함