소개
Terraform은 HashiCorp에서 개발한 오픈 소스 IaC(Infrastructure as Code) 도구입니다. 선언적 구성 언어를 사용하여 데이터 센터 인프라를 정의하고 프로비저닝할 수 있습니다. 즉, 구성 파일에 원하는 인프라 상태를 기술하면, Terraform이 해당 상태를 맞추기 위해 리소스를 생성, 업데이트 또는 삭제하는 방법을 결정합니다.
Terraform의 핵심 워크플로우는 다음 세 단계로 구성됩니다.
- Write(작성): 코드로 인프라를 정의합니다.
- Plan(계획): 변경 사항을 적용하기 전에 미리 확인합니다.
- Apply(적용): 인프라를 프로비저닝하고 관리합니다.
이번 실습에서는 아주 간단한 리소스인 로컬 파일을 생성하며 이 전체 워크플로우를 따라가 봅니다. local 프로바이더를 사용하면 클라우드 제공업체의 자격 증명 없이도 Terraform의 작동 원리를 쉽게 배울 수 있습니다. 파일을 정의하고, 생성을 계획하고, 변경 사항을 적용한 뒤 결과를 확인해 보겠습니다.
main.tf에 local_file 리소스 정의하기
이 단계에서는 Terraform 구성 파일에 리소스를 정의하는 것부터 시작합니다. 모든 Terraform 구성은 .tf 확장자로 끝나는 파일에 작성됩니다. 기본 구성 파일은 일반적으로 main.tf라고 명명합니다.
resource 블록은 인프라 객체를 선언하기 위한 기본 구문입니다. 특정 유형(예: local_file)의 리소스를 지정된 로컬 이름(예: example)으로 정의합니다. 유형과 이름의 조합은 모듈 내에서 고유해야 합니다.
먼저 nano 텍스트 편집기를 사용하여 ~/project 디렉터리에 main.tf 파일을 엽니다.
nano main.tf
이제 파일에 다음 코드를 추가합니다. 이는 local_file 유형의 리소스를 정의하고 example이라는 로컬 이름을 부여합니다. 현재 리소스 블록은 비어 있는 상태입니다.
resource "local_file" "example" {
}
코드를 추가한 후 Ctrl+X, Y, Enter를 차례로 눌러 파일을 저장하고 nano를 종료합니다.
리소스 블록에 파일 이름과 내용 지정하기
이 단계에서는 리소스 블록에 인수를 추가하여 생성하려는 파일의 속성을 지정합니다. 인수는 리소스 블록 내부에서 구성을 정의하는 키-값 쌍입니다. local_file 리소스에서 가장 중요한 두 가지 인수는 filename과 content입니다.
filename: 생성될 파일의 경로입니다.content: 파일에 기록될 내용입니다.
nano를 사용하여 main.tf 파일을 다시 엽니다.
nano main.tf
local_file 리소스 블록을 수정하여 아래와 같이 filename 및 content 인수를 포함합니다.
resource "local_file" "example" {
content = "Hello, Terraform!"
filename = "${path.module}/hello.txt"
}
여기서 우리는 Terraform에게 현재 프로젝트 디렉터리에 hello.txt라는 파일을 생성하도록 지시하고 있습니다. ${path.module}은 현재 모듈의 경로(이 경우 ~/project)로 해석되는 특수한 Terraform 표현식입니다. 파일의 내용은 "Hello, Terraform!"이라는 문자열이 됩니다.
Ctrl+X, Y, Enter를 눌러 파일을 저장하고 nano를 종료합니다.
Terraform 초기화 및 변경 사항 미리보기
이 단계에서는 먼저 Terraform 프로젝트를 초기화한 다음 terraform plan 명령을 실행하여 실행 계획을 생성합니다.
변경 사항을 계획하기 전에 프로젝트를 초기화해야 합니다. terraform init 명령은 구성을 스캔하고, 필요한 프로바이더(이 경우 local_file)를 다운로드하며, 백엔드를 설정합니다.
터미널에서 먼저 terraform init을 실행합니다.
terraform init
초기화가 성공적으로 완료되면 terraform plan을 실행합니다. 이 명령은 변경 사항을 "드라이 런(dry run)"으로 보여주므로 Terraform 워크플로우에서 매우 중요한 부분입니다. 실제로 변경을 수행하지 않고도 Terraform이 인프라에 어떤 작업을 할지 미리 보여줍니다. 이를 통해 적용하기 전에 의도한 작업을 검토하고 확인할 수 있습니다.
terraform plan
Terraform은 구성 파일을 읽고 현재 인프라 상태(현재는 비어 있음)와 비교합니다. 그런 다음 작업 계획을 표시합니다. 하나의 리소스가 생성될 것임을 나타내는 아래와 유사한 출력을 확인할 수 있습니다.
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
## local_file.example will be created
+ resource "local_file" "example" {
+ content = "Hello, Terraform!"
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
resource "local_file" "example" 옆의 + 기호는 이 리소스가 생성될 것임을 의미합니다. 출력 내용은 새 파일에 설정될 모든 속성을 상세히 보여줍니다.
terraform apply를 실행하여 리소스 생성하기
이 단계에서는 terraform apply 명령을 사용하여 변경 사항을 적용하고 실제로 파일을 생성합니다. 이 명령은 terraform plan 출력에서 제안된 작업을 실행합니다.
기본적으로 terraform apply는 계획을 다시 보여주고 진행하기 전에 대화형 확인을 요청합니다. 실습이나 자동화에 유용한 비대화형 모드로 실행하려면 -auto-approve 플래그를 사용할 수 있습니다.
터미널에서 다음 명령을 실행합니다.
terraform apply -auto-approve
이제 Terraform이 계획을 실행합니다. 출력에는 계획이 다시 표시된 후 적용 진행 상황이 나타납니다. 완료되면 확인 메시지가 표시됩니다.
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
## local_file.example will be created
+ resource "local_file" "example" {
+ content = "Hello, Terraform!"
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
local_file.example: Creating...
local_file.example: Creation complete after 0s [id=42086c02e03bf671ddf621ed9922f52f2c7a605c]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
"Apply complete!" 메시지는 Terraform이 구성 파일에 정의된 대로 리소스를 성공적으로 생성했음을 확인해 줍니다.
파일 시스템에서 생성된 파일 확인하기
마지막 단계에서는 Terraform이 지정한 대로 로컬 파일 시스템에 파일을 성공적으로 생성했는지 확인합니다. local_file 리소스를 사용했으므로 결과물은 프로젝트 디렉터리에 실제 파일로 존재하게 됩니다.
먼저 ls 명령을 사용하여 현재 디렉터리의 파일 목록을 확인합니다. Terraform 구성 파일과 함께 hello.txt가 생성된 것을 볼 수 있습니다.
ls
예상 출력:
hello.txt main.tf terraform.tfstate
다음으로 cat 명령을 사용하여 새로 생성된 hello.txt 파일의 내용을 표시합니다.
cat hello.txt
main.tf에 정의한 내용이 출력되어야 합니다.
Hello, Terraform!
이는 Terraform 구성이 성공적으로 적용되었으며, 코드에 정의한 대로 리소스가 정확히 생성되었음을 의미합니다.
요약
축하합니다! 첫 번째 Terraform 프로젝트를 성공적으로 완료했습니다.
이번 실습을 통해 Terraform의 핵심 워크플로우를 배웠습니다.
- Write(작성):
main.tf구성 파일에local_file리소스를 정의했습니다. - Plan(계획):
terraform plan을 사용하여 변경 없이 파일 생성을 미리 확인했습니다. - Apply(적용):
terraform apply를 사용하여 계획을 실행하고 로컬 파일 시스템에 파일을 생성했습니다.
이 간단한 로컬 파일 생성 예제는 IaC의 핵심적인 힘을 보여줍니다. 구성 파일에 리소스의 원하는 상태를 선언하면, Terraform이 해당 상태를 달성하기 위한 논리를 처리합니다. 이러한 원리는 클라우드의 가상 머신, 네트워크, 데이터베이스와 같은 더 복잡한 인프라를 관리할 때도 동일하게 적용됩니다.



